代码下载

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异常处理的更多相关文章

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

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

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

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

  3. 关于.NET异常处理的思考

    年关将至,对于大部分程序员来说,马上就可以闲下来一段时间了,然而在这个闲暇的时间里,唯有争论哪门语言更好可以消磨时光,估计最近会有很多关于java与.net的博文出现,我表示要作为一个吃瓜群众,静静的 ...

  4. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  5. 异常处理汇总 ~ 修正果带着你的Net飞奔吧!

    经验库开源地址:https://github.com/dunitian/LoTDotNet 异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983 ...

  6. JavaScript var关键字、变量的状态、异常处理、命名规范等介绍

    本篇主要介绍var关键字.变量的undefined和null状态.异常处理.命名规范. 目录 1. var 关键字:介绍var关键字的使用. 2. 变量的状态:介绍变量的未定义.已定义未赋值.已定义已 ...

  7. IL异常处理

    异常处理在程序中也算是比较重要的一部分了,IL异常处理在C#里面实现会用到一些新的方法 1.BeginExceptionBlock:异常块代码开始,相当于try,但是感觉又不太像 2.EndExcep ...

  8. Spring MVC重定向和转发以及异常处理

    SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...

  9. 【repost】JS中的异常处理方法分享

    我们在编写js过程中,难免会遇到一些代码错误问题,需要找出来,有些时候怕因为js问题导致用户体验差,这里给出一些解决方法 js容错语句,就是js出错也不提示错误(防止浏览器右下角有个黄色的三角符号,要 ...

随机推荐

  1. NX二次开发-UFUN单选菜单对话框uc1603

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> UF_initialize(); //单选菜单对话框 char sPromptSt ...

  2. favicon.ico请求处理

    favicon.ico 图标用于收藏夹图标和浏览器标签上的显示,如果不设置,浏览器会请求网站根目录的这个图标,如果网站根目录也没有这图标会产生 404. 出于优化的考虑,要么就有这个图标,要么就禁止产 ...

  3. 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 ...

  4. MySQL数据库迁移详细步骤

    转载自:http://sofar.blog.51cto.com/353572/1598364 ===================================================== ...

  5. 转:container_of分析 研究内核的博客

    源地址:http://blog.csdn.net/tigerjibo/article/details/8299589 2012-12-15 19:23 1636人阅读 评论(2) 收藏 举报   目录 ...

  6. python中的线程锁

    锁对象 原始锁是一个在锁定时不属于特定线程的同步基元组件.在Python中,它是能用的最低级的同步基元组件,由 _thread 扩展模块直接实现. 原始锁处于 "锁定" 或者 &q ...

  7. sql 递归查询,刁刁的

    with cte as( select IDPlus,SuperiorsIDPlus,RoleGrade,viplevel,NAME,WeixinId from Member where IDPlus ...

  8. iOS开发系列-自动化分发测试打包

    概述 项目在测试阶段需要频繁打包给测试人员,对于这些固定化的操作我们可以使用自动化的手段去解决,将时间放在有意义的事情上. xcodebuild 是苹果发布自动构建的工具. Shell脚本打包 xcr ...

  9. 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 ...

  10. mysql数据库优化思路

    1.设置合适的主键和索引. (1).设置主键和索引的字段尽量不要选取经常修改的字段,同时索引的个数一般不宜超过6个: (2).sql语句中like  “%str%” 不支持索引, "str% ...