JMS 如何使用 JMS MessageListener 获取多条消息

JMS how to get mulitple messages with JMSMessageListener

我正在尝试向消费者发送一条来自客户端的消息。消费者期望许多消息类型,如预订或确认。因此,当我收到消息时,我试图查看该消息是预订实例还是确认实例。到目前为止,实例不起作用,我看不到对象是预订还是确认。此外,我的 JMSMessageListener 似乎不是执行该场景的最佳方式。 场景是: 客户端向代理发送预订,代理将消息转发给不同的消费者,代理获得消费者的确认并发回确认。 任何想法为什么实例不起作用以及对于这种情况,这是为多个目的的代理实现 JMSMessageListener 的好方法吗?

//JMS Message Listener
public class JMSAgentMessageListener implements MessageListener {

    private ConnectionFactory factory = null;
    private Connection connection = null;
    private Session session = null;
    private  Destination BookingQueue = null;
    private  Destination consolidatorQueue1 = null;
    private  Destination consolidatorQueue2 = null;
    private MessageConsumer consumer = null;
    private Destination agentConfirmQueue = null;
    private static MessageProducer producer = null;
    final static Logger logger = Logger.getLogger(TravelAgent.class);
    private  Destination customerConfirmQueue = null;

    @Override
    public void onMessage(Message message) {
        try {
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory( "tcp://localhost:61616");
            // Create a Connection
            Connection connection = connectionFactory.createConnection();
            session = connection.createSession(false,
                    Session.AUTO_ACKNOWLEDGE);

            if (message instanceof Booking) {

                Booking booking = (Booking) message;
                logger.info("# Received order for " + booking.getCustomer());
                customerConfirmQueue = message.getJMSReplyTo();

                logger.info("# The travel agent forwards booking orders to the airfare consolidators");
                 ObjectMessage messageToConsilator1 = session . createObjectMessage ( booking ) ;
                 agentConfirmQueue = session.createQueue("AgentConfirmQueue");
                 consolidatorQueue1 = session.createQueue("ConsolidatorQueue1");
                 messageToConsilator1.setJMSReplyTo(agentConfirmQueue);
                 messageToConsilator1.setJMSDestination(consolidatorQueue1);

                producer = session.createProducer(consolidatorQueue1);
                producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                producer.send(messageToConsilator1);

                }else if(message instanceof Confirmation){
                    logger.info("# The travel agent recieved booking orders to the airfare consolidators");
                    Confirmation confirmation = (Confirmation) message;
                    logger.info(confirmation.getMessage()+"received");
                    logger.info("# The travel agent notfiying the customers");

                     ObjectMessage messageToClient = session . createObjectMessage ( confirmation ) ;
                     customerConfirmQueue = session.createQueue("customerConfirmQueue");

                    producer = session.createProducer(customerConfirmQueue);
                    producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                    producer.send(messageToClient);
                }
                producer.close();
                session.close();
                connection.close();

        } catch (JMSException e) {
            logger.error("couldnt get the message");
        }


    }
}

Message 不在您的 class 继承树的层次结构中。 JMS提供,可以传播的不同类型的消息,Text,Object等,都继承自Message。您可以将这些类型称为 on 的实例。一旦 Message 被转换为 ObjectMessage,您就可以调用 getObject(),然后为您的类型转换 it/check instanceof

我建议限制可以针对某个主题发送的消息类型,因为它会导致一些更混乱的代码。我尽量避免使用 instanceof,方法是通过重构代码使其变得不必要。为了减少对 instanceof 的需求,我会根据要传达的信息类型创建一个主题,或者开发您的 classes,使其从同一父级继承或实现相同的接口。