Spring rabbitMQ DLQ缺少消息\u id

Spring rabbitMQ DLQ缺少消息\u id,rabbitmq,spring-amqp,spring-rabbit,Rabbitmq,Spring Amqp,Spring Rabbit,目前,我已将消息侦听器容器设置为使用spring retry来处理重试,但当有人发送消息而不提供消息id时,消息侦听器将停止。是否可以更改此行为,使其将消息放入死信队列,而不是停止侦听器 我的重试配置如下: @Bean public StatefulRetryOperationsInterceptor retryInterceptor() { StatefulRetryOperationsInterceptorFactoryBean f = new StatefulRe

目前,我已将消息侦听器容器设置为使用spring retry来处理重试,但当有人发送消息而不提供消息id时,消息侦听器将停止。是否可以更改此行为,使其将消息放入死信队列,而不是停止侦听器

我的重试配置如下:

 @Bean
 public StatefulRetryOperationsInterceptor retryInterceptor() {
   StatefulRetryOperationsInterceptorFactoryBean f = new     
   StatefulRetryOperationsInterceptorFactoryBean();
   f.setRetryOperations(retryTemplate());
   f.setMessageRecoverer(new RejectAndDontRequeueRecoverer());

   return f.getObject();
}

private RetryOperations retryTemplate() {
  RetryTemplate retryTemplate = new RetryTemplate();
  ExponentialRandomBackOffPolicy backOffPolicy = new ExponentialRandomBackOffPolicy();

  backOffPolicy.setInitialInterval(50);
  backOffPolicy.setMultiplier(1.5);
  backOffPolicy.setMaxInterval(1000);
  retryTemplate.setBackOffPolicy(backOffPolicy);

  SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
  retryPolicy.setMaxAttempts(10);
  retryTemplate.setRetryPolicy(retryPolicy);

  return retryTemplate;
}
我得到以下例外情况:

2014-08-01 08:50:27,858 [taskExecutor<OmittedForPrivacy>-2] WARN  mqp.rabbit.listener.SimpleMessageListenerContainer - Execution of Rabbit message listener failed, and no ErrorHandler has been set.
org.springframework.amqp.rabbit.listener.FatalListenerExecutionException: Illegal null id in message. Failed to manage retry for message: (Body:'{
    <Omitted for privacy>
}'; ID:null; Content:application/json; Headers:{__TypeId__=<OmittedForPrivacy>}; Exchange:; RoutingKey:<OmittedForPrivacy>; Reply:null; DeliveryMode:NON_PERSISTENT; DeliveryTag:1)
    at org.springframework.amqp.rabbit.config.StatefulRetryOperationsInterceptorFactoryBean$3.getKey(StatefulRetryOperationsInterceptorFactoryBean.java:114) ~[spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.retry.interceptor.StatefulRetryOperationsInterceptor.invoke(StatefulRetryOperationsInterceptor.java:132) ~[spring-retry-1.1.0.RELEASE.jar:na]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) ~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
    at com.sun.proxy.$Proxy612.invokeListener(Unknown Source) ~[na:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:620) [spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:454) ~[spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:480) [spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:464) [spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$300(SimpleMessageListenerContainer.java:61) [spring-rabbit-1.2.1.RELEASE.jar:na]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:558) [spring-rabbit-1.2.1.RELEASE.jar:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_17]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_17]
    at java.lang.Thread.run(Thread.java:722) [na:1.7.0_17]
2014-08-01 08:50:27858[taskExecutor-2]警告mqp.rabbit.listener.SimpleMessageListenerContainer-执行rabbit消息侦听器失败,未设置错误处理程序。
org.springframework.amqp.rabbit.listener.FatalListenerExecutionException:消息中存在非法的空id。无法管理邮件的重试:(正文:'{
}“;ID:null;内容:application/json;头:{{uuuuu TypeId_uuuu=};交换:;路由键:;回复:null;DeliveryMode:非持久性;DeliveryTag:1)
在org.springframework.amqp.rabbit.config.StatefureOperationsInterceptorFactoryBean$3.getKey(statefureRetryOperationsInterceptorFactoryBean.java:114)~[spring-rabbit-1.2.1.RELEASE.jar:na]
在org.springframework.retry.interceptor.statefulretryoperationinterceptor.invoke(statefulretryoperationinterceptor.java:132)~[spring-retry-1.1.0.RELEASE.jar:na]
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:179)~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
在org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)~[spring-aop-4.0.0.RELEASE.jar:4.0.0.RELEASE]
在com.sun.proxy.$Proxy612.invokeListener(未知源)~[na:na]
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.invokeListener(SimpleMessageListenerContainer.java:620)[spring-rabbit-1.2.1.RELEASE.jar:na]
在org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:454)~[spring-rabbit-1.2.1.RELEASE.jar:na]
在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:480)[spring-rabbit-1.2.1.RELEASE.jar:na]
在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:464)[spring-rabbit-1.2.1.RELEASE.jar:na]
在org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$300(SimpleMessageListenerContainer.java:61)[spring-rabbit-1.2.1.RELEASE.jar:na]
位于org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:558)[spring-rabbit-1.2.1.RELEASE.jar:na]
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)[na:1.7.017]
在java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)[na:1.7.017]
在java.lang.Thread.run(Thread.java:722)[na:1.7.0_17]
因此,我想改变这样一个事实,即他在之后停止消息侦听器容器,而只是将消息放在死信队列中


Krgds

你说的听众“停止”是什么意思;请显示您的配置,并在某处发布调试日志,显示您描述的行为

编辑:

Ah-在侦听器异常之后,
AmqpRejectAndDontRequeueRecover
将进行恢复;此异常在我们进入重试逻辑之前发生

您可以在建议链中添加一个(在重试建议之前)

它将允许尝试缺少id的消息,但如果消息被重新传递(并且再次失败),则将抛出
RejectAndDontRequeueException
——无论重试设置如何,仅重试一次


如果您不想尝试就拒绝这些消息,您必须创建自己的建议。

在问题中添加了配置和例外:)Thx提前!