【问题标题】:Camel check header value after split拆分后的骆驼检查标头值
【发布时间】:2015-05-18 10:10:22
【问题描述】:

当我尝试检查标头的值时,我的 Camel Route 出现问题。 所以发生的事情是我去一个处理器,做我的事情,然后我创建了两个不同的信息,我把它们放在身体里。 之后我回到我的路线,我拆分了我的身体,以便我可以路由 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, 我为它们设置了一个正文和一个 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)

【问题讨论】:

    标签: apache groovy split header apache-camel


    【解决方案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();
        }
    }
    

    【讨论】:

    • 感谢您的回复。所以这是因为在我的处理器中,我在 Type DefaultMessage 中创建了 2 个不同的消息。它们每个都有不同的正文和 CamelFileName 标头。然后我将它们放入一个列表中,并将该列表放入我的交换体中。之后我回到我的路线并拆分正文,以便它将两条消息分开并路由它们。我刚刚更新了我的第一篇文章,向您展示了执行此部分的处理器源代码。
    • 你在做一些奇怪的事情,我担心它需要比我在这里给出的更多解释。不要使用DefaultMessage,它是一个内部类。您与exchange.in.setBody()exchange.in.setHeader() 在交换中的消息进行交互。在你的处理器中,你已经让你的身体成为一个消息实例......这是错误的。尝试通读“入门”指南,以更清楚地了解如何使用交换和消息。
    • 我需要在同一个处理器中创建两条消息,然后路由它们。如果我没有在我的正文中放置消息列表然后拆分它们,它将仅路由一条消息。我怎么能这样做呢?
    • 您可以使用与现在相同的设置,但您必须给出表达式simple("${in.body.header('CamelFileName')}") 而不是header("CamelFileName")。使用DefaultMessage 对象很奇怪。
    • 它没有用。我必须在我的路由中使用 .groovy() 表达式才能使其工作。找不到其他方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    相关资源
    最近更新 更多