Java ActimeMQ一个生产者,两个队列(正常作业和紧急作业),两个消费者(两个队列分开)

Java ActimeMQ一个生产者,两个队列(正常作业和紧急作业),两个消费者(两个队列分开),java,jms,activemq,Java,Jms,Activemq,我有两种类型的工作(紧急工作和正常工作)要发送处理。处理引擎只有一个实例,一次只能处理一个作业。现在要求先发送4个紧急作业进行处理,然后发送2个正常作业 我已经用两个队列(N.Q和E.Q)和一个生产者发送作业来完成poc public void receive() throws JsonParseException, JsonMappingException, IOException { try { Connection connectionEmergency = fac

我有两种类型的工作(紧急工作和正常工作)要发送处理。处理引擎只有一个实例,一次只能处理一个作业。现在要求先发送4个紧急作业进行处理,然后发送2个正常作业

我已经用两个队列(N.Q和E.Q)和一个生产者发送作业来完成poc

public void receive() throws JsonParseException, JsonMappingException, IOException {
    try {
        Connection connectionEmergency = factory.createConnection();
        connectionEmergency.start();
        Session sessionEmergency = connectionEmergency.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destinationEmergency = sessionEmergency.createQueue("EMERGENCYQUEUE");
        MessageConsumer consumerEmergency = sessionEmergency.createConsumer(destinationEmergency);

        Connection connectionNormal = factory.createConnection();
        connectionNormal.start();
        Session sessionNormal = connectionNormal.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destinationNormal = sessionNormal.createQueue("NORMALQUEUE");
        MessageConsumer consumerNormal = sessionNormal.createConsumer(destinationNormal);

        int countNormal = 0;
        int countEmergency = 0;
        while (true) {

            while (countEmergency < 4) {
                TextMessage message = (TextMessage) consumerEmergency.receive(1000);
                if (message != null) {
                    sendForDeployment(message.getText(), (countEmergency + 1));
                } else {
                    System.out.println("************Message is null in Emergency**********");
                    break;
                }
                countEmergency++;
            }
            countEmergency = 0;

            while (countNormal < 2) {
                TextMessage message2 = (TextMessage) consumerNormal.receive(1000);
                if (message2 != null) {
                    sendForDeployment(message2.getText(), (countNormal + 1));
                } else {
                    System.out.println("*************Message is null in Normal***********");
                    break;
                }
                countNormal++;
            }
            countNormal = 0;
        }
    } catch (JMSException e) {
        e.printStackTrace();
    } 
}
public void receive()抛出JsonParseException、JsonMappingException、IOException{
试一试{
Connection connectionEmergency=factory.createConnection();
connectionEmergency.start();
Session sessionEmergency=connectionEmergency.createSession(false,Session.AUTO_-ACKNOWLEDGE);
Destination destinationEmergency=sessionEmergency.createQueue(“EMERGENCYQUEUE”);
messageconsumeremergency=sessionEmergency.createConsumer(destinationEmergency);
connectionNormal=factory.createConnection();
connectionNormal.start();
会话sessionNormal=connectionNormal.createSession(false,Session.AUTO_-ACKNOWLEDGE);
Destination destinationNormal=sessionNormal.createQueue(“NORMALQUEUE”);
MessageConsumer consumerNormal=sessionNormal.createConsumer(destinationNormal);
int countNormal=0;
int countEmergency=0;
while(true){
而(countEmergency<4){
TextMessage=(TextMessage)consumerEmergency.receive(1000);
如果(消息!=null){
sendForDeployment(message.getText(),(countEmergency+1));
}否则{
System.out.println(“*************消息在紧急情况下为空**********”;
打破
}
countEmergency++;
}
countEmergency=0;
while(countNormal<2){
TextMessage message2=(TextMessage)consumerNormal.receive(1000);
if(message2!=null){
sendForDeployment(message2.getText(),(countNormal+1));
}否则{
System.out.println(“*************消息在正常情况下为空,*************”;
打破
}
countNormal++;
}
countNormal=0;
}
}捕获(JME){
e、 printStackTrace();
} 
}

此代码的问题在于,当两个队列都为空时,它会持续运行:(我想等待队列变空,当队列中的任何一个得到消息时,都会重新触发。请帮助它找到更好的解决方案。

对于基于事件的计算,您是否考虑过使用主题而不是队列?如果您在听到消息时听到通知的主题。如果您担心丢失消息,请注意。谢谢你回复阿克塞尔,实际上我是JMS的新手,你能用一些例子来解释一下吗?因为我没有得到如何处理从主题到处理引擎的消息。我不确定我理解你的用例,但是你应该尝试使用Cuffer-AdvaseCnEngaseLististor。(…)和consumerNormal.setMessageListener(…)方法。然后您的处理是异步的-将调用回调,而不必为示例轮询。暂时忘记主题。但我需要发送从两个队列接收的消息,以便以某种模式进行处理,如来自E.Q的前4条消息,然后来自N.Q的2条消息。如果假设E.Q没有4条消息或者清空,而不是在那里等待,N.Q消费者应该开始处理。我希望你明白我的意思。如果我使用aync方法,我不知道如何获得此功能。实际上,与N.Q的消息相比,E.Q的消息应该有更多的机会运行。所以我决定处理4条来自N.Q的消息,然后处理2条来自E.Q的消息。