gpt4 book ai didi

java - 基于中间件的 HTTP/JMS 混合 SOAP 的请求-回复模型

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:19:15 25 4
gpt4 key购买 nike

我们的一个产品实现了以下单向网络服务结构:

Server <--------------------- Middleware <---------------- Client
SOAP over JMS (queue) SOAP over HTTP

在此模型中,客户端通过 HTTP 将 SOAP 消息发送到我们的中间件 (Progress SonicMQ)。消息被 SonicMQ 推送到 JMS 队列中,我们的服务器从那里获取它们。但是,如您所见,服务器不会向客户端发送响应(异步 JMS)。

我们想为这个模型实现一个响应 channel 。通常建议的解决方案是在中间件中创建一个临时的 replyTo-queue(动态),允许服务器向该队列发送响应。然后,客户端可以获取响应并关闭 replyTo-queue。这听起来很方便,但不幸的是,我们的客户端通过纯 HTTP 而不是 JMS 进行操作,因此他们的客户端无法轻松设置 replyTo 队列。

在这种混合 HTTP/JMS SOAP 模型中实现响应 channel 的一种方法是将中间件配置为在每次成功接收 SOAP 时打开 replyTo 队列,将 replyTo 队列和发送者信息附加到 SOAP 消息,然后推送消息到队列,它会被服务器获取。在接收和处理消息后,服务器可以向中间件中指示的 replyTo-queue 发送响应。最后,中间件将使用 SOAP 消息中的数据(首次收到请求时插入到中间件过程中的数据)通过 HTTP 将响应 (SOAP) 发送回原始客户端。

虽然这可能是可行的,但这听起来有点老套。所以问题是:在我们的案例中有没有更简洁的方法来实现这种请求/响应模型?服务器端已用Java实现。

解决方案:

Progress SonicMQ 支持“Content Reply Send”HTTP Acceptor,可以轻松发送 JMS 回复。 Content Reply Send 接受器以下列方式工作:

  • Acceptor 接收客户端发送的 HTTP 消息
  • 接受器创建一个临时 JMS 队列
  • 接受器构建一个包含 HTTP 主体的 JMS 消息,并将临时队列的标识添加到新创建的 JMS 消息中
  • 接受器将 JMS 消息推送到它的目标队列(不是临时队列)
  • 接受器开始使用临时回复队列
  • 当客户端从原始目标队列中获取消息时,它包含设置的回复队列标识
  • 客户端消费消息
  • 客户端向回复队列发送回复
  • 接受器从队列中接收消息
  • Acceptor 将消息作为 HTTP 发送给最初发送 HTTP 消息的客户端

如果消费者(在我们的例子中是“服务器”)失败并且没有发送导致超时的回复,Sonic 的 HTTP 接受器将向客户端发送一条 HTTP 消息以指示超时。这是 SonicMQ 中非常标准的功能。我想它也存在于其他产品中。

这允许在“服务器”端使用标准 SOAP over JMS(请参阅 skaffman 的回答)避免在中间件中进行任何自定义编程。

虽然我仍然看到 JMS 模型中存在一些问题,但这绝对是一个改进。

2009-11-05 更新:

在进一步研究这个问题之后,事实证明我对 HTTP<-->中间件<-->JMS 的怀疑是相关的。

此模型中存在一些关键问题。带有中间件的同步-异步模型很不方便。要么让两端都实现 JMS 连接(这应该会发生变化),要么在两端都使用 HTTP。将它们混合只会导致头痛。在这两者中,SOAP-over-HTTP 比 SOAP-over-JMS 更简单且支持更好。

再说一次:如果你正在设计这种系统......不要。

最佳答案

我认为您建议的解决方案根本不是 hack,我认为这是正确的解决方案。您有带有同步协议(protocol)的客户端中间层,然后是使用异步层的中间服务器层,您必须向其中添加回复路径以满足同步语义。这就是中间件的用途。请记住,JMS 为临时回复队列提供了明确的支持,您根本不需要弄乱有效负载。

更左翼的可能性是利用 SOAP 1.2 在设计时考虑了 JMS 这一事实,因此您可以在中间件和服务器层之间使用 Web 服务层,它执行 SOAP-over-JMS。这意味着您可以端到端地保留 SOAP,而中间件仅更改传输。

据我所知,唯一支持 JMS 传输的 Web 服务堆栈是 Spring Web Services ,其中的过程和发展是documented here .这也会给你机会将你的 SOAP 层移植到 Spring-WS,这很糟糕 :)

关于java - 基于中间件的 HTTP/JMS 混合 SOAP 的请求-回复模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1621532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com