【问题标题】:Http request and response lost after receiving Response from Web Service?收到来自Web Service的响应后,Http请求和响应丢失?
【发布时间】:2014-11-04 11:02:03
【问题描述】:

我有一个与 Web 服务对话的 Apache camel 应用程序。这纯粹是一个集成(中介)应用程序。我们接受 REST 请求并将其转换为 SOAP 消息(使用 VM 模板)并调用 Web 服务。接收来自 Web 服务的响应,将其转换为 JSON 并发送回我们的客户端。

REST ---->转换为 SOAP req (Velocity 模板) ---->调用 WS ---->接收响应---->转换为 JSON---->返回响应给调用者。

我们正在使用 servlet 端点来接收来自客户端的请求。我们可以在调用 web 服务之前从 exchange 中获取 HttpSession 对象,如下所示:

HttpServletRequest req = exchange.getIn().getBody(HttpServletRequest.class);
HttpSession session = req.getSession();

但是,问题是在收到来自 Web 服务的响应后,我无法从 Exchange 获取 HTTPSession。如果我在调试模式下检查 Exchange 对象,Exchange.getIn() 的类型是 DefaultMessage 而不是 HttpMessage。这就是我认为我丢失了请求和响应对象的原因。

我尝试将交换模式设置为 InOut,但这无济于事。 我能找到的唯一解决方案是将 in 消息的原始正文存储在标头或属性中,并在最后检索它。但我认为必须有更好的解决方案。

有人可以帮忙吗?

注意:我们需要 HttpSession 以便我们可以为我们的请求创建的会话存储相应的会话信息,例如在 WS 上创建的会话 ID。我们不能将在 WS 上创建的会话信息传递给我们的调用者,并且需要在我们的应用程序中放置一个位置来保存此映射信息。 HttpSession 满足这个要求。有没有更好的办法?

【问题讨论】:

  • 您尝试过 Content Enricher (camel.apache.org/content-enricher.html) 模式吗?
  • @Sergey 谢谢你回答我的问题。我尝试使用丰富的 EIP。理论上这是最好的方法,但由于使用 VM 模板,我遇到了问题。正如我所说,我们使用 VM 模板来准备 SOAP 请求。在我调用

标签: apache-camel


【解决方案1】:

您可以将http会话存储为交换属性,骆驼将这些属性复制到交换中,以便您可以在需要时在路由中访问它。

【讨论】:

  • 谢谢@willem-jiang。您建议的方法达到了目的。我尝试使用 Enrich EIP,但遇到了一些问题。
猜你喜欢
  • 1970-01-01
  • 2022-11-20
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2020-06-21
相关资源
最近更新 更多