Servizio Windows

di il
13 risposte

Servizio Windows

Ciao a tutti,

ho scritto un Servizio Windows che si collega ad un Database MySQL.

Il servizio funziona, ma non mi si arresta (sembra vada in pausa) quando arresto il PC, mentre funziona correttamente se riavvio il PC o direttamente il servizio. Ho notato che non esegue la Sub "OnStart" all'accensione del PC, quindi penso che non si sia arrestato durante lo spegnimento.

Allego il codice che ho scritto, nella speranza di un Vs. aiuto.
Grazie

Marcello

Imports System.IO
Imports System.Timers
Public Class OutlookService

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Inserire qui il codice necessario per avviare il proprio servizio. Il metodo deve effettuare
        ' le impostazioni necessarie per il funzionamento del servizio.
        AddHandler Microsoft.Win32.SystemEvents.SessionEnded, AddressOf OnSessionEnded

        Dim swc_log As Boolean
        Dim ws_ini As New iniParser("C:\UsrPrograms\OutlookService\OutlookService.ini")
        swc_log = Boolean.Parse(ws_ini.getValue("GENERALE", "SWC_LOG"))
        ws_log = New Log(swc_log)

        ws_server = ws_ini.getValue("GENERALE", "SERVER")
        ws_username = ws_ini.getValue("GENERALE", "USER_NAME")
        ws_password = ws_ini.getValue("GENERALE", "USER_PWD")
        ws_database = ws_ini.getValue("GENERALE", "DATABASE")

        ws_OSQL = New OutlookSQL()
        If ws_OSQL.ConnectDb(ws_server, ws_username, ws_password, ws_database) Then

            ws_iniDb = New IniParserDB
            PathDocuments = ws_iniDb.getParam("GENERALE", "PATH_DOCUMENTS").getValore
            PathDropbox = ws_iniDb.getParam("GENERALE", "PATH_DROPBOX").getValore
            TempDir = ws_iniDb.getParam("GENERALE", "TEMP_DIR").getValore

            Try
                Boolean.TryParse(ws_iniDb.getParam("GENERALE", "DEBUG").getValore, swc_debug)
            Catch ex As Exception
                swc_debug = False
            End Try

            ws_timer = New Timer()
            AddHandler ws_timer.Elapsed, AddressOf OnTimedEvent
            ws_timer.Interval = CDbl(ws_iniDb.getParam("GENERALE", "INTERVAL").getValore) * 1000
            ws_timer.Enabled = True
        End If

    End Sub
    Private Sub OnSessionEnded()
        ws_log.ScriviLog("Windows Shutdown - Stop Service")
        Me.Stop()
    End Sub

    Protected Overrides Sub OnShutdown()
        Me.Stop()
    End Sub

    Protected Overrides Sub OnStop()
        ws_timer.Enabled = False

        ws_OSQL.Dispose()
        ws_OSQL = Nothing

        ws_log.Flush()
        ws_log.Dispose()
        ws_log = Nothing
    End Sub

    Private Sub OnTimedEvent()

        ws_log.ScriviLog("Try to analize files in: " & TempDir)
        For Each myFilename In Directory.GetFiles(TempDir)
            ws_log.ScriviLog("  Found file to elaborate: " & myFilename)
            Dim OutEng As New OutlookEngine(myFilename)
        Next

    End Sub

End Class

13 Risposte

  • Re: Servizio Windows

    La proprietà CanStop è a True?
  • Re: Servizio Windows

    Si, queste sono le proprietà del servizio:
    Proprietà.jpg
    Proprietà.jpg

    Grazie
  • Re: Servizio Windows

    Quindi se fermi il servizio (dall'interfaccia di Windows) risulta arrestato? Ti sei accertato (scrivendo negli eventi) che la OnStop sia eseguita?

    E come ti accorgi che non viene eseguita la OnStart con successo? E' possibile che durante la OnStart avvenga un errore?
  • Re: Servizio Windows

    Confermo che fermando il servizio dal gestore dei servizi, il servizio si arresta. Per ogni operazione fatta nelle varie funzioni scrivo un log. Mi sono accorto di un comportamento diverso nel stoppare manualmente il servizio rispetto a quando spengo e riaccendo il PC. Nella Sub OnStart eseguo la connect al DB in cui loggo la stringa di connessione e lo stato di connessione.
    Stoppando il servizio e riavviandolo, vedo queste informazioni. Accendendo il PC, no.
  • Re: Servizio Windows

    Intendi stoppandolo e accendendo il PC?
    Ma il servizio parte in modo Automatico?

    E' anche possibile che all'avio il DBMS non sia ancora partito quando il tuo servizio si avvia.
    Aggiungi al tuo servizio, come dipendenza, il servizio del DBMS
  • Re: Servizio Windows

    Penso di essermi spiegato male. Il DBMS è esterno al PC ed è sempre attivo (è installato su un Raspberry PI 4).
    Il servizio è impostato su avvio automatico e si attiva automaticamente. Quello che sta succedendo è questo:
    • Se stoppo il servizio manualmente, vedo nel log l'esecuzione della Sub "OnStart"
    • Se, a servizio attivo, spengo il PC quando lo riaccendo vedo nel log il ciclo di analisi del filesistem (Sub OnTimedEvent)
    • Se, a servizio attivo riavvio il PC, vedo il comportamento che mi aspetto: Sub "OnStart" e successivamente analisi del filesystem.
    Ho una eccezione di un programma all'arresto del PC e al riavvio (che avevo anche prima di installare il servizio). Provo a non farlo eseguire e verifico se cambia qualcosa.

    Grazie
  • Re: Servizio Windows

    Provo ad aggiungere e commentare il file di log:
    • Ore 15:46.13: ho avviato il servizio (avevo appena cancellato il log per pulizia).
    • Ore 15:46:30: ho stoppato e riavviato manualmente il servizio
    • Ore 15:46:56: ho riavviato il PC. Il servizio è ripartito alle 15:47:39: le eccezioni sono dovute alla mancanza della rete (non conosco il servizio di cui mettere la dipendenza), gestito il problema con un loop di retry
    • Ore 15:48:43: ho arrestato il PC e riacceso: alle 15:50:26 il servizio è ripartito, senza connettersi al DB
    Grazie
    [14/06/2020 15:46:13.171]: *** Avviato programma: OutlookService.exe ***
     
    [14/06/2020 15:46:13.185]: Coonection String: server=192.168.0.25;user id=outlookUser;password=ServiceOutlook!;Persist Security Info=True;database=OutlookService;Convert Zero Datetime=True
     
    [14/06/2020 15:46:13.339]: Connection state: Open
     
    [14/06/2020 15:46:13.339]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'
     
    [14/06/2020 15:46:13.339]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'"
     
    [14/06/2020 15:46:13.341]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'
     
    [14/06/2020 15:46:13.341]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'"
     
    [14/06/2020 15:46:13.341]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'
     
    [14/06/2020 15:46:13.341]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'"
     
    [14/06/2020 15:46:13.341]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'
     
    [14/06/2020 15:46:13.341]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'"
     
    [14/06/2020 15:46:13.341]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'
     
    [14/06/2020 15:46:13.341]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'"
     
    [14/06/2020 15:46:23.345]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
    [14/06/2020 15:46:30.162]: *** Terminato programma : OutlookService.exe ***
    [14/06/2020 15:46:33.808]: *** Avviato programma: OutlookService.exe ***
     
    [14/06/2020 15:46:33.820]: Coonection String: server=192.168.0.25;user id=outlookUser;password=ServiceOutlook!;Persist Security Info=True;database=OutlookService;Convert Zero Datetime=True
     
    [14/06/2020 15:46:34.089]: Connection state: Open
     
    [14/06/2020 15:46:34.089]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'
     
    [14/06/2020 15:46:34.089]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'"
     
    [14/06/2020 15:46:34.091]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'
     
    [14/06/2020 15:46:34.091]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'"
     
    [14/06/2020 15:46:34.091]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'
     
    [14/06/2020 15:46:34.091]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'"
     
    [14/06/2020 15:46:34.091]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'
     
    [14/06/2020 15:46:34.091]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'"
     
    [14/06/2020 15:46:34.093]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'
     
    [14/06/2020 15:46:34.093]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'"
     
    [14/06/2020 15:46:44.095]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:46:54.099]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:46:56.376]: Windows Shutdown - Stop Service
    [14/06/2020 15:46:56.376]: *** Terminato programma : OutlookService.exe ***
    [14/06/2020 15:47:39.533]: *** Avviato programma: OutlookService.exe ***
     
    [14/06/2020 15:47:39.551]: Coonection String: server=192.168.0.25;user id=outlookUser;password=ServiceOutlook!;Persist Security Info=True;database=OutlookService;Convert Zero Datetime=True
     
    [14/06/2020 15:47:42.714]: *** Execption *** 
    [14/06/2020 15:47:42.714]: Unable to connect to any of the specified MySQL hosts.
    [14/06/2020 15:47:42.714]:    in MySql.Data.MySqlClient.NativeDriver.Open()
       in MySql.Data.MySqlClient.Driver.Open()
       in MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
       in MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
       in MySql.Data.MySqlClient.MySqlPool.GetConnection()
       in MySql.Data.MySqlClient.MySqlConnection.Open()
       in OutlookService.MySQLDB.Connect()
    [14/06/2020 15:47:42.714]: *** END Execption *** 
     
     
    [14/06/2020 15:47:45.735]: *** Execption *** 
    [14/06/2020 15:47:45.735]: Unable to connect to any of the specified MySQL hosts.
    [14/06/2020 15:47:45.735]:    in MySql.Data.MySqlClient.NativeDriver.Open()
       in MySql.Data.MySqlClient.Driver.Open()
       in MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
       in MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
       in MySql.Data.MySqlClient.MySqlPool.GetConnection()
       in MySql.Data.MySqlClient.MySqlConnection.Open()
       in OutlookService.MySQLDB.Connect()
    [14/06/2020 15:47:45.735]: *** END Execption *** 
     
     
    [14/06/2020 15:47:48.737]: *** Execption *** 
    [14/06/2020 15:47:48.737]: Unable to connect to any of the specified MySQL hosts.
    [14/06/2020 15:47:48.737]:    in MySql.Data.MySqlClient.NativeDriver.Open()
       in MySql.Data.MySqlClient.Driver.Open()
       in MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
       in MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
       in MySql.Data.MySqlClient.MySqlPool.GetConnection()
       in MySql.Data.MySqlClient.MySqlConnection.Open()
       in OutlookService.MySQLDB.Connect()
    [14/06/2020 15:47:48.737]: *** END Execption *** 
     
     
    [14/06/2020 15:47:51.739]: *** Execption *** 
    [14/06/2020 15:47:51.739]: Unable to connect to any of the specified MySQL hosts.
    [14/06/2020 15:47:51.739]:    in MySql.Data.MySqlClient.NativeDriver.Open()
       in MySql.Data.MySqlClient.Driver.Open()
       in MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)
       in MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()
       in MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()
       in MySql.Data.MySqlClient.MySqlPool.GetConnection()
       in MySql.Data.MySqlClient.MySqlConnection.Open()
       in OutlookService.MySQLDB.Connect()
    [14/06/2020 15:47:51.739]: *** END Execption *** 
     
     
    [14/06/2020 15:47:53.842]: Connection state: Open
     
    [14/06/2020 15:47:53.842]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'
     
    [14/06/2020 15:47:53.844]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DOCUMENTS'"
     
    [14/06/2020 15:47:53.850]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'
     
    [14/06/2020 15:47:53.850]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'PATH_DROPBOX'"
     
    [14/06/2020 15:47:53.856]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'
     
    [14/06/2020 15:47:53.856]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'TEMP_DIR'"
     
    [14/06/2020 15:47:53.860]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'
     
    [14/06/2020 15:47:53.860]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'DEBUG'"
     
    [14/06/2020 15:47:53.866]: Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'
     
    [14/06/2020 15:47:53.866]: SQL Select: "Select Gruppo, Parametro, Valore From Parametri Where Gruppo = 'GENERALE' And Parametro = 'INTERVAL'"
     
    [14/06/2020 15:48:03.884]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:48:13.885]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:48:23.887]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:48:33.888]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:48:43.891]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:50:26.428]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:50:36.430]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:50:46.433]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:50:56.435]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:06.438]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:16.443]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:26.444]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:36.446]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:46.448]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
     
    [14/06/2020 15:51:56.449]: Try to analize files in: C:\UsrPrograms\OutlookService\Temp\
    
    
  • Re: Servizio Windows

    Prova ad usare

    "Automatic (Delayed Start)"

    per il tipo di start del servizio
  • Re: Servizio Windows

    Ho provato ma non è cambiato nulla.
    L'impostazione "Automatica" dovrebbe avviare anche un servizio stoppato?

    Ho provato a stopparlo, lasciando il tipo di avvio su Automatico.
    Spegnendo e riaccendendo il PC il servizio non è ripartito.
  • Re: Servizio Windows

    Non è che il servizio non riparte. Semplicemente il codice nella OnStart fallisce. Prova a ripetere la connessione nella OnStart per un certo numero di volte (ad esempio fino a 5) in caso di errore.
  • Re: Servizio Windows

    Ho provato a fare una piccola modifica per testare i vari giri:
    In testa alla OnStart ho messo la creazione di un file di testo con il timestamp nel nome.
    Stoppando e riavviando il servizio, il file mi viene creato regolarmente. Anche riavviando il PC.
    Spegnendolo e riaccendendolo, invece, il file non viene creato.
    Inoltre nello stop del servizio ho scritto nel log "*** stop OutlookService.exe ***".
    Arrestando il PC non viene scritta questa dicitura, mentre nelle altre occasioni si.
    Credo che il servizio non senta che il PC si sta arrestando e vada in Pausa riprendendo da dove era prima dell'arresto.
    Non capisco però il motivo...
  • Re: Servizio Windows

    Può anche essere che il sistema non faccia lo Shutdown ma vada in ibernazione

    Prova ad aggiungere codice per l'evento
    
    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
      { 
     
      }
     
    E non dimenticare la proprietà CanHandlePowerEvent
  • Re: Servizio Windows

    Ho provato anche quella soluzione, ma non ho risolto. Ho pensato anche alla compilazione 32/64 bit, ma non dipende da quello.
    Proverò a fare un servizio farlocco, giusto per capire se c'è qualche differenza nelle impostazioni dal mio.

    Grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte