[spring+AMQ]DefaultMessageListenerContainer设置sessionTransacted为true,异常重试7次后丢弃

DefaultMessageListenerContainer设置了sessionTransacted='true'后。如果抛异常是可以rollback重新放回队列,重新处理的。但是这里有个“限制”。就是重新放回队列 7次 后,第8次就没有重新放回队列中去了(可能直接丢弃,也可能AMQ那边不接收了???)。。与此同时listener就处理后续队列中的message。最终导致的结果是,抛异常的那条message丢失了。
看源码也找不到具体出问题的原因。不知道博主注意到这个问题没有。
附相关代码
1. 接收message的listener:

public class EmailReceiveListener {
private AtomicInteger count = new AtomicInteger(1);
public void receive(Email email){
if (email==null || email.getTitle().contains("3")){
System.out.println("[ERROR][Email]"+email + ";count"+count.getAndIncrement());
throw new RuntimeException("3点必须不能开会!!!");
}else{
System.out.println("[EmailReceiveListener][Email]"+email);
}
}
}

2. 然后是container的配置

<bean id="emailMessageListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory"/>
<property name="destination" ref="converterQueue"/>
<property name="messageListener" ref="emailMessageListenerAdapter"/>
<property name="sessionTransacted" value="true"/>
</bean>

3. 最后是发送的简单例子

public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-jms-spring.xml"});
context.start();

EmailSender sender3 = (EmailSender)context.getBean("emailSender");
Destination converterQueue = (Destination)context.getBean("converterQueue");

Email email = new Email();
email.setContent("系统服务化");
email.setFrom("小黑手");
email.setSendTo("D team");
for (int i=0;i<10;i++) {
try {
Thread.sleep(Long.valueOf(new Random().nextInt(1000)));
email.setTitle("下午 "+i+" 点开会");
sender3.send(converterQueue,email);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

其他就不贴了。都是正常的。
console打印如下:

[EmailReceiveListener][Email]Email{title='下午 0 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 1 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 2 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count1
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count2
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count3
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count4
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count5
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count6
[ERROR][Email]Email{title='下午 3 点开会', content='系统服务化', sendTo='D team', from='小黑手'};count7
[EmailReceiveListener][Email]Email{title='下午 4 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 5 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 6 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 7 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 8 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
[EmailReceiveListener][Email]Email{title='下午 9 点开会', content='系统服务化', sendTo='D team', from='小黑手'}
...全文
2514 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
点滴寸土 2017-05-15
  • 打赏
  • 举报
回复
MQ默认的是有死性队列的,应该是以.DLQ结尾的,就是说 重发7次后,如果没成功,会丢到死性队列里
下一秒地狱 2017-04-07
  • 打赏
  • 举报
回复
不知道楼主解决了没 我也发现了这个问题。。。。很郁闷

25,985

社区成员

发帖
与我相关
我的任务
社区描述
高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧