我有从队列中读取的大型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。 我发现原因是拆分器删除了标头,因为它在路由之前。
似乎我不能在路由后使用拆分。
解决这个问题的解决方案是什么?
答案 0 :(得分:1)
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;
}
}