我有一个像这样的文件
line1
line2
line3
line4
line5
line6
line7
line8
这样的路线:
.from("direct:start")
.split().tokenize("\r\n").streaming()
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
System.out.println("Splitter:" +
exchange.getIn().getBody(String.class));
}
})
.aggregate(constant(true), new MyAggregationStrategy())
.completionSize(3).completionTimeout(10000)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
int size = exchange.getIn().getBody(Set.class).size();
System.out.println("Processor, Set size:" + size);
}
})
.to("mock:end")
MyAggregationStrategy创建一个包含3个项目的Set。这适用于前6行,我得到这样的输出:
Splitter:line 1
Splitter:line 2
Splitter:line 3
...
Processor, Set size:3
...
Splitter:line 4
Splitter:line 5
Splitter:line 6
...
Processor, Set size:3
...
Splitter:line 7
Splitter:line 8
虽然第7行和第8行是在MyAggregationStrategy中的oldExchange中聚合的,但之后定义的处理器从不为它们调用。此外,completionTimeout无法正常工作。该代码立即终止,并且不等待不存在的第9行10秒。
有什么想法吗?我认为这是处理不满足completionSize的剩余行的推荐方法吗?
由于我们绑定Java 6,因此我们使用camel版本2.13.4。
答案 0 :(得分:2)
找到了答案!
JUnit中出现的问题仅导致finish.assertIsSatisfied()
立即执行,并且不等待completionTimeout
中给出的超时。
使用finish.assertIsSatisfied(long timeoutForEmptyEndpoints)
值高于completionTimeout
中给出的值解决了我的问题