Загадка службы Windows - PullRequest
2 голосов
/ 30 марта 2010

Все, у меня есть объект Custom, который я написал с использованием VB.NET (.net 2.0).Объект создает свой собственный объект threading.timer и выполняет ряд фоновых процессов, включая периодический опрос базы данных оракула и доставку электронной почты через smtp в соответствии с данными, обнаруженными в базе данных.Ниже приведен код, реализованный в классе обслуживания 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 на моем компьютере разработки, однако при развертывании на истинном целевом компьютере служба не запускается и отвечает следующим сообщением:

"Служба на локальном компьютере запускается, а затем останавливается... "

Правильно ли я поступаю?Если нет, то как мне лучше реализовать свой диспетчер инцидентов в рамках класса обслуживания Windows.Кажется бессмысленным реализовывать таймер для менеджера по инцидентам, потому что он уже реализует свой собственный таймер ...

Любая помощь очень ценится.

С уважением

Пол Дж.

1 Ответ

1 голос
/ 02 апреля 2010

У меня есть пара предложений.

Во-первых, службы Windows должны иметь возможность успешно запускаться с установленным периодом времени (по-моему, 30 секунд по умолчанию). Получаемое сообщение об ошибке не указывает на это как на проблему, но вы можете запустить быстрый таймер в OnStart службы и запустить процедуру запуска в обработчике событий TimerElapsed. Это гарантирует, что сервис запускается каждый раз.

Во-вторых, как было предложено в некоторых комментариях, вы должны добавить запись в свое приложение. Каждый хороший сервис должен иметь возможность регистрировать ВСЕ, что будет полезно при отслеживании проблем. Большинство распространенных каркасов ведения журналов позволяют вам устанавливать разные подробные уровни, поэтому, когда дела идут хорошо, журналы меньше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...