Как я могу динамически менять пункт назначения в маршруте Talend ESB?

У меня есть простой маршрут Talend:

cMQConnectionFactory (mq config) -- cJMS (читает из mq) --> cHttp (отправляет в REST на другой машине)

Я хочу иметь возможность изменять назначение cHttp (Uri) на основе содержимого сообщений. Сообщение представляет собой JSON с полем «адрес», на которое мне нужно отправить сообщение.

Маршруты Talend позволяют динамически менять пункт назначения?

Или я полностью неправильно понимаю концепцию, и маршруты нужно создавать отдельно для каждой пары сообщений "производитель-потребитель"?


person Kromster    schedule 19.06.2017    source источник
comment
Вы должны иметь возможность сделать это, извлекая данные с помощью запроса JSONPath/Xpath (поместите его в заголовок, например, через компонент cSetHeader). После этого вы можете использовать новый заголовок ${header.yourName} в компоненте cHttp.   -  person Corentin    schedule 19.06.2017
comment
@Corentin Не могли бы вы добавить некоторые подробности? Я действительно новичок в этом деле. У меня есть json в виде строки из MQ с адресом поля, который является URL-адресом службы REST, которую мне нужно вызвать ... как ее настроить?   -  person Kromster    schedule 19.06.2017


Ответы (2)


Я установил cHttp с `uri = "foobar", чтобы легко найти настройку в сгенерированном коде. Вы можете видеть, что он установлен внутри

public void configure() throws java.lang.Exception {
     ...
     from(
            "timer:cTimer_1" + "?period=" + 2500 + "&repeatCount=" + 10
                    + "&delay=" + 1000)
            .routeId("Route_cTimer_1")
            .setHeader("CamelHttpMethod", constant("GET")).to("foobar")

            .id("Route_cHttp_1");
}

К сожалению, это делается во время инициализации, поэтому значение остается постоянным (как и почти все в Mediation).

Решения:

1) С определенным списком пунктов назначения

Вы можете использовать cMessageRouter в качестве переключателя для отправки сообщения на правильный cHttp (это означает один cHttp для каждого пункта назначения)

2) С неизвестным пунктом назначения

Вы можете использовать задание для управления этим динамическим местом назначения, чтобы сгенерировать свой URI и отправить оттуда запрос. Я не уверен, что вы тоже можете получить ценность от работы (по той же причине)

person AxelH    schedule 21.06.2017
comment
Спасибо за Ваш ответ! Таким образом, маршруты могут быть только статическими (определяемыми во время компиляции). - person Kromster; 21.06.2017
comment
@Kromster фактически определен в начале среды выполнения. Вы можете использовать переменную Context и установить другую среду (со значением по умолчанию) или даже использовать cConfig для загрузки значений из файла свойств (можете вспомнить, как мы это сделали...), и это загрузит значения перед методом настройки, но вам нужно будет перезапустить маршрут, если вы хотите что-то обновить. Так что на самом деле это не во время выполнения, но все еще не полностью динамично. - person AxelH; 22.06.2017

Вы можете легко сделать это с помощью компонента cDSLProcessor. Настройте динамически некоторые заголовки из ваших данных, затем в DSLProcessor напишите .to("http://"+echange.getIn().getHeader("myheader")

person Loko    schedule 08.10.2020