服务器端Web服务异步的推荐模式

时间:2013-03-15 15:13:14

标签: java web-services design-patterns asynchronous server-side

我已经成功实现了轮询和回调客户端端异步示例,但现在我对实现具有服务器端异步的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通过在Web服务端点上发送包含JMS队列2的相关器ID的消息来确认服务请求。 (我假设此相关器ID将是生成的JMS消息ID。)
  5. MDB确认原始邮件将其从队列1中删除。
  6. MDB开始长时间运行数据库查询,可能使用相关器ID将结果构建到临时表 检索关键。
  7. Web服务端点通过SOAP over HTTP将包含相关器ID的回复发送回客户端。
  8. 我猜测,因为拿起结果不涉及长查询,我不需要JMS,我可以简单地查询数据库以查看结果是否准备就绪。所以,第二个操作是:

    1. 客户端通过SOAP over HTTP调用具有相关器ID的Web服务端点操作2。
    2. Web服务使用相关器ID查询数据库。结果代码为:未找到结果,操作仍在进行中,或 结果发现。
    3. Web服务以某种复杂的结构响应客户端,将结果代码与任何结果结合起来。
    4. 所以,我有很多问题。我已经看到一些对服务器端支持异步的引用,但它们似乎都在某种程度上是服务器特定的。例如,我已经看到了一个完全描述第一个操作的图表,但它似乎是特定于OC4J的。如果有人可以指导我实现这样的通用示例或教程,请执行。其他可能是,我应该使用JMS消息ID作为相关器返回客户端吗?我假设我应该使用CLIENT-ACKNOWLEDGE作为JMS会话模式,以便MDB可以向Web服务发送回复,然后从队列中删除该消息。或者,我应该打扰吗? Web服务端点是否应该生成JMS消息,将其弹出队列并将消息ID直接返回给服务客户端,而不经过让MDB通过JMS队列2发送回相关器的所有麻烦? [编辑:实际上,我越是考虑它,Web服务发送消息似乎是错误的,然后阻止等待队列2的回复? ]

1 个答案:

答案 0 :(得分:0)

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