EasyNetQ使用(七)【发布者确认 ,用Future Publish发布预定中事件 】
AMQP
发布消息默认情况下是非事务性的,不能确保你的消息真正送达代理。AMQP
可以去指定事务性发布,但是RabbitMQ这样会非常慢,我们没有让EasyNetQ API
去支持此功能。为了高效的确保投递成功,RabbitMQ推荐使用'Publish Confirms'
。简单来讲,这是AMQP的一个扩展,当你的消息被代理成功接收以后,提供了一个回调支持。
成功接收意味着什么呢?
- 一个瞬态消息被确认那一刻,消息已进入队列。
- 一个持久化消息被确认时,消息会持久化到磁盘,或者每一个队列上的消息已被消费掉。
- 一个不可路由的瞬态消息被发后,就直接被确认了。
更多关于消息确认方面的内容,请看the announcement on the RabbitMQ blog.
启用消息确认,需要通过在连接字符串中设置 publisherConfirms=true
.
bus = RabbitHutch.CreateBus("host=localhost;publisherConfirms=true;timeout=10");
异步的bus.Publish(..)
方法在返回之前会等待消息确认。在超时之前(超时时间同样被配置在连接字符串中),消息确认会无失效,这将引起异常抛出。在异步发布方法上启用发布者确认将明显变慢。如果有性能上的担心,你应该考虑使用PublishAsync
方法。
bus.PublishAsync(new MyMessage
{
Text = "Hello World"
}).ContinueWith(task =>
{
// 这里仅仅检测task已完成
// IsCompleted 为true,如果task在故障状态中,
// 应该使用 if (task.IsCompleted && !task.IsFaulted) 去检测是否成功。
if (task.IsCompleted)
{
//Console.Out.WriteLine("{0} Completed", count);
}
if (task.IsFaulted)
{
Console.Out.WriteLine("\n\n");
Console.Out.WriteLine(task.Exception);
Console.Out.WriteLine("\n\n");
}
});
在收到确认消息之前,这将会返回。如果没有确认消息,或者收到一个NACK
确认信息,这个task
在失败状态下将会执行完成。
很多商业流程需要事件在未来的时间按照预定时间发布。例如,在初次与客户接触后,可以在未来某个时间去电话回访客户。EasyNetQ
可以用它的Future Publish
功能帮你实现这个功能。举例:这里我们使用FuturePublish
扩展方法去预定未来一个月后打销售回访电话。注意:FuturePublish
使用UTC
时间。
var followUpCallMessage = new FollowUpCallMessage(..);
bus.FuturePublish(DateTime.UtcNow.AddMonths(1),followUpCallMessage);
从现在开始一个月后,这个消息通过EasyNetQ
将会发布这个消息,任何FollowUpCallMessage
的订阅者将接收到一个原始消息拷贝。
FuturePublish
需要EasyNetQ.Scheduler
服务处于运行中状态。
它是如何运作的?
当你调用bus.FuturePublish(publishDate,Message)
时,EasyNetQ
包装这个消息到一个系统消息'ScheduleMe'
中,然后发布这个消息到RabbitMQ
。这个调度服务订阅这个消息。当它接收到一个ScheduleMe
消息时,它会存储这个消息到它的本地数据库中,这个调度服务去数据库查询日程日期到期的消息,当有任何消息到期时,它会从这个ScheduleMe
消息中解开原始的消息,然后发送消息到事件总线。
安装调度服务
- 在
SQL Server
中,创建一个名称为EasyNetQ.Scheduler
的数据库。 - 获取
EasyNetQ
源码
git clone git@github.com:mikehadlow/EasyNetQ.git - 在
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.
现在你应该能够调用FuturePublish
方法,在指定时间到来时,你会收到消息。
卸载EasyNetQ.Scheduler
,运行:
EasyNetQ.Scheduler.exe uninstall
EasyNetQ使用(七)【发布者确认 ,用Future Publish发布预定中事件 】的更多相关文章
- 14-EasyNetQ之用Future Publish发布预定中事件
很多商业流程需要事件在未来的时间按照预定时间发布.例如,在初次与客户接触后,可以在未来某个时间去电话回访客户.EasyNetQ可以用它的Future Publish功能帮你实现这个功能.举例:这里我们 ...
- 【EasyNetQ】- 使用Future Publish调度事件
许多业务流程要求在将来某个日期安排事件.例如,在与客户进行初次销售联系后,我们可能希望在将来的某个时间安排跟进电话.EasyNetQ可以通过其Future Publish功能帮助您实现此功能.例如,这 ...
- 13-EasyNetQ之发布者确认
AMQP发布消息默认情况下是非事务性的,不能确保你的消息真正送达代理.AMQP可以去指定事务性发布,但是RabbitMQ这样会非常慢,我们没有让EasyNetQ API去支持此功能.为了高效的确保投递 ...
- RabbitMQ (十二) 消息确认机制 - 发布者确认
消费者确认解决的问题是确认消息是否被消费者"成功消费". 它有个前提条件,那就是生产者发布的消息已经"成功"发送出去了. 因此还需要一个机制来告诉生产者,你发送 ...
- Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...
- redis subscribe/publish(发布订阅)
redis的发布端 package dubbo.wangbiao.project.pubsub; import org.apache.commons.pool2.impl.GenericObjectP ...
- 【转】npm publish 发布
<h3 class="catListTitle">一.npm包结构(编写)</h3> npm包实际是一个存档文件,即一个目录直接打包为.zip或tar.gz ...
- 码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布
码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布 1.对于写作你最头疼什么 对于大多数码字工作者来说,随时随地记录灵感,构思文章,集中书写,其实是一件令人 ...
- npm publish 发布
前言 我们npm publish发布的时候,一定是本地文件发布到远程仓库,并且登录到http://registry.npmjs.org(即npm adduser或npmlogin)之后,才可以进行发布 ...
随机推荐
- MySQL查询去重
方法一: distinct select count(distinct CName) from Course 方法二: 使用分组 group by select count(1) from Cours ...
- 洛谷P2396 yyy loves Maths VII【状压dp】
题目:https://www.luogu.org/problemnew/show/P2396 题意:有n个数,每次选择一个表示走$a[i]$步,每个数只能选一次. 最多有两个厄运数字,如果走到了厄运数 ...
- Luogu P4198 楼房重建 (李超线段树)
题目 传送门 题解 首先转化成到(0,0)(0,0)(0,0)的斜率. 那么就是求多少个点是前缀最大值. 做法是线段树,用gao(i,x)gao(i,x)gao(i,x)表示在iii区间内,之前最大值 ...
- trigger 和 triggerHandler(),自定义事件
trigger 和 triggerHandler(),自定义事件 语法: $(selector).trigger(event,[param1,param2,...]) 1,event 必需.规定指定元 ...
- sudo 命令报 unable to resolve host 导致反应速度变慢
1 分析 1.1 字面分析,不能解析主机 1.2 由于修改了本地主机名称所导致 2 解决 2.1 打开 /etc/hosts 2.2 主机名称指向,如你的主机名为 debian 2.3 127.0. ...
- SpringMVC使用ResponseEntity实现文件下载,及图片base64的字节数组上传于下载
本文主要通过ResponseEntity<byte[]>实现文件下 该类实现响应头.文件数据(以字节存储).状态封装在一起交给浏览器处理以实现浏览器的文件下载. ResponseEntit ...
- luogu P3386 【模板】二分图匹配
二次联通门 : luogu P3386 [模板]二分图匹配 /* luogu P3386 [模板]二分图匹配 最大流 设置源点,汇点,连到每条边上 跑一边最大流即可 */ #include <i ...
- 搭建自己的博客(九):使用shell模式批量添加博客文章并增加分页功能
想做个博客分页功能,但是没有太多的文章.所以使用shell命令行创建多篇文章. 1.打开pycharm下的terminal终端 python manage.py shell # 打开python终端 ...
- 常用的os库笔记
1.创建文件 import os os.mkdir('d:/log') 2.重命名文件 import os os.rename('d:/log','d:/newlog') 3.删除文件 import ...
- C语言应用--数据类型定制一定义和引用
目前,定制正在变的越来越普遍,定制服务.定制衣服.甚至使用的键盘都是定制了.在C语言中虽然也包括了整型.字符型和浮点型等基本类型,也有基本的组合数据类型数组.但是这些类型都是针对某一种特定类型时应用没 ...