2010-03-30 62 views
2

所有,我有一個自定義對象,我用VB.NET(.net 2.0)編寫。該對象實例化自己的threading.timer對象,並執行一些後臺進程,包括根據數據庫中檢測到的數據,通過smtp通過定期詢問oracle數據庫和發送電子郵件。以下是Windows服務類Windows服務難題

Public Class IncidentManagerService 
'Fakes 
Private _fakeRepoFactory As IRepoFactory 
Private _incidentRepo As FakeIncidentRepo 
Private _incidentDefinitionRepo As FakeIncidentDefinitionRepo 
Private _incManager As IncidentManager.Session 

'Real 
Private _started As Boolean = False 
Private _repoFactory As New NHibernateRepoFactory 
Private _psalertsEventRepo As IPsalertsEventRepo = _repoFactory.GetPsalertsEventRepo() 
Protected Overrides Sub OnStart(ByVal args() As String) 
    ' Add code here to start your service. This method should set things 
    ' in motion so your service can do its work. 
    If Not _started Then 
     Startup() 
     _started = True 
    End If 

End Sub 

Protected Overrides Sub OnStop() 

    'Tear down class variables in order to ensure the service stops cleanly 
    _incManager.Dispose() 
    _incidentDefinitionRepo = Nothing 
    _incidentRepo = Nothing 
    _fakeRepoFactory = Nothing 
    _repoFactory = Nothing 

End Sub 

Private Sub Startup() 
    Dim incidents As IList(Of Incident) = Nothing 
    Dim incidentFactory As New IncidentFactory 

    incidents = IncidentFactory.GetTwoFakeIncidents 
    _repoFactory = New NHibernateRepoFactory 
    _fakeRepoFactory = New FakeRepoFactory(incidents) 
    _incidentRepo = _fakeRepoFactory.GetIncidentRepo 
    _incidentDefinitionRepo = _fakeRepoFactory.GetIncidentDefinitionRepo 

    'Start an incident manager session 
    _incManager = New IncidentManager.Session(_incidentRepo, _incidentDefinitionRepo, _psalertsEventRepo) 
    _incManager.Start() 

End Sub 

End Class 

實施實驗的一點點我來到位於OnStart方法上面的代碼後的代碼。所有功能都通過了從VS2005部署到我的開發PC上的測試,但是當部署在真正的目標計算機上時,該服務將無法啓動並響應以下消息:

「本地計算機上的服務已啓動,然後停止.. 。「

我是否正在以這種正確的方式去做?如果不是,我怎麼才能在Windows服務類的範圍內最好地實現我的事件管理器。對事件管理者實施定時器似乎毫無意義,因爲這已經實現了自己的定時器...

任何幫助非常感謝。

親切的問候

的Paul J.

+0

Betcha你在服務器上的nhibernate配置是錯誤的。除此之外,拋出一些日誌記錄,以便找出導致它失敗的原因。 – Will 2010-03-30 16:25:03

+1

另外,在服務中使用計時器可能不是很好的設計。如果您的服務只按照計劃活動,那麼它應該是一個計劃任務。服務應該總是在應用程序上。 – Will 2010-03-30 16:26:26

+0

請問,該進程每兩秒輪詢數據庫以獲取新數據。我會嘗試在服務類中加入一些額外的日誌記錄,看它是否顯示任何有用的東西。感謝您的意見。 – 2010-03-31 09:23:21

回答

1

我有幾個建議。

首先,Windows服務必須能夠在設定的時間段內成功啓動(默認情況下我認爲是30秒)。您收到的錯誤消息並沒有指出這是一個問題,但您可能需要在服務的OnStart中啓動一個快速計時器,並在TimerElapsed事件處理程序中啓動啓動過程。這將保證服務每次啓動。

其次,正如在一些評論中提出的那樣,您必須將日誌記錄添加到您的應用程序。每個好的服務都應該有能力記錄一切有助於追蹤問題的東西。大多數常見的日誌記錄框架將允許您設置不同的詳細級別,因此當事情運行良好時,日誌會更小。