许多业务流程都要求将事件安排在将来的某个日期。 例如,在与客户进行初次销售联系以后,咱们可能但愿在未来某个时间安排后续电话。 EasyNetQ能够经过其将来发布功能帮助您实现此功能。 例如,咱们在这里使用FuturePublish扩展方法来安排将来一个月的后续销售电话。 请注意,FuturePublish使用UTC时间。git
var followUpCallMessage = new FollowUpCallMessage( .. ); bus.FuturePublish(DateTime.UtcNow.AddMonths(3), followUpCallMessage);
从如今开始三个月后,EasyNetQ将发布该消息,而且FollowUpCallMessage的任何订户都将收到原始消息的副本。github
FuturePublish要求EasyNetQ.Scheduler服务正在运行。sql
1,它是如何工做的?数据库
当您调用bus.FuturePublish(publishDate,message)时,EasyNetQ将您的消息包装在系统消息“ScheduleMe”中并将其发布到RabbitMQ。 调度程序服务订阅此消息。 当它收到一个ScheduleMe消息时,它将其存储在其本地数据库中。 调度程序服务在其数据库中查找调度日期到期的消息,当它发现任何到期的消息时,它将原始消息从ScheduleMe消息解开并发布到总线。服务器
2,安装调度程序服务并发
在SQL Server中,建立一个新的数据库EasyNetQ.Scheduler编辑器
获取EasyNetQ的源代码性能
git clone git@github.com:mikehadlow/EasyNetQ.gitspa
在Visual Studio中打开EasyNetQ.2012解决方案。 在文件夹DatabaseScripts - > EasyNetQ.Scheduler中,您能够找到许多SQL脚本。 在EasyNetQ.Scheduler数据库中打开并运行它们。 您须要首先运行CreateWorkTables.sql,其余则是存储过程脚本,而且能够按任意顺序运行。插件
构建解决方案。
找到\ Source \ EasyNetQ.Scheduler \ bin \ Debug并将内容复制到您选择的部署文件夹。
在文本编辑器中打开EasyNetQ.Scheduler.exe.config,并将“rabbit”和“scheduleDb”链接字符串分别指向您的RabbitMQ代理和SQL Server实例。
打开控制台窗口并将路径更改成部署EasyNetQ.Scheduler的文件夹。
运行如下命令将EasyNetQ.Scheduler安装为Windows服务:
EasyNetQ.Scheduler.exe install
Configuration Result: [Success] Name EasyNetQ.Scheduler [Success] ServiceName EasyNetQ.Scheduler Topshelf v3.1.106.0, .NET Framework v4.0.30319.18051
Running a transacted installation.
Beginning the Install phase of the installation. Installing EasyNetQ.Scheduler service Installing service EasyNetQ.Scheduler... Service EasyNetQ.Scheduler has been successfully installed. Creating EventLog source EasyNetQ.Scheduler in log Application...
The Install phase completed successfully, and the Commit phase is beginning.
The Commit phase completed successfully.
The transacted install has completed.
3,支持延迟消息插件
RabbitMQ延迟消息插件将新的交换类型添加到RabbitMQ,从而容许延迟消息传递。
EasyNetQ经过定义新的调度程序类型来提供对使用该交换的支持:DelayedExchangeScheduler。
这容许您像之前同样使用相同的Future Publish接口,但取消将来的消息除外。 因为延迟消息插件不支持消息取消,所以不管什么时候调用FuturePublish指定cancelKey,或者调用CancelFuturePublish时,调度程序都会抛出NotImplementedException异常。
如下示例显示了如何发布将在三个月后交付的消息:
bus = RabbitHutch.CreateBus("host=localhost", x => x.Register<IScheduler, DelayedExchangeScheduler>()); var followUpCallMessage = new FollowUpCallMessage( .. ); bus.FuturePublish(DateTime.UtcNow.AddMonths(3), followUpCallMessage);
第一行指示EasyNetQ使用支持延迟消息交换的新调度程序。 接下来,该消息将建立并发布,交付时间设置为三个月。 请注意,FuturePublish使用UTC时间。
DelayedExchangeScheduler须要安装Delayed Message Plugin。
①插件安装
延迟消息插件能够在社区插件页面上找到。 为您的RabbitMQ安装下载相应的.ez文件,将其复制到RabbitMQ的插件文件夹中,而后经过运行如下命令启用它:
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
该插件须要RabbitMQ 3.4或更新版本。
②怎么运行的
当您调用bus.FuturePublish(...)时,EasyNetQ会自动建立新的x延迟消息交换以及正常交换并将它们绑定在一块儿。 该消息在延迟交换中发布,该交换将存储该消息,直到交付它为止。 此时,该消息被路由到正常交换并从那里到绑定队列。
当您调用Publish(...)方法时,消息将发布到正常交换,从而防止与使用新的x延迟消息交换相关的任何性能降低。
延迟交换持续使用Mnesia的消息。 这能够防止在服务器停机时丢失信息。 一旦服务器恢复,全部符合条件的消息都将按计划交付。