Spring - 等待rabbitmq消息监听器完成

时间:2015-07-30 15:54:17

标签: java spring rabbitmq

我有两个消息监听器,每个监听器都在同一个RabbitMQ服务器上监听它自己的消息队列。

现在,当第一个侦听器在其队列上收到消息时,它必须询问其他侦听器是否有任何消息要在其队列中处理,如果有,则等待此消息由第二个听众继续执行它自己的执行。

我需要这样的东西:

SimpleMessageListenerContainer first;
SimpleMessageListenerContainer second;
if(second.hasReceivedMessageButItsStillNotProcessed){
  Thread.waitUntilSecondProcessesAMessage();
}

或者像这样

while(rabbitAdmin.getQueueProperties("qName").get("UNACKED_MSG_COUNT")>0){
  Thread.waitUntilSecondProcessesAMessage();
}

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:0)

如果您使用的是spring,则可以使用此Queue Size in Spring AMQP Java client (第二个答案)来获取队列邮件大小。你可以尝试这样的事情:

Spring队列配置:

<jms:listener-container 
    connection-factory="jmsFactory"  
    destination-type="queue1">
        <jms:listener destination="queue1" ref="consumer1" method="consume"/>
</jms:listener-container>
<bean id="consumer1" class="m.p.e.MessageConsumer1" scope="tenant"/>
<jms:listener-container 
    connection-factory="jmsFactory"  
    destination-type="queue2" >
        <jms:listener destination="queue2" ref="consumer2" method="consume"/>
</jms:listener-container>
<bean id="consumer2" class="m.p.e.MessageConsumer2" scope="tenant"/>

您的StatsCounter为Queue Size in Spring AMQP Java client (第二个回答)

public class QueueStatsProcessor {
    @Autowired
    private RabbitAdmin admin;
    @Autowired
    private List<Queue> rabbitQueues;

    public Integer getCounts(String queueName){
        //find your queue from rabbitQueues
        //return the 
        props = admin.getQueueProperties(queue.getName());
        return Integer.parseInt(props.get("QUEUE_MESSAGE_COUNT");        
    }
}

您的第二个消费者必须等到queue1上没有消息:

public class MessageConsumer2{
@Autowired
QueueStatsProcessor queueStatesProcesor;

public void consume(){
    while(queueStatesProcesor.getCounts("queue1")  > 0){
        Thread.sleep(1000);
    }
    //do your own work
}

}

我认为这种逻辑“手动”管理起来有点复杂,我建议你使用Spring IntegrationApache Camel之类的东西。