我创建了一个最小的示例/单元测试:
import org.apache.camel.CamelExecutionException;
import org.apache.camel.Endpoint;
import org.apache.camel.EndpointInject;
import org.apache.camel.RoutesBuilder;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import java.util.Arrays;
public class OnCompletionTest extends CamelTestSupport{
@EndpointInject(uri = "direct:in")
private Endpoint in;
@EndpointInject(uri = "mock:completion")
private MockEndpoint mockComp;
@EndpointInject(uri = "mock:out")
private MockEndpoint mockOut;
@Test
public void good() throws InterruptedException {
mockComp.setExpectedMessageCount(1);
mockOut.setExpectedMessageCount(2);
//
context.createProducerTemplate().sendBody(in, Arrays.asList("1","2"));
//
assertMockEndpointsSatisfied();
}
@Test
public void exception() throws InterruptedException {
mockComp.setExpectedMessageCount(1);
mockOut.setExpectedMessageCount(2);
//
mockOut.whenAnyExchangeReceived(exchange -> {throw new IllegalArgumentException("");});
try {
context.createProducerTemplate().sendBody(in, Arrays.asList("1","2"));
fail();
} catch (CamelExecutionException e){
}
//
mockOut.assertIsSatisfied();
mockComp.assertIsSatisfied();
}
@Override
public boolean isUseRouteBuilder() {
return true;
}
@Override
protected RoutesBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
// @formatter:off
from(in)
.onCompletion().to(mockComp).end()
.split().body()
//.stopOnException()
//.shareUnitOfWork()
.to(mockOut)
;
// @formatter:on
}
};
}
}
测试"例外"失败了,但不应该。因为onCompletion应该在所有情况下使用(错误与否)。使用stopOnException和/或shareUnitOfWork并没有帮助。 如果我删除了拆分,则在两种情况下都使用onCompletion。
有没有办法让onCompletion块工作(在我的实际路径中我用它来进行审计日志记录)?
无论可能的解决方案,我应该提交一个关于此的错误吗?