我已经成功地实现了轮询和回调客户端异步示例,但现在我对实现具有服务器端异步的 Web 服务感兴趣。基础架构是使用 JBoss AS 6.x 的 Java EE。
我试图实现的模式(据我所知)将涉及两个 Web 服务操作,一个是发起请求,另一个是检查请求是否完成并检索结果。
- 客户端通过 SOAP over HTTP 使用搜索参数调用 Web 服务端点操作 1。
- Web 服务端点通过 JMS 队列 1 将请求发送到消息驱动 bean。
- 消息驱动 bean (MDB) 从队列 1 中获取请求。
- MDB 通过通过 JMS 队列 2 向 Web 服务端点发送包含相关因子 ID 的消息来确认服务请求。(我假设这个相关器 ID 将是生成的 JMS 消息 ID。)
- MDB 确认原始消息以将其从队列 1 中删除。
- MDB 开始长时间运行数据库查询,可能使用相关因子 ID 作为检索键将结果构建到临时表中。
- Web 服务端点通过 HTTP 上的 SOAP 将包含相关因子 ID 的回复发送回客户端。
我猜,由于获取结果不需要长查询,我不需要 JMS,我可以简单地查询数据库以查看结果是否准备好。所以,第二个操作是:
- 客户端通过 HTTP 上的 SOAP 调用具有相关器 ID 的 Web 服务端点操作 2。
- Web 服务使用相关器 ID 查询数据库。结果代码将是:未找到结果、操作仍在进行中或找到结果。
- Web 服务以某种复杂的结构响应客户端,将结果代码与任何结果结合起来。
所以,我有很多问题。我已经看到了一些对服务器端异步支持的引用,但它们似乎都以某种方式特定于服务器。例如,我看到了一个准确描述第一个操作的图表,但它似乎是特定于 OC4J 的。如果有人可以将我引导到一个通用示例或实现类似这样的教程,请这样做。其他子任务可能是,我是否应该使用 JMS 消息 ID 作为相关因子返回给客户端?我假设我应该使用 CLIENT-ACKNOWLEDGE 作为 JMS 会话模式,以便 MDB 可以向 Web 服务发送回复,然后从队列中删除消息。或者,我应该打扰吗?如果 Web 服务端点只生成 JMS 消息,将其弹出队列并将消息 ID 直接返回给服务客户端,而无需经历让 MDB 通过 JMS 队列 2 发回相关器的所有繁琐工作?[编辑:实际上,我考虑得越多,Web 服务会发送一条消息然后,什么,阻塞等待队列 2 的回复似乎是错误的?]