设置超时消费者队列(spring-rabbit)

时间:2018-02-12 11:55:01

标签: spring-boot rabbitmq spring-rabbit spring-rabbitmq

我们正在使用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.
    }
}

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果死锁是synchronized块或方法,那你就不走运了;它们不可中断。

你必须解决僵局。

如果您可以将其更改为使用java.util.concurrent.locks.Lock,则可以使用tryLock()超时。

框架无法帮助您解决此问题。