将数据发送到队列和侦听在同样的功能数据

问题描述 投票:0回答:1

我试图创造一个我发送一个JMS消息到一个队列,听在不同的队列中的响应函数。这两个队列是不同的,我想返回时,响应可从第二队列。我应该怎么办呢?我应该做的,而(真)?做一个MessageListener好像强迫我调用另一个函数,用来接收答案时,我想与发送数据的响应返回的功能。

java java-ee jboss jms message-queue
1个回答
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"));
© www.soinside.com 2019 - 2024. All rights reserved.