EasyNetQ异常处理
代码下载
https://download.csdn.net/download/u010312811/11252093
官方Demo
https://github.com/EasyNetQ/EasyNetQ/issues/793
1.新建项目
创建一个控制台程序,并添加对 EasyNetQ的引用
2.创建消息模型
2.1创建Answer
创建Answer数据模型
public class Answer
{
public string Text { get; } public Answer(string text)
{
Text = text;
}
}
2.2创建Question
public class Question
{
public string Text { get; } public Question(string text)
{
Text = text;
}
}
3.测试程序
3.1初始化代码
private static IBus bus;
private const string ErrorQueue = "EasyNetQ_Default_Error_Queue"; static void Main(string[] args)
{
bus = RabbitHutch.CreateBus("host=localhost");
/*订阅消息*/
Subscribe(); /*处理错误队列中的错误数据*/
HandleErrors(); /*发布消息*/
Console.WriteLine("输入文字,按回车发送消息!");
while (true)
{
var msg = Console.ReadLine();
bus.Publish(new Question(msg));
}
}
创建一个总线,用于消息的收发;
依次注册消息的订阅方法,错误处理方法,消息发布方法。
3.2消息订阅
private static void Subscribe()
{
/*声明两个消费者*/
bus.SubscribeAsync<Question>("subscriptionId", x => HandleMessageAsync(x).Invoke());
bus.SubscribeAsync<Question>("subscriptionId", x => HandleMessageAsync(x).Invoke());
} private static Func<int,Task> HandleMessageAsync(Question question)
{
return async (id) =>
{
if (new Random().Next(, ) == )
{
Console.WriteLine("Exception Happened!!!!");
throw new Exception("Error Hanppened!");
}
else
{
Console.WriteLine(string.Format("worker:{0},content:{1}", id, question.Text));
}
};
}
订阅方法中声明了两个消息的订阅者(因为 subscriptionId相同,所以消息会采取轮询的方法,依次发送到每个消息的消费者)。
消息处理中产生随机数,进而有33%的机会产生异常
3.3消息发布
var msg = Console.ReadLine();
bus.Publish(new Question(msg));
发布程序很简单,读取输入的内容,直接使用EasyNetQ提供的发布方法即可。
3.4异常处理
private static void HandleErrors()
{
Action<IMessage<Error>, MessageReceivedInfo> handleErrorMessage = HandleErrorMessage; IQueue queue = new Queue(ErrorQueue, false);
bus.Advanced.Consume(queue, handleErrorMessage);
} private static void HandleErrorMessage(IMessage<Error> msg, MessageReceivedInfo info)
{
Console.WriteLine("catch: " + msg.Body.Message);
}
异常处理程序订阅了队列“EasyNetQ_Default_Error_Queue”,当异常发生时,EasyNetQ默认的处理是将队列数据写入当前的错误队列中。
4.功能测试
当程序异常时,打印异常
5.异常重试
实际项目中,当程序发生异常后,我们期望的处理可能是将消息返回到原有队列,进行再次的数据处理。
修改bus创建的声明:
bus = RabbitHutch.CreateBus("host=localhost", x => x.Register<IConsumerErrorStrategy>(_ => new AlwaysRequeueErrorStrategy()));
AlwaysRequeueErrorStrategy是我们默认的错误处理方法
public sealed class AlwaysRequeueErrorStrategy : IConsumerErrorStrategy
{
public void Dispose()
{
} public AckStrategy HandleConsumerError(ConsumerExecutionContext context, Exception exception)
{
return AckStrategies.NackWithRequeue;
} public AckStrategy HandleConsumerCancelled(ConsumerExecutionContext context)
{
return AckStrategies.NackWithRequeue;
}
}
EasyNetQ异常处理的更多相关文章
- 【框架学习与探究之消息队列--EasyNetQ(1)】
前言 本文欢迎转载,实属原创,本文原始链接地址:http://www.cnblogs.com/DjlNet/p/7603554.html 废话 既然都是废话了,所以大家就可以跳过了,这里是博主有事没事 ...
- RabbitMQ学习系列四-EasyNetQ文档跟进式学习与实践
EasyNetQ文档跟进式学习与实践 https://www.cnblogs.com/DjlNet/p/7603554.html 这里可能有人要问了,为什么不使用官方的nuget包呐:RabbitMQ ...
- 关于.NET异常处理的思考
年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- 异常处理汇总 ~ 修正果带着你的Net飞奔吧!
经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...
- JavaScript var关键字、变量的状态、异常处理、命名规范等介绍
本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...
- IL异常处理
异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...
- Spring MVC重定向和转发以及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- 【repost】JS中的异常处理方法分享
我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
随机推荐
- NX二次开发-UFUN单选菜单对话框uc1603
NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); //单选菜单对话框 char sPromptSt ...
- favicon.ico请求处理
favicon.ico 图标用于收藏夹图标和浏览器标签上的显示,如果不设置,浏览器会请求网站根目录的这个图标,如果网站根目录也没有这图标会产生 404. 出于优化的考虑,要么就有这个图标,要么就禁止产 ...
- Java-Class-C:com.alibaba.fastjosn.JSON
ylbtech-Java-Class-C:com.alibaba.fastjosn.JSON 1.返回顶部 1.1.import com.alibaba.fastjson.JSON;import co ...
- MySQL数据库迁移详细步骤
转载自:http://sofar.blog.51cto.com/353572/1598364 ===================================================== ...
- 转:container_of分析 研究内核的博客
源地址:http://blog.csdn.net/tigerjibo/article/details/8299589 2012-12-15 19:23 1636人阅读 评论(2) 收藏 举报 目录 ...
- python中的线程锁
锁对象 原始锁是一个在锁定时不属于特定线程的同步基元组件.在Python中,它是能用的最低级的同步基元组件,由 _thread 扩展模块直接实现. 原始锁处于 "锁定" 或者 &q ...
- sql 递归查询,刁刁的
with cte as( select IDPlus,SuperiorsIDPlus,RoleGrade,viplevel,NAME,WeixinId from Member where IDPlus ...
- iOS开发系列-自动化分发测试打包
概述 项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上. xcodebuild 是苹果发布自动构建的工具. Shell脚本打包 xcr ...
- thinkphp 用户注册功能
UserActiion.class.php页面: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...
- mysql数据库优化思路
1.设置合适的主键和索引. (1).设置主键和索引的字段尽量不要选取经常修改的字段,同时索引的个数一般不宜超过6个: (2).sql语句中like “%str%” 不支持索引, "str% ...