读完一遍之后,我似乎失去了“内在”的身体。请注意,我使用的是 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));
我期望在这里看到的是 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:
日志中需要注意的事项:
- 第 1 行 - Body Type 正确显示缓存的输入流
- 第 4 行 - 转换为字符串确实有效生成 msg1,即使第 3 行(转换代码)似乎失败并出现 IOException
- 第 6 行 - 转换也失败,但重要的是要注意主体仍然是缓存流。
- 第 7 行 - 我的消息丢失了。
那么msg2去了哪里呢?
EDIT
除了下面彼得的回答之外,还有一些事情值得一提:
Camel的MessageHelper静态类有两个有用的函数:
resetStreamCache
extractBodyAsString
两者都会对这种情况有所帮助
使用流缓存可以读取流不止一次在不同的处理器但仍然同一处理器中仅出现一次.
我测试过:
ModelCamelContext context = new DefaultCamelContext();
context.setStreamCaching(true); //!!
// ...
from("direct:start")
.to("http://ip.jsontest.com/?callback=showMyIP")
.process(new MyProcessor())
.process(new MyProcessor());
And:
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));
}
};
这打印:
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 :
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)