我有一个webapp,可以从外部应用程序获取和显示数据,只能通过消息传递(JMS)访问。
因此,如果用户在浏览器上提交请求,则相同的HTTP请求线程必须与Messaging系统(MQ Series)交互,以便相同的请求线程可以显示从Messaging System接收的数据。
我可以在这里使用一种模式吗?我在网上看到了一些模糊的引用,它们以这种方式使用“Correlation ID”:
Msg m = new TextMsg("findDataXYZ");
String cr_id = m.setCorrelationID(id);
sendQueue.send(m).
// now start listening to the Queue for a msg that bears that specific cr_id
Response r = receiverQueue.receive(cr_id);
那里有更好的东西吗?我发现的其他模式希望响应是异步接收的......这对我来说不是一个选项,因为我必须在同一个HTTP请求上发回响应。
首先,打开响应队列。然后将该对象传递给消息上的set reply-to方法。这样,响应您的请求的服务就知道在哪里发送回复。通常,服务会将消息ID复制到相关ID字段,因此在您发送消息时,请获取您返回并使用的消息ID 那 听取回复队列。当然,如果您使用动态回复队列,即使这不是必要的 - 只需侦听队列中的下一条消息。
有示例代码显示所有这些。如果您安装到默认位置,示例代码将保留在 "C:\Program Files (x86)\IBM\WebSphere MQ\tools\jms\samples\simple\SimpleRequestor.java"
在Windows框或 /var/mqm/toolsjms/samples/simple/SimpleRequestor.java
在* nix框上。
你有机会想知道“安装什么,确切地说?” WMQ客户端安装可免费下载 SupportPac MQC71。
首先,打开响应队列。然后将该对象传递给消息上的set reply-to方法。这样,响应您的请求的服务就知道在哪里发送回复。通常,服务会将消息ID复制到相关ID字段,因此在您发送消息时,请获取您返回并使用的消息ID 那 听取回复队列。当然,如果您使用动态回复队列,即使这不是必要的 - 只需侦听队列中的下一条消息。
有示例代码显示所有这些。如果您安装到默认位置,示例代码将保留在 "C:\Program Files (x86)\IBM\WebSphere MQ\tools\jms\samples\simple\SimpleRequestor.java"
在Windows框或 /var/mqm/toolsjms/samples/simple/SimpleRequestor.java
在* nix框上。
你有机会想知道“安装什么,确切地说?” WMQ客户端安装可免费下载 SupportPac MQC71。
请求/回复消息传递模式对您的要求很有用。您通常使用CorrelationId来关联请求和回复消息。
在发送请求消息时,您可以在消息上设置JMSReplyTo目标。通常,临时队列用作JMSReplyTo目标。在创建消费者以接收响应时,使用带有JMSCorrelationId的选择器,类似于
cons = session.createConsumer(tempDestination,"JMSCorrelationId="+requestMsg.JMSMessageId);
另一方面,处理请求消息的应用程序必须使用JMSReplyTo目标来发送响应。它还必须使用请求消息的MessageId并将其设置为响应消息的CorrelationId。