Циклический канал для обновления заголовка, обогатитель для размещения файла в нескольких целевых объектах

Попытка разместить файл в нескольких каталогах, используя один исходящий шлюз с использованием spring-integration-file. Я знаю, что с таким адаптером канала невозможно отправлять в несколько каталогов одновременно.

Для этого необходимо иметь цикл перед file: outbound-gateway для изменения целевого каталога заголовка сообщения на каждой итерации и отправки их всех в один и тот же канал снова и снова.

Но возникает исключение, как указано ниже.

Любое предложение, как его зациклить или обновить заголовок и снова запустить адаптер

файл: Исходящий шлюз:

<!-- header enricher -->
    <integration:header-enricher input-channel="filesHeaderEnricherChannel" output-channel="filesOut">
       <integration:header name="TARGET_COUNT" method="getTargetCount" ref="headerEnricher"/>
            <integration:header name="TARGET_DIR" method="getTargetPath" ref="headerEnricher"/>     
    </integration:header-enricher>

    <integration:chain id="filesOutChain" input-channel="filesOut">
        <integration:transformer expression="headers.FILE"/>
            <file:outbound-adapter id="fileMover" 
                auto-create-directory="true"
                directory-expression="headers.TARGET_DIR"
                mode="REPLACE">
                <file:request-handler-advice-chain>
                    <ref bean="retryAdvice" />
                </file:request-handler-advice-chain>
            </file:outbound-adapter>    
       </integration:chain> 

<!-- decreasing the count on each loop -->
<!-- looping to header enricher channel again as output channel to update the target directory -->
           <integration:filter input-channel="filesOut"  expression="headers.TARGET_COUNT != 0" output-channel="filesHeaderEnricherChannel"
                    discard-channel="filesArchiveChannel" throw-exception-on-rejection="true">
                    <integration:request-handler-advice-chain>
                    <ref bean="retryAdvice" />
                    </integration:request-handler-advice-chain>
        </<integration:filter>



Ответы (1)


Вам не обязательно иметь <integration:gateway request-channel="filesOutChainChannel" в конце вашей цепочки. вам нужно просто настроить цепочку для вывода в filesOutChainChannel, и там, в фильтре, кажется, что вы делаете правильные вещи.

Проблема со шлюзом в том, что он ожидает ответа, но поскольку вы зацикливаете его на filesHeaderEnricherChannel, вы снова и снова увеличиваете стек вызовов с ожидающими шлюзами.

person Artem Bilan    schedule 12.11.2018
comment
попробовали ваше решение. Я не получаю исключение стека вызовов теперь после замены шлюза адаптером. Но вызов не возвращается к циклу filesHeaderEnricherChannel. прикрепленный отредактированный код выше для вашей справки. - person Jessie; 13.11.2018
comment
Похоже, вы меня не поняли и допустили большую ошибку в конфиге. Теперь вам нужно проводить циклический поиск подписчиков на filesOut канале. Я хотел, чтобы в цепочке был outpup-channel, однако я вижу, что вы изменили шлюз на `‹ file: outbound-adapter ›, so you are not going to wait for reply. That's fine too. so, consider to make that filesOut` на <publish-subscribe-channel>. Также не уверен, зачем вам retryAdvice на этом фильтре ... - person Artem Bilan; 13.11.2018
comment
Мне жаль. Теперь я понял вашу точку зрения. Попросил меня добавить выходной - канал для интеграции: цепочка ... попробую ... просто нужно подтверждение ... после добавления ... будет ли он возвращаться к filesHeaderEnricherChannel ... можно ли вернуться к каналу что над кодом? - person Jessie; 13.11.2018
comment
Это совершенно не имеет значения: в конце концов, у вас есть объекты в памяти, с которыми вы взаимодействуете. Конфиг к нему полностью не относится. - person Artem Bilan; 13.11.2018