0

我已经成功地实现了轮询和回调客户端异步示例,但现在我对实现具有服务器端异步的 Web 服务感兴趣。基础架构是使用 JBoss AS 6.x 的 Java EE。

我试图实现的模式(据我所知)将涉及两个 Web 服务操作,一个是发起请求,另一个是检查请求是否完成并检索结果。

  1. 客户端通过 SOAP over HTTP 使用搜索参数调用 Web 服务端点操作 1。
  2. Web 服务端点通过 JMS 队列 1 将请求发送到消息驱动 bean。
  3. 消息驱动 bean (MDB) 从队列 1 中获取请求。
  4. MDB 通过通过 JMS 队列 2 向 Web 服务端点发送包含相关因子 ID 的消息来确认服务请求。(我假设这个相关器 ID 将是生成的 JMS 消息 ID。)
  5. MDB 确认原始消息以将其从队列 1 中删除。
  6. MDB 开始长时间运行数据库查询,可能使用相关因子 ID 作为检索键将结果构建到临时表中。
  7. Web 服务端点通过 HTTP 上的 SOAP 将包含相关因子 ID 的回复发送回客户端。

我猜,由于获取结果不需要长查询,我不需要 JMS,我可以简单地查询数据库以查看结果是否准备好。所以,第二个操作是:

  1. 客户端通过 HTTP 上的 SOAP 调用具有相关器 ID 的 Web 服务端点操作 2。
  2. Web 服务使用相关器 ID 查询数据库。结果代码将是:未找到结果、操作仍在进行中或找到结果。
  3. Web 服务以某种复杂的结构响应客户端,将结果代码与任何结果结合起来。

所以,我有很多问题。我已经看到了一些对服务器端异步支持的引用,但它们似乎都以某种方式特定于服务器。例如,我看到了一个准确描述第一个操作的图表,但它似乎是特定于 OC4J 的。如果有人可以将我引导到一个通用示例或实现类似这样的教程,请这样做。其他子任务可能是,我是否应该使用 JMS 消息 ID 作为相关因子返回给客户端?我假设我应该使用 CLIENT-ACKNOWLEDGE 作为 JMS 会话模式,以便 MDB 可以向 Web 服务发送回复,然后从队列中删除消息。或者,我应该打扰吗?如果 Web 服务端点只生成 JMS 消息,将其弹出队列并将消息 ID 直接返回给服务客户端,而无需经历让 MDB 通过 JMS 队列 2 发回相关器的所有繁琐工作?[编辑:实际上,我考虑得越多,Web 服务会发送一条消息然后,什么,阻塞等待队列 2 的回复似乎是错误的?]

4

1 回答 1

0

Correlation id 可以在步骤 2 中生成并立即返回给客户端。这在响应客户端之前减少了额外的跃点。将持久消息生成到队列中就足够了。我也没有看到需要两个队列。我更喜欢应用程序生成的相关 ID。

于 2013-03-15T16:42:53.343 回答