基于服务器日期时间的自动邮件

时间:2014-06-20 06:20:50

标签: asp.net asp.net-mvc-3 asp.net-mvc-4 scheduler

我在Asp.Net MVC工作,我的情况如下。

“员工将有特定的结束时间来完成任务,一旦完成,邮件必须自动发送给团队负责人通知。”

在某种程度上,我必须经常检查服务器日期时间和指定的结束日期时间,我的朋友建议我通过创建一个控制台调度程序来观察时间来检查数据库日期时间和每30秒的结束时间,我有任何替代方案吗?这样做而不经常检查数据库?

2 个答案:

答案 0 :(得分:2)

我建议使用Windows服务来检查时间。

  

如果不检查数据库,我还有其他选择吗?   频繁

您可以实现某种缓存机制 - 将所有任务保留在内存中并检查服务器时间 - 但是如果任务经常更新,则此缓存很快就会过时,或者您需要一种方法来将缓存与数据库同步。 / p>

所以我会用这个方法检查每x秒(30秒似乎很少,你想要通知的准确度如何?根据你的要求,也许每5分钟一次就足够了。)

答案 1 :(得分:2)

如果您知道任务的结束时间(即应该发送电子邮件的时间),那么我建议您安排一个任务来调用您的ASP.NET MVC应用程序在您需要发送电子邮件的确切时刻。这样可以避免必须“轮询”服务器。为此,我建议您查看Revalee开源项目。

Revalee是一项服务,允许您安排Web回调到您的Web应用程序。在您的情况下,您将安排一个回调,该回调将在特定时间发送电子邮件。 Revalee非常适用于离散事务操作的任务,例如发送自动电子邮件消息或更新某些数据库值(读取:不长时间运行)。通过使用Revalee,执行操作的代码将全部驻留在您的Web应用程序中。

要使用Revalee,您会:

  1. 在服务器上安装Revalee Service(Windows服务)。 Windows服务可以在源代码中找到(您可以自行编译),可以使用Revalee website中提供的预编译版本,也可以通过Chocolatey轻松安装。

  2. 在Visual Studio项目中使用Revalee客户端库。 (还有一个特定于MVC的版本。)客户端库在源代码中可用(您可以自己编译)或通过NuGet提供的预编译版本。

  3. 当你知道用户任务的结束时间时,你会注册一个未来的回调:

    private void ScheduleTaskEndEmail(int taskId)
    {
        // The DetermineTaskEndTime() method is a private method
        // (of your creation) which returns a task's end time as
        // a DateTimeOffset
        DateTimeOffset callbackTime = DetermineTaskEndTime(taskId);
    
        // The callback should at the task's end time
        Uri callbackUrl = new Uri(
                string.Format(
                        "http://mywebapp.com/Email/SendTaskEndEmail/{0}",
                        taskId
                    )
            );
    
        // Register the callback request with the Revalee service
        RevaleeRegistrar.ScheduleCallback(callbackTime, callbackUrl);
    }
    
  4. 4.当Revalee重新调用您的应用程序时,您的应用程序将执行您编写的任何操作。在Email控制器中,您的SendTaskEndEmail操作(请参阅上面的Uri)可能如下所示:

        [AllowAnonymous]
        [CallbackAction]
        public ActionResult SendTaskEndEmail(int taskId)
        {
            // TODO   1. Validate the taskId,
            //        2. Lookup the task's information, &
            //        3. Send the email message
            // ...
    
            return new EmptyResult();
        }
    

    Revalee website有完整的API参考以及有关如何安装和配置Windows服务的说明。我希望这会有所帮助。

    注意:上面的代码示例使用ScheduleCallback()的同步版本,Revalee客户端库也支持异步调用àla:

    RevaleeRegistrar.ScheduleCallbackAsync(callbackTime, callbackUrl);
    

    如果上面不清楚,Revalee服务不是外部第三方在线调度程序服务,而是在您自己的网络上安装完全控制的Windows服务。它驻留在您自己选择的Windows服务器上并在其上运行,它可以从ASP.NET MVC应用程序接收回调注册请求。

    免责声明:我是参与Revalee project的开发人员之一。但需要明确的是,Revalee是免费的开源软件(MIT license)。源代码可在GitHub上找到。