拆分

时间:2015-05-18 10:10:23

标签: apache groovy split header apache-camel

当我尝试检查标头的值时,我的Camel Route出现问题。 所以发生的事情是我去处理器,做我的东西,然后我创建了2个不同的消息,我放在体内。 在那之后我回到我的路线上,我分裂了我的身体,所以我可以路由2个不同的消息,然后我在头部CamelFileName上使用.choice()。when()来检查它是否包含一些值。 它没有找到值,然后没有进入.when()

以下是更清晰的源代码:

// My route
from("myQuartz")
    .routeId("myId")
    .bean(myProcessor.class)
    .split(body())
    .to("log:test?showAll=true&multiline=true")
    .log('[${header.CamelFileName}]')
    .choice()
        .when(header('CamelFileName').contains('myString1'))
            // do my stuff
        .endChoice()
        .when(header('CamelFileName').contains('myString2'))
            // do my other stuff
        .endChoice()
        .otherwise()
            .log("It did not go inside the when")
            .to("log:test?showAll=true&multiline=true")
        .endChoice()
    .end()

所以在这里我只是想检查CamelFileName标头是否包含一个字符串(它不是一个变量),但它继续进入其他方面。 分割后的日志显示CamelFileName标头是正确的,并且包含我要查找的字符串。

我尝试了不同的方法来检查when()中的值,例如使用simple(),但它不起作用。 我的文件是一个groovy文件。

感谢您的帮助。

编辑: 因此,为了解释我体内的内容,我将向您展示处理器源代码。 我创建了两个DefaultMessage, 我为它们设置了一个body和一个CamelFileName头, 我将它们列入一个列表,然后我将该列表放入我的交换机构。 之后我回到路线,然后分开身体,这样它就会将两条信息分开并路由它们。 以下是我的处理器中发生的事情:

// Message 1 
DefaultMessage message1 = new DefaultMessage()
message1.setBody(bodyContent)
def fileName1 = "myString1_blablabla.txt"
message1.setHeader("CamelFileName",fileName1)
listMessages.add(message1)

// Message 2
DefaultMessage message2 = new DefaultMessage()
message2.setBody(bodyContent)
def fileName2 = "myString2_blablabla.txt"
message2.setHeader("CamelFileName",fileName2)
listMessages.add(message2)

exchange.in.setBody(listMessages)

1 个答案:

答案 0 :(得分:1)

我为您的路线设置了更简单的测试。它将数据路由到正确的when子句。当您split()时,会为每次交换复制标题,因此我不确定您为什么会(根据您的路线)为什么列表元素会有不同的标题值。

public class SampleTest extends CamelTestSupport{
    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start")
                .setHeader("CamelFileName", simple("myString1"))
                .split(body())
                .choice()
                    .when(header("CamelFileName").contains("myString1"))
                        .to("mock:myString1")
                    .endChoice()
                    .when(header("CamelFileName").contains("myString2"))
                        .to("mock:myString2")
                    .endChoice()
                    .otherwise()
                        .to("mock:otherwise")
                    .endChoice()
                .end();
            }
        };
    }

    @Test
    public void test() throws Exception {
        //Setup mock body
        java.util.List<String> myList = new java.util.ArrayList<String>();
        myList.add("1");
        myList.add("2");

        MockEndpoint mock1 = getMockEndpoint("mock:myString1");
        MockEndpoint mock2 = getMockEndpoint("mock:myString2");
        MockEndpoint mockOtherwise = getMockEndpoint("mock:otherwise");

        mock1.expectedMessageCount(myList.size());
        mock2.expectedMessageCount(0);
        mockOtherwise.expectedMessageCount(0);

        template.sendBody("direct:start", myList);

        assertMockEndpointsSatisfied();
    }
}