Загружать тело верблюда динамически в зависимости от заголовка - PullRequest
0 голосов
/ 27 апреля 2018

Привет! Я хочу установить для своего тела оператор SQL, чтобы впоследствии он использовался компонентом jdbc. У меня есть свои сценарии sql в ресурсах, поэтому я могу воспользоваться простым языком для загрузки sth из ресурсов с использованием 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 / б / Insert.sql

Как можно загружать разные файлы с использованием заголовка?

Заранее спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете использовать Шаблон интеграции Content Enricher и обернуть свое простое выражение в Компонент языка , чтобы оценить его.

Это должно вернуть ожидаемые результаты:

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()
        );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...