【发布时间】: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