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,使其从同一父级继承或实现相同的接口。
我正在尝试向消费者发送一条来自客户端的消息。消费者期望许多消息类型,如预订或确认。因此,当我收到消息时,我试图查看该消息是预订实例还是确认实例。到目前为止,实例不起作用,我看不到对象是预订还是确认。此外,我的 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,使其从同一父级继承或实现相同的接口。