代码下载

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获取当前所在的模块UF_ask_application_module

    NX9+VS2012 #include <uf.h> #include <NXOpen/UI.hxx> #include <NXOpen/MenuBar_MenuBarM ...

  2. mysql 第一次启动及常用命令

    启动 mysql -u root -p 进入后 # 显示有几个数据库 mysql> show databases; +--------------------+ | Database | +-- ...

  3. Openstack组件实现原理 — OpenVswitch/Gre/vlan

    目录 目录 前文提要 Neutron 管理的网络相关实体 OpenVswitchOVS OVS 的架构 VLan GRE 隧道 Compute Node 中的 Instance 通过 GRE 访问 P ...

  4. GPIO_F427

  5. HDU1595-find the longest of the shortest-dijkstra+记录路径

    Marica is very angry with Mirko because he found a new girlfriend and she seeks revenge.Since she do ...

  6. 拾遗:Perl 基础语法

    Perl 常用的命令行参数 -i:将处理结果直接写入文件,可以通过 -i.bak 或 -i"/tmp/orig_*" 等形式,在修改之前进行备份 -e:启用 perl 的命令行模式 ...

  7. 剑指offer——27二叉树的镜像

    题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...

  8. 学习k8s的经验

    最近在学k8s,总结一下安装k8s的坑. 1.晚上关于k8s的学习资料很多,多不如精,这个博客很好,https://blog.csdn.net/sinat_35930259/article/categ ...

  9. Substring UVA - 11468 AC自动机+概率DP

    题意: 给出一些字符和各自对应的选择概率,随机选择L次后得到一个长度为L的随机字符串S. 给出K个模板串,计算S不包含任何一个模板串的概率 dp[i][j]表示走到AC自动机 i 这个节点 还需要走 ...

  10. 【Java】Appache Flume 中文介绍

     Flume 是什么        Apache Flume是一个高可靠.高可用的分布式的海量日志收集.聚合.传输系统.它能够从不同的日志源採集数据并集中存储. Flume也算是Hadoop生态系 ...