2013-03-15 101 views
0

推荐模式我已经成功实施轮询和回调客户端异步的例子,但现在我很感兴趣,与服务器端异步实现web服务。基础设施是使用JBoss AS 6.x的Java EE。用于服务器端Web服务异步

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

  1. 客户端通过SOAP通过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服务端点通过HTTP通过SOAP将包含相关器ID的回复发回给客户端。

我猜测,因为拿起结果不涉及长查询,我不需要JMS,我可以简单地查询数据库,看看结果是否准备就绪。因此,第二个操作是:

  1. 客户端通过HTTP通过SOAP调用带相关器ID的Web服务端点操作2。
  2. Web服务使用相关器标识查询数据库。结果代码将为:未找到结果,操作仍在进行中,或者找到 结果。
  3. Web服务以一种结合结果代码和任何结果的复杂结构来响应客户端。

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

回答

0

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

+0

同意,特别是因为Web服务操作将不得不阻止并等待答复。 – naql 2013-03-15 17:10:58

+0

总结:我从来没有找到我期待的服务器端异步的例子;我最终按照我所描述的方式进行:Web服务端点获取请求,为“票证号码”命中Oracle序列,将包含请求参数的参数对象和票证号发布到JMS队列,并将票证返回给客户端。 MDB选取JMS消息,将该数据作为主键提取到表中。完成后,MDB将更新状态。然后,进行第二次Web服务操作以检查接受“票号”的状态。如果完成,则返回结果。谢谢。 – naql 2013-04-01 14:48:18