我正试图分裂一个' @'分隔字符串并通过相同的路径处理每个令牌。
驼context.xml中:
<split streaming="true">
<tokenize token="@"/>
<to uri="validateResubmitTransactionIdProcessor"/>
</split>
以下是处理器代码段:
epublic class ValidateResubmitTransactionIdProcessor implements Processor {
public void process(Exchange exchng) throws Exception {
Object[] args = exchng.getIn().getBody(Object[].class);
}}
我得到以下例外:
eCaused by:org.apache.camel.InvalidPayloadException:没有可用的类型:org.apache.camel.Exchange但有值:11484类型:java.lang.String on:消息:11484。引起:否类型转换器可用于从类型:java.lang.String转换为所需类型:org.apache.camel.Exchange,值为11484.Exchange [消息:11484]。引起:[org.apache.camel.NoTypeConversionAvailableException - 没有类型转换器可用于从类型:java.lang.String转换为所需类型:org.apache.camel.Exchange,其值为11484] at org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:101) 在org.apache.camel.builder.ExpressionBuilder $ 35.evaluate(ExpressionBuilder.java:847) 引起:org.apache.camel.NoTypeConversionAvailableException:没有类型转换器可用于从类型:java.lang.String转换为所需类型:org.apache.camel.Exchange,其值为11484 at org.apache.camel.impl.converter.BaseTypeConverterRegistry.mandatoryConvertTo(BaseTypeConverterRegistry.java:169) 在org.apache.camel.core.osgi.OsgiTypeConverter.mandatoryConvertTo(OsgiTypeConverter.java:110) 在org.apache.camel.impl.MessageSupport.getMandatoryBody(MessageSupport.java:99)nter
我不确定我是否正确使用分离器。另外,知道如何将java.lang.String转换为Exchange。这似乎不受骆驼的支持。
答案 0 :(得分:1)
Splitter EIP创建了一种循环,并为每个令牌调用您的处理器。因此交换的主体包含一个简单的字符串,而不是列表。
<强>更新强> 见这个例子:
CamelContext context = new DefaultCamelContext();
context.addRoutes(new RouteBuilder() {
public void configure() {
from("direct:start")
.split().tokenize("@").streaming()
.process(new MyProcessor())
;
}
});
context.start();
context.createProducerTemplate().sendBody("direct:start", "1@2@3");
您的处理器方法如下所示:
public void process(final Exchange exchange) throws Exception
{
System.out.println(exchange.getIn().getBody());
}
这将输出三行数字。