我正在尝试创建一个函数,将 JMS 消息发送到队列并在不同的队列上监听响应。这两个队列不同,我想在第二个队列中有可用响应时返回。我该怎么做?我应该做 while(true) 吗?当我想返回带有发送数据的响应的函数时,执行 MessageListener 似乎迫使我调用另一个函数来接收答案。
最佳答案
有很多方法可以做到这一点,但我认为 JMS 1.1 中最简单的方法是使用 javax.jms.QueueRequestor 。这是一个简单的界面,它负责处理您在手动请求/响应模式中使用的所有样板代码。例如,请求者可能如下所示:
InitialContext initialContext new InitialContext();
Queue queue = (Queue) initialContext.lookup("myQueue");
QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
QueueConnection connection = cf.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
QueueRequestor queueRequestor = new QueueRequestor(session, queue);
TextMessage request = session.createTextMessage("Hello, World!");
TextMessage reply = (TextMessage) queueRequestor.request(request);
queueRequestor.close();
那么获取消息并提供响应的组件可能如下所示:
InitialContext initialContext new InitialContext();
Queue queue = (Queue) initialContext.lookup("myQueue");
QueueConnectionFactory cf = (QueueConnectionFactory) initialContext.lookup("ConnectionFactory");
QueueConnection connection = cf.createQueueConnection();
connection.start();
QueueSession session = connection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer messageConsumer = session.createConsumer(queue);
TextMessage request = (TextMessage) messageConsumer.receive();
TextMessage reply = session.createTextMessage("reply: " + request.getText());
Destination replyTo = request.getJMSReplyTo();
try (MessageProducer producer = session.createProducer(replyTo)) {
producer.send(reply);
}
如果您的 JMS 提供程序支持 2.0,那么您可以为发送请求的客户端执行类似以下操作:
InitialContext initialContext new InitialContext();
Queue requestQueue = (Queue) initialContext.lookup("requestQueue");
Queue responseQueue = (Queue) initialContext.lookup("responseQueue");
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
String correlationID = UUID.randomUUID().toString();
JMSContext context = cf.createContext();
context.createProducer().setJMSCorrelationID(correlationID).send(requestQueue, context.createTextMessage("requestMessage"));
Message reply = context.createConsumer(responseQueue, "JMSCorrelationID = '" + correlationID + "'").receive();
对于响应者来说,类似这样的事情:
InitialContext initialContext new InitialContext();
Queue requestQueue = (Queue) initialContext.lookup("requestQueue");
Queue responseQueue = (Queue) initialContext.lookup("responseQueue");
ConnectionFactory cf = (ConnectionFactory) initialContext.lookup("ConnectionFactory");
JMSContext context = cf.createContext();
Message request = context.createConsumer(requestQueue).receive();
context.createProducer().setJMSCorrelationID(request.getJMSCorrelationID()).send(responseQueue, context.createTextMessage("responseMessage"));
关于java - 将数据发送到队列并在同一函数中监听数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54563310/