将数据发送到队列并在同一功能中侦听数据
Sending data to Queue and listening for data in same function
我正在尝试创建一个函数,在该函数中我将 JMS 消息发送到队列并在不同的队列上侦听响应。这两个队列不同,当第二个队列的响应可用时,我想 return。我应该怎么做?我应该做 while(true) 吗?当我想 return 具有发送数据的响应的函数时,执行 MessageListener 似乎迫使我调用另一个函数来接收答案。
有很多方法可以做到这一点,但我认为 JMS 1.1 中最简单的方法是使用 javax.jms.QueueRequestor。这是一个简单的界面,它处理几乎所有您将使用手动 request/response 模式的样板代码。例如,请求者可能如下所示:
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"));
我正在尝试创建一个函数,在该函数中我将 JMS 消息发送到队列并在不同的队列上侦听响应。这两个队列不同,当第二个队列的响应可用时,我想 return。我应该怎么做?我应该做 while(true) 吗?当我想 return 具有发送数据的响应的函数时,执行 MessageListener 似乎迫使我调用另一个函数来接收答案。
有很多方法可以做到这一点,但我认为 JMS 1.1 中最简单的方法是使用 javax.jms.QueueRequestor。这是一个简单的界面,它处理几乎所有您将使用手动 request/response 模式的样板代码。例如,请求者可能如下所示:
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"));