camel completionSize with completionTimeout在JUnit中无法正常工作

时间:2016-08-21 07:47:13

标签: java apache-camel

我有一个像这样的文件

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。

1 个答案:

答案 0 :(得分:2)

找到了答案!

JUnit中出现的问题仅导致finish.assertIsSatisfied()立即执行,并且不等待completionTimeout中给出的超时。

使用finish.assertIsSatisfied(long timeoutForEmptyEndpoints)  值高于completionTimeout中给出的值解决了我的问题