Разделите сообщения и направьте их на верблюдах - PullRequest
0 голосов
/ 19 октября 2011

У меня есть большое сообщение XML, прочитанное из очереди, мне нужно разделить его на куски и преобразовать в объекты, а затем направить их в различные пункты назначения на основе объекта.

Итак, я настроил routeBuilder на

ChoiceDefinition choice = from(routeConfig.getFromEndpoint())
                .split().method(xmlSplitter, "splitMessage").streaming().process(xmlProcessor).choice();
for (RouteConfig filter : filters) {
    choice = choice.when(header(REPORT_TYPE_HEADER_NAME).contains(filter.getReportTypeHeaderFilter()))
                    .to(filter.getToEndpoint());
}
choice.otherwise().to(routeConfig.getErrorEndpoint());

Но маршрутизация вообще не происходит, все сообщения отправляются в errorEndpoint.Я нашел причину, чтобы сплиттер удалял заголовок, так как он опережает маршрутизацию.

Кажется, я не могу использовать разбиение после маршрутизации.

Какое решение решить эту проблему?

1 Ответ

1 голос
/ 20 октября 2011

split () не должен удалять заголовки ... вы уверены, что ваш xmlSplitter / xmlProcessor не вызывает проблем?

вот простой пример, показывающий, что заголовки сохранены ...

@EndpointInject(uri = "mock:mock")
protected MockEndpoint mock;

@Test
public void test() throws Exception {
    mock.expectedMessageCount(2);
    mock.expectedHeaderReceived("foo","bar");
    template.sendBodyAndHeader("direct:start", "msg1,msg2", "foo", "bar");
    assertMockEndpointsSatisfied();
}

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {

            from("direct:start")
                .to("log:+++before+++?showHeaders=true")
                .split().method(MySplitterBean.class, "splitBody").streaming()
                .to("log:+++after+++?showHeaders=true")
                .choice().when(header("foo").contains("bar"))
                    .to("mock:mock")
                .otherwise()
                    .to("mock:error");
        }
    };
}

public static class MySplitterBean {
    public List<String> splitBody(String body) {
        List<String> answer = new ArrayList<String>();
        String[] parts = body.split(",");
        for (String part : parts) {
            answer.add(part);
        }
        return answer;
    }
}
...