我想在路由结束时处理请求和响应消息。但是,我看不到如何访问原始请求消息的方法。
我有一种可怕的感觉,我正在为一些基本概念而苦苦挣扎。
这是 DSL 中的一个简单示例路由,用于概述我的问题(为整个上下文启用了流缓存):
from("activemq:queue:myQueue")
.to("log:" + getClass().getName() + "?showOut=true")
.to("http://localhost:8080/someBackend")
.log("Now in.Body returns this: ${in.body} and out.Body this: ${out.body}")
.to("log:" + getClass().getName() + "?showOut=true");
这是我的日志的相应摘录(为了更好地阅读而编辑了换行符)。可以看到,一旦 http 服务器回复,原始的 SOAP 消息就丢失了,SOAP 响应对象存储在消息的 inBody 中。
2012-09-25 17:28:08,312 local.bar.foo.MyRouteBuilder INFO -
Exchange[ExchangePattern:InOut, BodyType:byte[],
Body:<?xml version="1.0" encoding="UTF-8"?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Header /><env:Body><urn:someRequest xmlns:urn="http://foo.bar.local/ns"></urn:someRequest></env:Body></env:Envelope>,
Out: null]
2012-09-25 17:28:08,398 org.apache.camel.component.http.HttpProducer DEBUG -
Executing http POST method: http://localhost:8080/someBackend
2012-09-25 17:28:09,389 org.apache.camel.component.http.HttpProducer DEBUG -
Http responseCode: 200
2012-09-25 17:28:09,392 route2 INFO -
Now in.Body returns this: <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:someResponse xmlns:ns2="http://foo.bar.local/ns"</ns2:someResponse></soap:Body></soap:Envelope>
and out.Body this:
2012-09-25 17:28:09,392 local.bar.foo.MyRouteBuilder INFO -
Exchange[ExchangePattern:InOut,
BodyType:org.apache.camel.converter.stream.InputStreamCache,
Body:[Body is instance of org.apache.camel.StreamCache],
Out: null]
我本来希望在整个路线上保留 in.body 和 out.body ?
我正在考虑的替代解决方案:
- 利用Correlation Identifier模式来关联请求和回复。但这也会保留消息正文吗?此外,我的请求/回复消息没有用于关联的唯一标识符。
- 编写一个自定义 bean,它执行对 http 后端的调用,同时处理请求和回复对象(但这基本上是一个非 Camel 解决方案,重新发明轮子,因此不是首选)
已经失败的方法:
我尝试在路由结束时使用这样的处理器访问原始请求消息,但没有成功:
process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Message originalInMessage = exchange.getUnitOfWork().getOriginalInMessage();
logger.debug(originalInMessage.getBody(String.class));
logger.debug(exchange.getIn().getBody(String.class));
}
});
谢谢你的帮助