Alka ha scritto:
Temo ci sia parecchia confusione, perché stai lanciando il servizio (chiamando HostFactory.Run) all'interno del LoggingJob, che presumo sia il job da eseguire con Quartz.
La procedura da seguire per inizializzare il tutto è diversa.
Nel metodo Main() devi inizializzare entrambe le API: quella di Topshelf per agganciare la classe del tuo servizio e definire cosa fare all'avvio e all'arresto del programma.
Ciò che deve avvenire allo "start" e "stop" del servizio sono rispettivamente la configurazione dello Scheduler di Quartz e del relativo trigger a fronte dell'avvio, mentre sull'arresto del servizio puoi inserire la chiamata per lo shutdown dello Scheduler, in modo che il job non venga più considerato (sebbene la chiusura del programma dovrebbe ottenere lo stesso effetto).
Prima di testare il servizio, devi fare debugging in Visual Studio lanciando l'eseguibile come applicazione Console (è appunto uno dei vantaggi di usare Topshelf) e verificare che lo Scheduler sia inizializzato, che il job venga chiamato e che tutto funzioni.
Fossi in te, procederei per step implementando le parti sopra un po' alla volta, e verificando (banalmente stampando sulla Console, in assenza di soluzioni migliori) che ogni passaggio dia il risultato sperato (prima l'esecuzione del servizio, poi la configurazione dello schedulatore, poi l'esecuzione del job e così via).
Ciao!
Ciao, ricapitolo un attimo.
vediamo se ho compreso bene, IO ho una Classe chiamata Service Class che è colei che gestisce il Topshelf
Imports Topshelf
Public Class ServiceClass
Public Sub StartService()
WriteToEventLog("Service started")
End Sub
Public Sub StopService()
WriteToEventLog("Service stopped")
End Sub
Private Sub WriteToEventLog(ByVal Message As String)
Dim el As New EventLog("Application")
el.Source = "VSS"
Try
FileProc()
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
End Sub
End Class
successivamente ho un altra classe che invece "dovrebbe Gestire il Quartz"
Public Class LoggingJob
Implements IJob
Public Function Execute(context As IJobExecutionContext) As Task Implements IJob.Execute
Console.WriteLine("Processo Invio")
Common.Logging.LogManager.Adapter.GetLogger("LoggingJob").Info(String.Format("Logging job : {0} {1}, and proceeding to log", DateTime.Now.ToShortDateString(), DateTime.Now.ToLongTimeString()))
End Function
End Class
infine ho creto il main()
dove faccio partire il Run di TopShelf e la Sub Scheduler.
Sub Main()
Try
HostFactory.Run(
Sub(x)
x.Service(Of ServiceClass)(
Sub(s)
s.ConstructUsing(Function(name) New ServiceClass())
s.WhenStarted(Sub(tc) tc.StartService())
s.WhenStopped(Sub(tc) tc.StopService())
scheduler()
End Sub)
x.RunAsLocalSystem()
x.SetDescription("Kot FTP Application START")
' FileProc()
x.SetDisplayName("KFTP Service")
x.SetServiceName("VBService")
End Sub)
Catch se As SchedulerException
Console.WriteLine(se)
End Try
Console.WriteLine("Press any key to close the application")
Console.ReadKey()
End Sub
la sub Scheduler invece è la schedulazione
Sub scheduler()
Try
Common.Logging.LogManager.Adapter = New Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter() _
With {.Level = Common.Logging.LogLevel.Info}
' Grab the Scheduler instance from the Factory
' Dim scheduler As IScheduler = StdSchedulerFactory.GetDefaultScheduler()
Dim scheduler As IScheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult()
'GetdeScheduler().GetAwaiter().GetResult()
' and start it off
scheduler.Start()
' define the job and tie it to our HelloJob class
Dim job As IJobDetail = JobBuilder.Create(Of LoggingJob)().WithIdentity("job1", "group1").Build()
' Trigger the job to run now, and then repeat every 10 seconds
Dim trigger As ITrigger = TriggerBuilder.Create().WithIdentity("trigger1", "group1").StartNow().WithSimpleSchedule(Function(x) x.WithIntervalInSeconds(120).RepeatForever()).Build()
' Dim trigger As ITrigger = TriggerBuilder.Create().WithDailyTimeIntervalSchedule
' Tell quartz to schedule the job using our trigger
scheduler.ScheduleJob(job, trigger)
' some sleep to show what's happening
Thread.Sleep(TimeSpan.FromSeconds(60))
' and last shut down the scheduler when you are ready to close your program
scheduler.Shutdown()
Catch se As Exception
Console.WriteLine(se)
End Try
End Sub
infine il famoso FileProc è il programma(che funziona)
al lancio dell'automazione il programma funziona correttamente. non rifunziona la parte schedulata, infine quando voglio interrompere il servizio vedo che lui continua a riprocessare il programma da 0.
Allora pensavo che l'errore fosse qui:
Try
HostFactory.Run(
Sub(x)
x.Service(Of ServiceClass)(
Sub(s)
s.ConstructUsing(Function(name) New ServiceClass())
s.WhenStarted(Sub(tc) tc.StartService())
s.WhenStopped(Sub(tc) tc.StopService())
scheduler()
End Sub)
E ho provato a riformularla così,a mi va in overload la service class.
Try
HostFactory.Run(
Sub(x)
x.Service(Of ServiceClass)(
Sub(s)
s.ConstructUsing(Function(name) New ServiceClass())
s.WhenStarted(Sub(tc) tc.StartService(Scheduler))
s.WhenStopped(Sub(tc) tc.StopService())
scheduler()
End Sub)
hai qualche consiglio? sfortunatamente sono impazzito quasi tutto il fine settimana sopra il codice.