Разделитель Apache Camel возвращает строку

Я пытаюсь разбить строку, разделенную символом @, и обработать каждый токен по одному и тому же маршруту.

camel-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);
}}

У меня следующее исключение:

e Причина: 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] в org.apache.camel.impl .MessageSupport.getMandatoryBody (MessageSupport.java:101) в org.apache.camel.builder.ExpressionBuilder $ 35.evaluate (ExpressionBuilder.java:847) Вызвано: org.apache.camel.NoTypeConversionAvailableException типа convertable : 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. Кажется, это не поддерживается верблюдом.


person user1375124    schedule 04.09.2015    source источник


Ответы (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());
}

Это выведет три строки с цифрами.

person mdo    schedule 05.09.2015
comment
Я ожидаю не списка, а обмена. Поскольку каждый токен отправляется процессору, а метод процесса процессора может принимать только параметр обмена, как я могу добиться того же поведения, что и Splitter? - person user1375124; 08.09.2015