许多业务流程都要求将事件安排在未来的某个日期。 例如,在与客户进行初次销售联系之后,我们可能希望在将来某个时间安排后续电话。 EasyNetQ可以通过其未来发布功能帮助您实现此功能。 例如,我们在这里使用FuturePublish扩展方法来安排未来一个月的后续销售电话。 请注意,FuturePublish使用UTC时间。

var followUpCallMessage = new FollowUpCallMessage( .. );

bus.FuturePublish(DateTime.UtcNow.AddMonths(), followUpCallMessage);

从现在开始三个月后,EasyNetQ将发布该消息,并且FollowUpCallMessage的任何订户都将收到原始消息的副本。

FuturePublish要求EasyNetQ.Scheduler服务正在运行。

1,它是如何工作的?

当您调用bus.FuturePublish(publishDate,message)时,EasyNetQ将您的消息包装在系统消息“ScheduleMe”中并将其发布到RabbitMQ。 调度程序服务订阅此消息。 当它收到一个ScheduleMe消息时,它将其存储在其本地数据库中。 调度程序服务在其数据库中查找调度日期到期的消息,当它发现任何到期的消息时,它将原始消息从ScheduleMe消息解开并发布到总线。

2,安装调度程序服务

  1. 在SQL Server中,创建一个新的数据库EasyNetQ.Scheduler

  2. 获取EasyNetQ的源代码

    git clone git@github.com:mikehadlow/EasyNetQ.git

  3. 在Visual Studio中打开EasyNetQ.2012解决方案。 在文件夹DatabaseScripts - > EasyNetQ.Scheduler中,您可以找到许多SQL脚本。 在EasyNetQ.Scheduler数据库中打开并运行它们。 您需要首先运行CreateWorkTables.sql,其他则是存储过程脚本,并且可以按任意顺序运行。

  4. 构建解决方案。

  5. 找到\ Source \ EasyNetQ.Scheduler \ bin \ Debug并将内容复制到您选择的部署文件夹。

  6. 在文本编辑器中打开EasyNetQ.Scheduler.exe.config,并将“rabbit”和“scheduleDb”连接字符串分别指向您的RabbitMQ代理和SQL Server实例。

  7. 打开控制台窗口并将路径更改为部署EasyNetQ.Scheduler的文件夹。

  8. 运行以下命令将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(), 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的消息。 这可以防止在服务器停机时丢失信息。 一旦服务器恢复,所有符合条件的消息都将按计划交付。

11,EasyNetQ-调度事件与定时发布的更多相关文章

  1. cocos2d调度器(定时执行某函数)

    调度器(scheduler) 继承关系 原理介绍 Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或 ...

  2. Tinkphp定时发布文章的教程

    第一步:在文章表中加一个字段,用来保存定时发布的时间 假定我把这个字段设为 push_time 默认为 0 第二步:写一个方法来检查文章列表,把文章列表到时间的文章改为发布状态 //定时发布文章 pu ...

  3. 定时发布任务,在global.asax中获取文件的物理路径的方法

    如果要把一个相对路径或者虚拟路径映射道服务器的物理路径,通常会使用Server.MapPath()函数,比如将根目录下的html目录映射为物理路径:Server.MapPath("html& ...

  4. CC2540 OSAL 学习其中原理,以及 给任务 添加 一个事件(定时发送串口消息)

    参考学习大神博客: http://blog.csdn.net/feilusia/article/details/51083953 : http://blog.csdn.net/xiaoleiacmer ...

  5. wordpress自动批量定时发布插件 DX-auto-publish

    DX-auto-publish是一款wordpress自动发布插件,方便实用. 该wordpress插件的主要功能如下: 1.能够自动批量定时发布wordpress站点的草稿文章,无需每篇文章都手动设 ...

  6. C#中的事件-订阅与发布

    我们用一个简单的例子,来说明一下这种消息传递的机制. 有一家三口,妈妈负责做饭,爸爸和孩子负责吃...将这三个人,想象成三个类. 妈妈有一个方法,叫做“做饭”.有一个事件,叫做“开饭”.做完饭后,调用 ...

  7. 【JavaScript】让事件支持先发布后订阅

    之前写过一个的事件管理器,就是普通的先订阅后发布模式.但实际场景中我们需要做到后订阅的也能收到发布的消息.比如我们关注微信公众号,还是能看到历史消息的.类似于qq离线消息,我先发给你,你登录了就能收到 ...

  8. 使用call、apply和bind解决js中烦人的this,事件绑定时的this和传参问题

    1.什么是this 在JavaScript中this可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式,this 绑定的对象即函数执行的上下文环境(context). 为了帮助理解,让我 ...

  9. C# 事件 订阅与发布

    两种方式: 一: //服务器 public class Server { //服务器发布的事件 public event Action<string> MyEvent; public vo ...

随机推荐

  1. 2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析

    2017-2018-2 20155303『网络对抗技术』Exp4:恶意代码分析 --------CONTENTS-------- 一.原理与实践说明 1.实践目标 2.实践内容概述 3.基础问题回答 ...

  2. JS直接if参数的用法

    经常在JS中见一些代码直接if(参数),然后参数调用的时候是将元素自己传下去.例如下面代码: <body> <input type="text" name=&qu ...

  3. Django 利用管理器实现文章归档

    Django管理器:class Manager 管理器是Django的模型进行数据库查询的接口,Django应用的每个模型都拥有至少一个管理器.默认情况下,Django为每个模型类添加一个名为obje ...

  4. ES系列三、基本知识准备

    一.基础概念 1.索引 索引(index)是elasticsearch的一个逻辑存储,可以理解为关系型数据库中的数据库,es可以把索引数据存放到一台服务器上,也可以sharding后存到多台服务器上, ...

  5. Lucas卢卡斯定理

    当$p$为素数时 $$C_n^m\equiv C_{n/p}^{m/p}*C_{n\%p}^{m\%p}(mod\ p)$$ 设$n=s*p+q,m\equiv t*p+r(q,r<=p)$ 我 ...

  6. 脚本检测CDN节点资源是否与源站资源一致

    需求: 1.所有要检测的资源url放到一个单独文件中 2.检测cdn节点资源大小与源站文件大小是否一致 3.随机抽查几个资源,检查md5sum是否一致 4.使用多线程,可配置线程数 代码目录: hex ...

  7. PC上图标显示异常 白色框框处理方案

    步骤如下: 1.打开360安全卫士,点击图标显示异常的立即修复 2.修复完,图标就正常了 3.分析原因: 可能是我用了魔方优化大师(TweakerCube)优化了桌面快捷方式(去掉箭头)引起的,而且是 ...

  8. Android 自定义View二(深入了解自定义属性attrs.xml)

    1.为什么要自定义属性 要使用属性,首先这个属性应该存在,所以如果我们要使用自己的属性,必须要先把他定义出来才能使用.但我们平时在写布局文件的时候好像没有自己定义属性,但我们照样可以用很多属性,这是为 ...

  9. ORACLE 锁表处理,解锁释放session

    后台数据库操作某一个表时发现一直出于假死状态,可能是该表被某一用户锁定,或者后台数据库操作某一个表时发现一直出于"假死"状态,可能是该表被某一用户锁定,导致其他用户无法继续操作 - ...

  10. 基于bootstrap的基本模板

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...