根据标题动态加载Camel的主体

时间:2018-04-27 13:51:45

标签: apache-camel

您好我想在我的身体上设置一个SQL语句,以便之后由jdbc组件使用。我在资源中有我的sql脚本,因此我可以利用简单的语言从资源中加载resource:classpath。问题是url不是静态的,我想加载不同的文件,具体取决于我得到的标题(``)。

<!-- INSERT data -->
<setBody>
   <simple>resource:classpath:sql/${header.CamelCustomer}/Insert.sql</simple>
</setBody>

假设我有2个客户A和B.这意味着我还有2个目录

  • 资源/ SQL / A / Insert.sql
  • 资源/ SQL / B / Insert.sql

如何使用标题加载不同的文件?

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以使用Content Enricher integration pattern并使用Language component包装简单表达式以进行评估。

这应该会返回预期的结果:

Java DSL:

.enrich().simple("language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql")

XML DSL:

<enrich><simple>language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql</simple></enrich>

我已经为演示创建了样本单元测试。

<强>的src /测试/资源/ SQL / A / Insert.sql

INSERT something INTO A;

<强>的src /测试/资源/ SQL / B / Insert.sql

INSERT something INTO B;

<强> DynamicLoadResourceTest

public class DynamicLoadResourceTest extends CamelTestSupport {
    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start")
                        .enrich().simple("language:simple:resource:classpath:sql/${header.CamelCustomer}/Insert.sql")
                        .to("mock:done");
            }
        };
    }

    @Test
    public void testContentEnrichResource() throws Exception {
        MockEndpoint done = getMockEndpoint("mock:done");
        Map<String, Object> headers = new HashMap<>();
        headers.put("CamelCustomer", "A");
        sendBody("direct:start", null, headers);

        headers.put("CamelCustomer", "B");
        sendBody("direct:start", null, headers);

        done.setExpectedCount(2);
        done.assertIsSatisfied();
        Assert.assertEquals(
                "INSERT something INTO A;",
                done.getExchanges().get(0).getIn().getBody()
        );
        Assert.assertEquals(
                "INSERT something INTO B;",
                done.getExchanges().get(1).getIn().getBody()
        );
    }
}