Параллельный процесс для пробуждения и отправки оповещения по электронной почте за 72 часа до запланированного события - PullRequest
0 голосов
/ 21 июня 2011

У меня есть приложение, написанное на ASP.NET MVC 2, которое хранит дату и время запланированного события пользователя в базе данных MSSQL. Мне нужно приложение, чтобы отправить электронное уведомление пользователю за 72 часа до того, как сохраненное событие произойдет без какого-либо ручного вмешательства.

Как лучше всего реализовать этот параллельный процесс (у меня уже есть код электронной почты)?

Ответы [ 2 ]

0 голосов
/ 21 июня 2011

Если у вас есть контроль над сервером, то я, вероятно, воспользуюсь службой Windows (например, Злой Грибо сказал ).

Но, если вы этого не сделаете, я бы создал класс, возможно, похожий на класс ниже, который вы можете использовать / наследовать. Создайте экземпляр этого класса во время события Application_start в global.asax и сохраните его копию в кеше. Поместите свою логику в метод «ExecuteProcess». Ваша логика, вероятно, будет выглядеть примерно так (псевдокод):

while(true) 
   check for events that need to have notifications sent

   send any needed notifications

   wait x seconds and repeate

loop

Убедитесь, что в таблице базы данных MSSQL имеется поле для отслеживания того, было ли отправлено уведомление.

Базовый базовый класс:

Imports System.Threading

Public MustInherit Class LongRunningProcess
    Public ReadOnly Property Running() As Boolean
        Get
            Return _Running
        End Get
    End Property

    Public ReadOnly Property Success() As Boolean
        Get
            Return _Success
        End Get
    End Property

    Public ReadOnly Property Exception() As Exception
        Get
            Return _Exception
        End Get
    End Property

    Public ReadOnly Property StartTime() As DateTime
        Get
            Return _StartTime
        End Get
    End Property

    Public ReadOnly Property EndTime() As DateTime
        Get
            Return _EndTime
        End Get
    End Property

    Public ReadOnly Property Args() As Object
        Get
            Return _Args
        End Get
    End Property


    Protected _Running As Boolean = False
    Protected _Success As Boolean = False
    Protected _Exception As Exception = Nothing
    Protected _StartTime As DateTime = DateTime.MinValue
    Protected _EndTime As DateTime = DateTime.MinValue
    Protected _Args() As Object = Nothing
    Protected WithEvents _Thread As Thread

    Private _locker As New Object()

    Public Sub Execute(ByVal Arguments As Object)
        SyncLock (_locker)
            'if the process is not running, then...'
            If Not _Running Then
                'Set running to true'
                _Running = True
                'Set start time to now'
                _StartTime = DateTime.Now
                'set arguments'
                _Args = Arguments
                'Prepare to process in a new thread'
                _Thread = New Thread(New ThreadStart(AddressOf ExecuteProcess))

                'Start the thread'
                _Thread.Start()
            End If
        End SyncLock
    End Sub

    Protected MustOverride Sub ExecuteProcess()
End Class

Свойство Args предоставляет вам доступ из «ExecuteProcess» к любым аргументам / переменным, которые вам могут понадобиться.

0 голосов
/ 21 июня 2011

Если у вас есть события, хранящиеся в базе данных, я бы создал службу Windows, которая работала независимо от приложения asp.net, которое регулярно опрашивало базу данных в поисках выполняемой работы.

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