骆驼:根据消息的来源省略部分路线

Camel: Omitting parts of a route depending on where the message comes from

我有两条路线:

.from("A")
.to("C")
.to("B");

.from("C")
*some processing logic*
.to("D");

是否可以构建第二条路线:

您可以在路线上设置交换属性。然后您可以评估 filter 或 choice 中的值以分支或更改路由逻辑。我建议不要做任何比这更复杂的事情,以避免路由之间不必要的耦合。

示例:

package org.example;

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;

public class ExampleRouteTests extends CamelTestSupport {

    @Test
    public void shouldReturnSentBody() throws Exception {
     
        final String testMessage = "AAAA";

        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(1);
        resultMockEndpoint.message(0).body().isEqualTo(testMessage);

        template.sendBody("direct:a", testMessage);

        resultMockEndpoint.assertIsSatisfied();
    }

    @Test
    public void shouldReturnBBBB() throws Exception {
     
        MockEndpoint resultMockEndpoint = getMockEndpoint("mock:result");
        resultMockEndpoint.expectedMessageCount(1);
        resultMockEndpoint.message(0).body().isEqualTo("BBBB");

        template.sendBody("direct:b", null);

        resultMockEndpoint.assertIsSatisfied();
    }

    @Override
    protected RoutesBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {

            @Override
            public void configure() throws Exception {
    

                from("direct:a")
                    .setProperty("From", constant("A"))
                    .to("direct:c");
                    
                from("direct:b")
                    .setProperty("From", constant("B"))
                    .to("direct:c");

                from("direct:c")
                    .filter(exchangeProperty("From").isNotEqualTo("A"))
                        .log("Processing message")
                        .setBody(constant("BBBB"))
                    .end()
                    .log("body: ${body}")
                    .to("mock:result");
                
            }
        };
    }
}