EasyNetQ自定义异常消息处理
2014-03-04 09:57
225 查看
20140310补充:
rabbitmq有requeue属性,可以选择消息是否返回队列,另,本文的解决方式非常之山寨,只能应用于发送和接收方式。
这几天在折腾消息队列,在.Net环境下有基于RabbitMQ有很多有API的选择,最后选择了比较简单的EasyNetQ(http://easynetq.com/)
在测试使用的时候发现一个问题,对于处理错误的消息,EasyNetQ默认会放到一个错误队列中并提供了一个工具可以对错误队列的消息进行重新分发。RabiitMQ是有一个事务功能的,但是貌似在EasyNetQ的实现中,没有发现相关的操作方式
现在的需求是,在某种特定的情况下,需要将处理不成功的消息,保留在消息原队列
做了一个变通处理,出现错误消息的时候,将其再送回原队列。从客户端上可以直接send回队列,但这样不是一个很好的方式
研究了一下EasyNetQ的相关代码,发现其定义了一个IConsumerErrorStrategy接口,我们只要自己自行实现,并注册一个自定义方法就可以
ComponentRegistration.cs原注册方法相关,默认错误消息处理方式在DefaultConsumerErrorStrategy.cs中
View Code
因为EasyNetQ在CreateBus的时候就会将相关事件注册,所以我们只需最后自行在config中加入有关配置,在注册事件的位置加入判断即可让异常抛回
由于刚接触RabbitMQ,对于一些概念的理解可能还不是非常到位,这是我目前所能找到的解决方案
当然可能以后的版本中,EasyNetQ会加入对事务的操作,现在EasyNetQ支持了一种叫Publisher Confirms的方法,貌似还是不是我想要的
rabbitmq有requeue属性,可以选择消息是否返回队列,另,本文的解决方式非常之山寨,只能应用于发送和接收方式。
这几天在折腾消息队列,在.Net环境下有基于RabbitMQ有很多有API的选择,最后选择了比较简单的EasyNetQ(http://easynetq.com/)
在测试使用的时候发现一个问题,对于处理错误的消息,EasyNetQ默认会放到一个错误队列中并提供了一个工具可以对错误队列的消息进行重新分发。RabiitMQ是有一个事务功能的,但是貌似在EasyNetQ的实现中,没有发现相关的操作方式
现在的需求是,在某种特定的情况下,需要将处理不成功的消息,保留在消息原队列
做了一个变通处理,出现错误消息的时候,将其再送回原队列。从客户端上可以直接send回队列,但这样不是一个很好的方式
研究了一下EasyNetQ的相关代码,发现其定义了一个IConsumerErrorStrategy接口,我们只要自己自行实现,并注册一个自定义方法就可以
ComponentRegistration.cs原注册方法相关,默认错误消息处理方式在DefaultConsumerErrorStrategy.cs中
public virtual PostExceptionAckStrategy HandleConsumerError(ConsumerExecutionContext context, Exception exception) { Preconditions.CheckNotNull(context, "context"); Preconditions.CheckNotNull(exception, "exception"); try { Connect(); using (var model = connection.CreateModel()) { var errorExchange = DeclareErrorExchangeQueueStructure(model, context); var messageBody = context.Body; var properties = model.CreateBasicProperties(); context.Properties.CopyTo(properties); properties.Type = context.Properties.Type; //消息持久化 properties.SetPersistent(true); model.BasicPublish(errorExchange, context.Info.RoutingKey, properties, messageBody); } } catch (Exception unexpectedException) { // Something else unexpected has gone wrong :( logger.ErrorWrite("EasyNetQMessageQueue Consumer Error Handler: Failed to publish error message\nException is:\n" + unexpectedException); } return Consumer.PostExceptionAckStrategy.ShouldAck; }
View Code
因为EasyNetQ在CreateBus的时候就会将相关事件注册,所以我们只需最后自行在config中加入有关配置,在注册事件的位置加入判断即可让异常抛回
由于刚接触RabbitMQ,对于一些概念的理解可能还不是非常到位,这是我目前所能找到的解决方案
当然可能以后的版本中,EasyNetQ会加入对事务的操作,现在EasyNetQ支持了一种叫Publisher Confirms的方法,貌似还是不是我想要的
相关文章推荐
- oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常,
- 实现一个自定义事件处理对象notice,或者称为消息中心对象
- MVC 验证和异常处理 实现自定义客户端验证逻辑
- ASP.NET AJAX入门系列(8):自定义异常处理
- 利用自定义的异常处理重起你的应用程序(续)
- Atitit mysql数据库自定义异常在java里面的捕获与处理推荐标准与规范
- KafkaOffsetMonitor 监控异常处理(消息堆积)
- 一种面向服务体系结构中消息层异常处理方法
- SpringMVC——自定义拦截器、异常处理以及父子容器配置
- Oracle中自定义异常处理
- C# 收发和处理自定义的WINDOWS消息
- 自定义消息的处理
- 自定义VS程序异常处理及调试Dump文件(一)
- set_exception_handler 自定义异常处理
- 自定义消息的处理(转)
- C# 消息处理机制及自定义过滤方式
- [ATL/WTL]_[初级]_[Win32窗口自定义消息处理过程]
- Oracle 游标 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常
- C++Builder 自定义消息 处理
- java之异常处理Exception的应用和自定义异常类的应用