Spring интеграция DSL :: проблема при вызове канала из xml

Я сделал один простой DSL, который извлекает данные из базы данных и выполняет простое преобразование в активаторе службы.

    @Bean
public IntegrationFlow mainFlow() {
    return IntegrationFlows.from("userChannel")
                .channel("queryChannel")
                .handle("sampleConvertor","convertUser")
                .get();

queryChannel - это исходящий шлюз jdbc, а sampleConverter - это активатор службы.

<int-jdbc:outbound-gateway query="select * from employee where employee_id=:payload"
request-channel="queryChannel" data-source="dataSource"/>

Проблема в том, что после получения данных из базы данных поток не переходит в serviceActivator, а просто возвращает ответ базы данных.

В конфигурации xml я использовал шлюз внутри цепочки, как показано ниже.

<int:gateway id="query.gateway" request-channel="queryChannel"/>

Пожалуйста, подскажите, что я здесь делаю не так. Заранее спасибо.


person Saravanan Ramamoorthy    schedule 08.02.2018    source источник


Ответы (1)


Несколько необычно комбинировать конфигурацию Java DSL и XML, но они все равно работают вместе.

Ваша проблема Я думаю, вам не хватает того факта, что ваш queryChannel имеет два подписчика во время выполнения, а не цепочку вызовов.

Первый - это <int-jdbc:outbound-gateway>, а второй - это .handle("sampleConvertor","convertUser"). Правильно, когда вы объявляете канал в IntegrationFlow, следующий EIP-метод создает подписчика для этого канала. В то же время, когда вы используете канал типа request-channel или input-channel в конфигурации XML, это также приводит к подписчику.

Итак, у вас есть два подписчика на DirectChannel с RoundRobinLoadBalancingStrategy, и поэтому только один из них будет обрабатывать сообщение, и если это компонент с ответом на запрос, как этот <int-jdbc:outbound-gateway>, он создаст сообщение в output-channel или replyChannel в заголовках . В вашем случае речь идет именно о replyChannel, и поэтому вы не переходите к .handle("sampleConvertor","convertUser"), потому что это не следующий в цепочке, а просто параллельная вселенная по циклическому алгоритму.

Если вы действительно хотите достичь этого .handle("sampleConvertor","convertUser") после вызова <int-jdbc:outbound-gateway>, вам следует подумать об использовании .gateway("queryChannel") вместо этого .channel().

person Artem Bilan    schedule 09.02.2018
comment
замена .channel на .gateway сделала свое дело! Большое спасибо. - person Saravanan Ramamoorthy; 10.02.2018