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消息中解开原始的消息,然后发送消息到事件总线。

安装调度服务

  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.

现在你应该能够调用FuturePublish方法,在指定时间到来时,你会收到消息。

卸载EasyNetQ.Scheduler,运行:

EasyNetQ.Scheduler.exe uninstall
 

EasyNetQ使用(七)【发布者确认 ,用Future Publish发布预定中事件 】的更多相关文章

  1. 14-EasyNetQ之用Future Publish发布预定中事件

    很多商业流程需要事件在未来的时间按照预定时间发布.例如,在初次与客户接触后,可以在未来某个时间去电话回访客户.EasyNetQ可以用它的Future Publish功能帮你实现这个功能.举例:这里我们 ...

  2. 【EasyNetQ】- 使用Future Publish调度事件

    许多业务流程要求在将来某个日期安排事件.例如,在与客户进行初次销售联系后,我们可能希望在将来的某个时间安排跟进电话.EasyNetQ可以通过其Future Publish功能帮助您实现此功能.例如,这 ...

  3. 13-EasyNetQ之发布者确认

    AMQP发布消息默认情况下是非事务性的,不能确保你的消息真正送达代理.AMQP可以去指定事务性发布,但是RabbitMQ这样会非常慢,我们没有让EasyNetQ API去支持此功能.为了高效的确保投递 ...

  4. RabbitMQ (十二) 消息确认机制 - 发布者确认

    消费者确认解决的问题是确认消息是否被消费者"成功消费". 它有个前提条件,那就是生产者发布的消息已经"成功"发送出去了. 因此还需要一个机制来告诉生产者,你发送 ...

  5. Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,将全部来与官网 我猜去全部机翻+个人 ...

  6. redis subscribe/publish(发布订阅)

    redis的发布端 package dubbo.wangbiao.project.pubsub; import org.apache.commons.pool2.impl.GenericObjectP ...

  7. 【转】npm publish 发布

    <h3 class="catListTitle">一.npm包结构(编写)</h3> npm包实际是一个存档文件,即一个目录直接打包为.zip或tar.gz ...

  8. 码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布

    码字工作者的发文姿势—— 用MWeb+Markdown Here+七牛 轻松实现多平台发布   1.对于写作你最头疼什么 对于大多数码字工作者来说,随时随地记录灵感,构思文章,集中书写,其实是一件令人 ...

  9. npm publish 发布

    前言 我们npm publish发布的时候,一定是本地文件发布到远程仓库,并且登录到http://registry.npmjs.org(即npm adduser或npmlogin)之后,才可以进行发布 ...

随机推荐

  1. 把hdfs数据写入到hbase表

    功能:把hdfs上的数据写入到hbase表. hadoop的mapreduce输出要导入到hbase表,最好先输出HFile格式,再导入hbase,因为HFile是hbase的内部存储格式,所以导入效 ...

  2. MongoDB 分片管理(四)数据均衡

    通常来说,MongoDB会自动处理数据均衡. 1.1 集群分片的块的均衡 注意,均衡器只使用块的数量,而非数据大小,来作为衡量分片间是否均衡的指标. 1.2 均衡器 1.执行所有数据库管理操作前,都应 ...

  3. 070_Shell 脚本对信号的处理,执行脚本后,按键盘 Ctrl+C 无法终止的脚本

    #!/bin/bash#使用 trap 命令可以拦截用户通过键盘或 kill 命令发送过来的信号#使用 kill -l 可以查看 Linux 系统中所有的信号列表,其中 2 代表 Ctrl+C#tra ...

  4. Cogs 12. 运输问题2(有上下界的有源汇最大流)

    运输问题2 ★★☆ 输入文件:maxflowb.in 输出文件:maxflowb.out 简单对比 时间限制:1 s 内存限制:128 MB 运输问题 [问题描述] 一个工厂每天生产若干商品,需运输到 ...

  5. Redis Mysql 双写一致性问题

    一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新 ...

  6. OpenFOAM 中的边界条件(二)【转载】

    转载链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM2/ 本篇在上一篇的基础上来解读 OpenFOA ...

  7. 机器学习系列算法1:KNN

    思路:空间上距离相近的点具有相似的特征属性. 执行流程: •1. 从训练集合中获取K个离待预测样本距离最近的样本数据; •2. 根据获取得到的K个样本数据来预测当前待预测样本的目标属性值 三要素:K值 ...

  8. GitHub发卡系统zfaka配置历程

    GitHub发卡系统zfaka配置历程 1项目介绍 ​ ZFAKA发卡系统(本系统基于yaf+layui开发) ​ 项目地址 https://github.com/zlkbdotnet/zfaka 我 ...

  9. Beta冲刺(2/4)

    队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11990570.html 作业博客 : https://edu.cnblogs.com/campus/ ...

  10. arcgis python 发送邮件

    import arcgisscripting, smtplib, os, sys, traceback from email.MIMEMultipart import MIMEMultipart fr ...