SimpleMessageListenerContainer:消费者引发异常,如果处理支持它可以重新启动处理

Posted

技术标签:

【中文标题】SimpleMessageListenerContainer:消费者引发异常,如果处理支持它可以重新启动处理【英文标题】:SimpleMessageListenerContainer: Consumer raised exception, processing can restart if processing supports it 【发布时间】:2017-02-28 23:47:33 【问题描述】:

我有一个 Spring Boot 应用程序与 rabbitmq 代理接口,该代理可以正常启动,但是无论队列中有消息,我都会不断地启动/关闭消息消费者。以下是我的应用程序日志和客户端类的副本:

2016-10-19 11:40:25,909 警告:[SimpleAsyncTaskExecutor-106] SimpleMessageListenerContainer:消费者引发异常,如果连接工厂支持,处理可以重新启动 java.lang.NullPointerException:空 在 com.rabbitmq.client.impl.ChannelN.validateQueueNameLength(ChannelN.java:1232) ~[amqp-client-3.5.5.jar:na] 在 com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:884) ~[amqp-client-3.5.5.jar:na] 在 com.rabbitmq.client.impl.ChannelN.queueDeclarePassive(ChannelN.java:61) ~[amqp-client-3.5.5.jar:na] 在 sun.reflect.GeneratedMethodAccessor334.invoke(未知来源)~[na:na] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_51] 在 java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_51] 在 org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:666) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 在 com.sun.proxy.$Proxy181.queueDeclarePassive(Unknown Source) ~[na:na] 在 org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.attemptPassiveDeclarations(BlockingQueueConsumer.java:533) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 在 org.springframework.amqp.rabbit.listener.BlockingQueueConsumer.start(BlockingQueueConsumer.java:453) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 在 org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1083) ~[spring-rabbit-1.4.6.RELEASE.jar:na] 在 java.lang.Thread.run(Thread.java:745) [na:1.8.0_51] 2016-10-19 11:40:25,909 信息 t:[SimpleAsyncTaskExecutor-106] SimpleMessageListenerContainer:重新启动消费者:tags=[],channel=Cached Rabbit Channel:AMQChannel(amqp://guest@127.0.0.1:5672/ ,1), acknowledgeMode=AUTO 本地队列大小=0 2016-10-19 11:40:25,910 调试:[SimpleAsyncTaskExecutor-106] BlockingQueueConsumer:关闭兔子通道:缓存兔子通道:AMQChannel(amqp://guest@127.0.0.1:5672/,1) 2016-10-19 11:40:25,910 调试:[SimpleAsyncTaskExecutor-106] CachingConnectionFactory:关闭缓存通道:AMQChannel(amqp://guest@127.0.0.1:5672/,1) 2016-10-19 11:40:25,911 调试 t:[SimpleAsyncTaskExecutor-107] DefaultListableBeanFactory:返回单例 bean 'macRequestQueue' 的缓存实例 2016-10-19 11:40:25,911 调试:[SimpleAsyncTaskExecutor-107] BlockingQueueConsumer:启动消费者消费者:标签=[],通道=null,确认模式=自动本地队列大小=0 2016-10-19 11:40:25,912 调试:[SimpleAsyncTaskExecutor-107] CachingConnectionFactory:从 AMQChannel(amqp://guest@127.0.0.1:5672/,1)创建缓存的兔子通道 2016-10-19 11:40:25,912 调试:[SimpleAsyncTaskExecutor-107] SimpleMessageListenerContainer:在 5000 毫秒内恢复消费者。

下面是我的客户端类的副本:

public class RabbitClientConfiguration extends AbstractEMCRabbitConfiguration     

@Inject
private JacksonConfiguration jacksonConfiguration;

@Inject
private MessagingConfiguration messagingConfiguration;

//@Value("$data.core.pattern")
//private String coreDataRoutingKey;

//@Inject
//private ClientHandler clientHandler;

@Override
public void configureRabbitTemplate(RabbitTemplate rabbitTemplate) 
    rabbitTemplate.setRoutingKey(MAC_REQUEST_ROUTING_KEY);


@Bean
public SimpleMessageListenerContainer messageListenerContainer()
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory());
    container.setQueueNames(MAC_REQUEST_QUEUE_NAME);
    container.setMessageListener(messageListenerAdapter());
    container.setAcknowledgeMode(AcknowledgeMode.AUTO);
    return container;


@Bean
MessageListenerAdapter messageListenerAdapter()
    return new MessageListenerAdapter(clientHandler(jacksonConfiguration.objectMapper(),messagingConfiguration.macMessageHandler(messagingConfiguration.messagingFactory())),jsonMessageConverter());
    //return new MessageListenerAdapter(clientHandler,"receiveMessage");


@Bean
ClientHandler clientHandler(ObjectMapper objectMapper, IMessageHandler macMessageHandler)
    ClientHandler clientHandler = new ClientHandler();
    clientHandler.setObjectMapper(objectMapper);
    clientHandler.setMacMessageHandler(macMessageHandler);
    return clientHandler;



@Bean
public AmqpAdmin rabbitAdmin()  return new RabbitAdmin(connectionFactory());


【问题讨论】:

【参考方案1】:

java.lang.NullPointerException: 在 com.rabbitmq.client.impl.ChannelN.validateQueueNameLength 处为空

这意味着 MAC_REQUEST_QUEUE_NAME 包含 null - 看起来容器在您调用 setter 时不会检查。

我打开了JIRA Issue 来检测这种情况。

【讨论】:

是的,你是对的,我有点忽略了那个。谢谢。

以上是关于SimpleMessageListenerContainer:消费者引发异常,如果处理支持它可以重新启动处理的主要内容,如果未能解决你的问题,请参考以下文章