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在失败状态下将会执行完成。

英文地址:https://github.com/EasyNetQ/EasyNetQ/wiki/Publisher-Confirms

中文地址:http://www.cnblogs.com/HuangLiang/p/EasyNetQ_Publisher_Confirms.html

我的微信订阅号:open_dotNET

13-EasyNetQ之发布者确认的更多相关文章

  1. EasyNetQ使用(七)【发布者确认 ,用Future Publish发布预定中事件 】

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

  2. 【EasyNetQ】- 发布确认

    默认的AMQP发布不是事务性的,并不保证您的消息实际到达代理.AMQP确实指定了事务发布,但是使用RabbitMQ它非常慢,我们还没有通过EasyNetQ API支持它.对于高性能保证交付,建议您使用 ...

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

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

  4. 【框架学习与探究之消息队列--EasyNetQ(1)】

    前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...

  5. RabbitMQ入门_12_发布方确认

    参考资料:https://www.rabbitmq.com/confirms.html 通过 ack 机制,我们可以确保队列中的消息一定能被消费到.那我们有办法保证消息发布方一定把消息发送到队列了吗? ...

  6. RabbitMQ学习系列四-EasyNetQ文档跟进式学习与实践

    EasyNetQ文档跟进式学习与实践 https://www.cnblogs.com/DjlNet/p/7603554.html 这里可能有人要问了,为什么不使用官方的nuget包呐:RabbitMQ ...

  7. 【EasyNetQ】- 简介

    EasyNetQ是一个简单易用的,稳定的的RabbitMQ .NET API . 如果您只想尽快启动并运行,请转到“ 快速开始”指南. EasyNetQ的目标是提供一个库,使得在.NET中使用Rabb ...

  8. 【RabbitMQ】6、rabbitmq生产者的消息确认

    通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以 ...

  9. rabbitmq生产者的消息确认

    通过Publisher Confirms and Returns机制,生产者可以判断消息是否发送到了exchange及queue,而通过消费者确认机制,Rabbitmq可以决定是否重发消息给消费者,以 ...

随机推荐

  1. Elasticsearch Painless语言(实现搜索打分基础)

    With the release of Elasticsearch 5.x came Painless, Elasticsearch's answer to safe, secure, and per ...

  2. maven打的包中含源文件jar包

    如何用maven package打的jar包中还包含源文件(resource)jar包: 在pom中如下添加: <build> <plugins> <plugin> ...

  3. debounce与throttle区别

    在2011年,Twitter网站曾爆出一个问题:在主页往下滚动时,页面会变得缓慢以致没有响应.John Resig发表了一篇文章< a blog post about the problem&g ...

  4. Helix Server流媒体服务器架设教程(附Helix Server11.01下载)

    现在D版的远古影视系统很流行,也很实用,但是在这之前,很多人都是用共享,或者是使用Helix Server留媒体来做电影服务器~ 虽然Helix Server流媒体服有点落伍了,不过我相信它还是有用武 ...

  5. 【Java 并发】Executor框架机制与线程池配置使用

    [Java 并发]Executor框架机制与线程池配置使用 一,Executor框架Executor框架便是Java 5中引入的,其内部使用了线程池机制,在java.util.cocurrent 包下 ...

  6. Java虚拟机运行时数据区域划分

        Java虚拟机数据运行时区域 方法区(Method Area) 存储加载的类信息,常量,静态变量,编译器编译后的代码等数据.虽然JVM规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做N ...

  7. VC++6.0/MFC中如何限制Edit控件输入 例子,只能输入0和1

    1.Insert -> New Class -> 在Base Class中选择CEdit,在Name中输入CMyEdit. 2.在左边的ClassView中,右键击CMyEdit,选择Ad ...

  8. CS与BS区别

    简介:CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强.具有安全的存取模式.网络通信量低.响应速度快.利于处理大量数据.但是该结构的程序是针对性 ...

  9. 【PS实例】照片拼图的制作

    本系列教程将开始讲解PS的一些制作实例,通过实例的讲解同时介绍各种工具和面板机快捷键的使用,这样能够让大家更有兴趣学习,在学习的同时能够创造出自己喜欢的东西.本人使用的教程都是根据本人多次调试制作,仅 ...

  10. 剑指offer-第六章面试中的各项能力之总结