在阅读一次之后,我似乎正在失去我的"身体".请注意,我正在使用Camel的流缓存,并且输入是来自http组件的json文件.我有一个处理器,代码如下.
log.debug("Body Type: " + exchange.getIn().getBody().getClass().getCanonicalName());
log.debug("In msg1:" + exchange.getIn().getBody(String.class));
log.debug("In msg2:" + exchange.getIn().getBody(String.class));
Run Code Online (Sandbox Code Playgroud)
我期望在这里看到的是msg1和msg2是相同的输出,但是msg2返回一个空字符串(非空).以下是TRACE级别的日志.
1- DEBUG com.mycompany.MyProcessor : Body Type: org.apache.camel.converter.stream.InputStreamCache
2- TRACE org.apache.camel.impl.converter.DefaultTypeConverter : Converting org.apache.camel.converter.stream.InputStreamCache -> java.lang.String with value: org.apache.camel.converter.stream.InputStreamCache@780a5cef
3- TRACE org.apache.camel.impl.converter.DefaultTypeConverter : Using converter: StaticMethodTypeConverter: public static java.lang.String org.apache.camel.converter.IOConverter.toString(java.io.InputStream,org.apache.camel.Exchange) throws java.io.IOException to convert [class org.apache.camel.converter.stream.InputStreamCache=>class java.lang.String]
4- DEBUG com.mycompany.MyProcessor : In msg1:{myJson}
5- TRACE org.apache.camel.impl.converter.DefaultTypeConverter : Converting org.apache.camel.converter.stream.InputStreamCache -> java.lang.String with value: org.apache.camel.converter.stream.InputStreamCache@780a5cef
6- TRACE org.apache.camel.impl.converter.DefaultTypeConverter : Using converter: StaticMethodTypeConverter: public static java.lang.String org.apache.camel.converter.IOConverter.toString(java.io.InputStream,org.apache.camel.Exchange) throws java.io.IOException to convert [class org.apache.camel.converter.stream.InputStreamCache=>class java.lang.String]
7- DEBUG com.mycompany.MyProcessor : In msg2:
Run Code Online (Sandbox Code Playgroud)
日志中要注意的事项:
那么msg2在哪里?
编辑
除了Peter的答案之外,还有一些事情需要提及:
Camel的MessageHelper静态类有两个有用的功能:
resetStreamCacheextractBodyAsString这两种情况都有助于这种情况
使用流缓存允许您在不同的处理器中多次读取流,但在同一处理器中仍然只能读取一次.
我测试过:
ModelCamelContext context = new DefaultCamelContext();
context.setStreamCaching(true); //!!
// ...
from("direct:start")
.to("http://ip.jsontest.com/?callback=showMyIP")
.process(new MyProcessor())
.process(new MyProcessor());
Run Code Online (Sandbox Code Playgroud)
和:
public class MyProcessor implements Processor {
private static final Logger LOG = LoggerFactory.getLogger(HttpStreamCache.MyProcessor.class);
@Override
public void process(final Exchange exchange) throws Exception {
LOG.info("***** Body Type: " + exchange.getIn().getBody().getClass().getCanonicalName());
LOG.info("***** In msg1 : " + exchange.getIn().getBody(String.class));
LOG.info("***** In msg2 : " + exchange.getIn().getBody(String.class));
}
};
Run Code Online (Sandbox Code Playgroud)
这打印:
INFO ***** Body Type: org.apache.camel.converter.stream.InputStreamCache
INFO ***** In msg1 : showMyIP({"ip": "00.000.000.00"});
INFO ***** In msg2 :
INFO ***** Body Type: org.apache.camel.converter.stream.InputStreamCache
INFO ***** In msg1 : showMyIP({"ip": "00.000.000.00"});
INFO ***** In msg2 :
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6964 次 |
| 最近记录: |