java - 将数据发送到队列并在同一函数中监听数据

标签 java jakarta-ee jboss jms message-queue

我正在尝试创建一个函数,将 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/

相关文章:

java - Spring Data JPA 切片底层 SQL

java - 使用 java DefaultHttpClient 通过 http 将数据发送到 servlet

java - 尝试将实例变量初始化为具有直径和颜色的形状实例

eclipse - 无法更改tomcat url

java - ClassA 无法转换为 ClassA : java. lang.ClassCastException

java - @EJB注解为空

java - 获取在控件的类定义中添加自定义控件的场景的大小

mysql - 用于删除数据库条目的 EJB 计时器

java - 时间同步

xml - Treewalker 异常,Eclipse