草庐IT

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

coder 2024-03-18 原文

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

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/

有关java - 基于中间件的 HTTP/JMS 混合 SOAP 的请求-回复模型的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  3. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  6. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  7. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  8. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  9. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐