【问题标题】:Apache Camel splitter returns stringApache Camel 拆分器返回字符串
【发布时间】:2018-09-29 05:27:37
【问题描述】:

我正在尝试拆分一个“@”分隔的字符串并通过相同的路由处理每个令牌。

骆驼上下文.xml:

<split streaming="true">
  <tokenize token="@"/>
  <to uri="validateResubmitTransactionIdProcessor"/>
</split>

以下是处理器代码sn-p:

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: No body available of type: org.apache.camel.Exchange but has value: 11484 of type: java.lang.String on: Message: 11484. Caused by: No类型转换器可用于从类型:java.lang.String 转换为所需的类型:org.apache.camel.Exchange,值为 11484。Exchange[消息:11484]。原因:[org.apache.camel.NoTypeConversionAvailableException - 没有类型转换器可用于从类型:java.lang.String 转换为所需类型:org.apache.camel.Exchange,值为 11484] 在 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 在 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。骆驼好像不支持这个。

【问题讨论】:

    标签: java apache-camel jbossfuse apache-servicemix


    【解决方案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());
    }
    

    这将输出三行数字。

    【讨论】:

    • 我期待的不是列表,而是交换。由于每个令牌都发送到处理器并且处理器的处理方法只能接受交换参数,我怎样才能获得与拆分​​器相同的行为?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 2011-11-15
    • 2014-01-06
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多