推荐模式我已经成功实施轮询和回调客户端异步的例子,但现在我很感兴趣,与服务器端异步实现web服务。基础设施是使用JBoss AS 6.x的Java EE。用于服务器端Web服务异步
我试图实现的模式(包括我的理解)涉及两个Web服务操作,一个发起请求,另一个检查请求是否完成并检索结果。
- 客户端通过SOAP通过HTTP调用带有搜索参数的Web服务端点操作1。
- Web服务端点通过JMS队列1将请求发送到消息驱动bean。
- 消息驱动bean(MDB)从队列1中提取请求。
- MDB通过向Web服务端点发送包含JMS队列2上的相关器ID的消息来确认服务请求。 (我假设将产生此相关器ID的JMS消息ID。)
- MDB确认原始消息从队列1.
- MDB除去它开始长时间运行的数据库查询,大概是构建结果临时表使用相关器ID作为 检索关键字。
- Web服务端点通过HTTP通过SOAP将包含相关器ID的回复发回给客户端。
我猜测,因为拿起结果不涉及长查询,我不需要JMS,我可以简单地查询数据库,看看结果是否准备就绪。因此,第二个操作是:
- 客户端通过HTTP通过SOAP调用带相关器ID的Web服务端点操作2。
- Web服务使用相关器标识查询数据库。结果代码将为:未找到结果,操作仍在进行中,或者找到 结果。
- Web服务以一种结合结果代码和任何结果的复杂结构来响应客户端。
所以,我有很多问题。我已经看到了一些关于异步服务器端支持的参考,但它们似乎都是某种特定于服务器的。例如,我已经看到了一个图来描述这个第一个操作,但它似乎是OC4J特有的。如果任何人都可以指导我实现这样的通用示例或教程,请做。如果我使用JMS消息ID作为相关器返回客户端,其他转储可能是?我假设我应该使用CLIENT-ACKNOWLEDGE作为JMS会话模式,以便MDB可以向Web服务发送回复,然后从队列中删除消息。或者,我还应该打扰吗? Web服务端点是否应该只生成一个JMS消息,将其放入队列中并直接将消息ID返回给服务客户端,而不必通过让MDB通过JMS队列2发回相关器的所有操作。 [编辑:其实,我认为它越多,Web服务会发送一条消息,然后,在等待队列2上的回复时阻塞什么似乎是错误的? ]
同意,特别是因为Web服务操作将不得不阻止并等待答复。 – naql 2013-03-15 17:10:58
总结:我从来没有找到我期待的服务器端异步的例子;我最终按照我所描述的方式进行:Web服务端点获取请求,为“票证号码”命中Oracle序列,将包含请求参数的参数对象和票证号发布到JMS队列,并将票证返回给客户端。 MDB选取JMS消息,将该数据作为主键提取到表中。完成后,MDB将更新状态。然后,进行第二次Web服务操作以检查接受“票号”的状态。如果完成,则返回结果。谢谢。 – naql 2013-04-01 14:48:18