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出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...
随机推荐
- 暑假集训test-8-28
大概是从我一年以来做过的最傻逼的一套题了.. 一个半小时打完三个程序三个暴力拍完以为自己AK了,开心地耍了两个小时. 结果T3要写高精,LL炸了后4个点,中间还有个点是啥都不选的,我没用0去更新又炸了 ...
- [JZOJ 5818] 做运动
题意:带温度最短路. 思路: 我们将温度从小到大的将边加入,用并查集维护连通性. 如果一旦联通那么跑一遍\(spfa\)就可以得到答案. 复杂度\(O(m log m)\) #include < ...
- HTML 技巧
超过指定宽度以".."显示 width:80px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;
- 8.RabbitMQ 消息传递Java对象
通过消息服务器传递Java对象,Java类必须实现序列化接口,可以把Java对象转化为字节数组,从消费者或生产者传递到另外一个JVM中,一定需要两个JVM共享这个类,比如是UserInfo类. 1 ...
- hexo next主题深度优化(八),微加速
个人博客:https://mmmmmm.me 源码:https://github.com/dataiyangu/dataiyangu.github.io 通过不断地上网查资料,引用的js.css.图片 ...
- Git及github使用(三)更新自己的github代码
如果之前上传的代码到目前有所改动,想要更新github上的代码文件.希望本篇对你有所帮助. 1.拉取代码本地修改后上传代码 提交成功后的效果如下: 2.更新展示在github首页的readme内容 上 ...
- 如何查看jdk版本和路径
cmd进入命令提示符,查看jdk版本,输入java -version;查看jdk路径 ,输入set java home.,这个也是默认路径
- sp_executeSql 用法 执行有参数的sql字符串 出现必须声明标量变量 "@XXX"。
今天遇到了一个难题 就是把 一个拼接sql语句 的返回值 赋值给一个变量 经研究 要用sp_executeSql这个存储过程 据说是从sql 2005才开始有的 代码如下: declare @str ...
- __typeof与typeof
其实之前在stackoverflow就看过一篇讲的比较详细的, https://stackoverflow.com/questions/14877415/difference-between-type ...
- Mysql查漏补缺
Mysql查漏补缺 存储引擎 数据库使用存储引擎来进行CRUD的操作,不同的存储引擎提供了不同的功能.Mysql支持的存储引擎有InnoDB.MyISAM.Memory.Merge.Archive.F ...