11

我有一个 Web 应用程序,它可以从只能通过消息传递 (JMS) 访问的外部应用程序获取和显示数据。

因此,如果用户在浏览器上提交请求,同一个 HTTP 请求线程将不得不与消息系统(MQ 系列)交互,以便同一个请求线程可以显示从消息系统接收到的数据。

有没有我可以在这里使用的模式?我在网上看到一些以这种方式使用“相关 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 请求上发回响应。

4

2 回答 2

10

请求/回复消息传递模式对您的要求很有用。您通常使用 CorrelationId 来关联请求和回复消息。

在发送请求消息时,您在消息上设置 JMSReplyTo 目的地。通常,临时队列用作 JMSReplyTo 目标。创建消费者以接收响应时,请使用带有 JMSCorrelationId 的选择器,例如

cons = session.createConsumer(tempDestination,"JMSCorrelationId="+requestMsg.JMSMessageId);

在另一端,正在处理请求消息的应用程序必须使用 JMSReplyTo 目标来发送响应。它还必须使用请求消息的 MessageId 并将其设置为响应消息的 CorrelationId。

于 2012-05-28T04:13:13.123 回答
5

首先,打开响应队列。然后将该对象传递给消息上的 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免费下载。

于 2012-05-28T03:41:37.590 回答