我有两个消息监听器,每个监听器都在同一个RabbitMQ服务器上监听它自己的消息队列。
现在,当第一个侦听器在其队列上收到消息时,它必须询问其他侦听器是否有任何消息要在其队列中处理,如果有,则等待此消息由第二个听众继续执行它自己的执行。
我需要这样的东西:
SimpleMessageListenerContainer first;
SimpleMessageListenerContainer second;
if(second.hasReceivedMessageButItsStillNotProcessed){
Thread.waitUntilSecondProcessesAMessage();
}
或者像这样
while(rabbitAdmin.getQueueProperties("qName").get("UNACKED_MSG_COUNT")>0){
Thread.waitUntilSecondProcessesAMessage();
}
任何帮助表示感谢。
答案 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 Integration或Apache Camel之类的东西。