我们正在使用rabbitmq,我们的生产商和消费者使用spring-boot-starter-amqp(spring-rabbit 1.5.6.RELEASE)开发,
我们的消费者在生产中遇到了一些僵局,一旦发生这种情况,我们需要重新启动消费者以再次处理新消息。可能这个问题正在发生,因为某些消息被我们的一个消费者中的另一个交易阻止。我们开始调查发现这些死锁,但我们有一个复杂的环境,并且很难发现死锁问题,所以我想问:
当我们在spring-boot应用程序中处理我们的消息时,有一种方法可以暂停一些超时,以帮助我们中止一条消息,而不是消除我们消费者中的所有消息。
我们的代码:
AmqpConfig.class{
@Bean
public SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(consumerQueue());
container.setMessageListener(listenerAdapter);
return container;
}
@Bean
public MessageListenerAdapter listenerAdapter(Receiver receiver) {
MessageListenerAdapter listener = new MessageListenerAdapter(receiver);
listener.addQueueOrTagToMethodName(consumerQueue().getName(), "consumerListener");
return listener;
}
@Bean
public Queue consumerQueue() {
return new Queue("some.consumer", true, false, false, null);
}
}
Receiver.class{
//method than I'd like put some timeout to process.
public String consumerListener(String message) {
//code probably causing deadlock.
}
}
感谢您的帮助。
答案 0 :(得分:0)
如果死锁是synchronized
块或方法,那你就不走运了;它们不可中断。
你必须解决僵局。
如果您可以将其更改为使用java.util.concurrent.locks.Lock
,则可以使用tryLock()
超时。
框架无法帮助您解决此问题。