Spring Integration + источник сообщения о чтении файла _ Адаптер входящего канала + Исходящий шлюз - PullRequest
0 голосов
/ 22 апреля 2020

Для чтения файлов Источник сообщения Входящий адаптер и преобразователь с аннотациями настроены следующим образом:

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
    public MessageSource<File> fileReadingMessageSource() {

}

@Transformer(inputChannel = "incomingchannel", outputChannel = "jobLaunchChannel")
    public JobLaunchRequest toRequest(Message<File> message) throws Exception {

}

Теперь я хочу изменить преобразователь, чтобы он ссылался на канал ответа исходящего шлюза, т.е. который перемещает файлы из одного каталог в другой каталог, т. е. переместить файл из каталога входящего канала в другой каталог и обработать или преобразовать файл или выполнить некоторые проверки

<file:outbound-gateway id="mover" request-channel="incomingchannel" reply-channel="newdirectory" directory="<<path to new directory file to be moved" delete-source-files="true"/>

Кто-нибудь преобразовал конфигурацию выше XML в конфигурации аннотаций или какие-либо идеи?

После настройки аннотаций мне нужно будет изменить входной канал трансформатора, чтобы он ссылался на новый канал директории, т.е. который является каналом ответа шлюза обмена сообщениями ...

Заранее благодарен за любую помощь и предложения относительно this

--- Обновление 1 после проверки фрагмента, предоставленного в ссылке Артемом

@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
    FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
    handler.setFileExistsMode(FileExistsMode.APPEND);
    handler.setDeleteSourceFiles(true);
    return handler;
}

@MessagingGateway(defaultRequestChannel = "incomingchannel", defaultReplyChannel = "newdirectorychannel")
public interface MyGateway {

    void writeToFile(@Header(FileHeaders.FILENAME) String fileName, @Header(FileHeaders.FILENAME) File directory,
            String data);

}

Но есть две проблемы

  1. Входящие Адаптер пытается опрашивать каталог также как файл (используется сканер рекурсивных каталогов) - Как обеспечить, чтобы каталог не опрашивался как файл

  2. Вложенное исключение org.springframework.messaging.core.DestinationResolutionException: no output-channel or replyChannel header available, failedMessage=GenericMessage [payload=C

1 Ответ

0 голосов
/ 22 апреля 2020

Хорошо. Поскольку похоже, что вы хотели бы поместить FileWritingMessageHandler после @InboundChannelAdapter и перед @Transformer, то это должно выглядеть так:

@Bean
@InboundChannelAdapter(autoStartup = "false", value = "incomingchannel", poller = @Poller("custompoller"))
    public MessageSource<File> fileReadingMessageSource() {

}

@Bean
@ServiceActivator(inputChannel = "incomingchannel")
public MessageHandler fileWritingMessageHandler() {
    FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(newdirectorypath));
    handler.setFileExistsMode(FileExistsMode.APPEND);
    handler.setDeleteSourceFiles(true);
    handler.setOutputChannelName("jobLaunchTransfromerCannel");
    return handler;
}

@Transformer(inputChannel = "jobLaunchTransfromerCannel", outputChannel = "jobLaunchChannel")
    public JobLaunchRequest toRequest(Message<File> message) throws Exception {

}

Таким образом, @InboundChannelAdapter отправляет файл в FileWritingMessageHandler для его логики c, которая создает файл результатов для следующего в потоке @Transformer для преобразования файла результатов в JobLaunchRequest. И только после этого на jobLaunchChannel будет отправлено сообщение для подачи Spring Batch Job.

...