将数据发送到Queue并以相同的功能监听数据

时间:2019-02-06 22:07:17

标签: java java-ee jboss jms message-queue

我正在尝试创建一个函数,在该函数中,我将JMS消息发送到队列并在另一个队列上侦听响应。两个队列不同,我想在第二个队列有响应时返回。我应该怎么做?我应该做while(true)吗?当我想返回带有发送数据的响应的函数时,执行MessageListener似乎迫使我调用另一个函数来接收答案。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点,但是我认为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"));