在split() - bug之后,Camel onCompletion没有处理异常?

时间:2017-03-21 13:12:51

标签: apache-camel

我创建了一个最小的示例/单元测试:

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块工作(在我的实际路径中我用它来进行审计日志记录)?

无论可能的解决方案,我应该提交一个关于此的错误吗?

0 个答案:

没有答案