17B、Support for Delayed Messages Plugin 对延迟消息插件的支持

RabbitMQ延迟消息插件仍然在实验阶段。你使用这个功能要自担风险。

RabbitMQ延迟消息插件为RabbitMQ增加了新的交换器类型,允许延时消息投递。

EasyNetQ定义了新的日程类型DelayedExchangeScheduler来支持对该交换器的使用。

这样允许你像以前一样使用Future Publish接口,但除了Future Message的取消功能。因为延迟消息插件不支持消息的取消,不管你在调用FuturePublish是否指定了cancellationKey,或当你调用CancelFuturePublish方法时,将会抛出NotImplementedException异常。

下面例子展示的是:发布一个消息,这个消息会在3个月后收到这个消息。

bus = RabbitHutch.CreateBus("host=localhost", 
        x=> x.Register<IScheduler,DelayedExchangeScheduler>());

var followUpCallMessage = new FollowUpCallMessage( .. );

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

第一行代码告诉EasyNetQ使用新的日程,它支持RabbitMQ的Delayed Message Exchanges插件。下两行代码,消息被创建然后在发布时指定了投递时间是3个月后。注意:FuturePublish使用了UTC时间。

注意:使用DelayedExchangeScheduler 需要先在RabbitMQ上安装Delayed Message Plugin插件

插件安装

可以在Community Plugins page找到延迟消息插件。下载与你安装的RabbitMQ对应 .ez文件,拷贝这个文件到RabbitMQ plugin文件夹下,然后通过运行下面的命令启动之。

rabbitmq-plugins enable rabbitmq_delayed_message_exchange

这个插件要求RabbitMQ最低版本为3.4或更新版本。

它是怎么运行的

当你调用bus.FuturePublish(..)时,EasyNetQ在RabbitMQ上创建一个新的 x-delayed-message交换器和普通的交换器放在一起,并绑定起来。这个消息被发送到延迟交换器上,交换器存储这个消息,直到日程到期才去投递这个消息。就在投递时刻,这个消息会被路由到普通交换器,然后由普通交换器再投递到其绑定的队列中。

你调用Publish(..)方法,消息还是会发布到正常交换器。不会因 x-delayed-message交换器的存在而降低效率。

延迟交换器使用Mnesia来持久化消息.这样避免在服务器停机时丢失消息。在服务器恢复之后,所有符合条件的消息将会按计划日程投递。

取消Future消息

如前所述,延迟消息插件不支持消息取消,因此这个功能是不支持的。任何调用FuturePublish时指定cancellationKey,或者调用CancelFuturePublish方法,都会抛出NotImplementedException异常。

如果你需要这个功能,请按上一篇所讲的使用Scheduler 服务

英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Support-for-Delayed-Messages-Plugin

 

posted on 2017-12-06 11:11  困兽斗  阅读(521)  评论(0编辑  收藏  举报

导航