我们的产品之一实现了以下单向web服务结构:
Server <--------------------- Middleware <---------------- Client
SOAP over JMS (queue) SOAP over HTTP在这个模型中,客户端通过HTTP向我们的中间件发送SOAP消息(进度SonicMQ)。消息被SonicMQ推入JMS队列,我们的服务器从那里获取消息。但是,如您所见,服务器不会向客户机发送响应(异步JMS)。
我们希望对这个模型实现一个响应通道。通常建议的解决方案是在中间件中创建临时应答队列(动态),允许服务器向该队列发送响应。然后,客户端可以获取响应并关闭答复到队列。这听起来很方便,但不幸的是,我们的客户端通过普通HTTP而不是JMS操作,因此它们的客户端无法轻松地设置replyTo队列。
在这种混合HTTP/JMS模型中实现响应通道的一种方法是配置中间件,在每个成功的SOAP接收上打开replyTo队列,将应答到队列和发送方信息附加到SOAP消息中,并将消息推送到队列,在队列中由服务器获取消息。在接收和处理消息之后,服务器可以向中间件中指定的应答队列发送响应。最后,中间件将通过HTTP将响应( SOAP )发送回原始客户端,方法是使用SOAP消息中的数据(第一次接收请求时插入到中间件过程中的数据)。
虽然很有可能,但这听起来有点烦人。因此,问题是:在我们的情况下,有什么更干净的方法来实现这样的请求/响应模式?服务器端已经用Java实现了。
解决方案:
Progress支持“内容回复发送”,它允许轻松发送JMS。内容回复发送受体的工作方式如下:
如果使用者(在本例中为“server”)失败而不发送导致超时的回复,Sonic的HTTP受体将向客户端发送一条HTTP消息,指示超时。这是SonicMQ中的一个非常标准的特性。我想它也存在于其他产品中。
这允许在“服务器”端使用标准server(请参阅skaffman的答案),以避免中间件中的任何自定义编程。
不过,我仍然看到JMS模型中存在一些问题,但这无疑是一个改进。
更新2009-11-05:
在进一步研究这个问题之后,我发现我对HTTP<->中间件<-->JMS的怀疑是相关的。
该模型存在一些关键问题。使用中间件的同步-异步模型很不方便。要么具有两端实现JMS连接(这应该会影响),要么在两端使用HTTP。混合它们只会导致头痛。在这两者中,supported比supported更简单和更受支持.
再一次:如果你在设计这样的系统.别。
发布于 2009-10-25 18:46:55
我不认为你建议的解决方案是黑客,我认为这是正确的解决方案。您有具有同步协议的客户端中间层,然后是使用异步层的中间服务器层,为了满足同步语义,必须向该层添加应答路径。这就是中间件的用途。请记住,JMS为临时应答队列提供了明确的支持,您根本不需要处理有效负载。
一个更左的可能性是利用SOAP1.2是考虑到JMS的事实,因此您可以在中间件和服务器层之间使用web服务层来实现server。这意味着您可以保持SOAP从端到端,中间件只更改传输。
我所知道的唯一支持JMS传输的web服务堆栈是Spring服务,其中的流程和开发是记录在这里。这也会让您有机会将SOAP层移植到Spring,这会让您轻松:)
发布于 2009-10-25 18:32:45
为什么不添加一个链接到一个页面,让用户检查什么时候响应准备好了,一个联邦快递跟踪器ID?当用户发送请求时,向他们提供跟踪器ID。
这将符合HTTP请求/响应成语,并且您的用户仍然知道该请求是“触发和遗忘”。
https://stackoverflow.com/questions/1621532
复制相似问题