Интеграция Spring + источник сообщения чтения файла _ Адаптер входящего канала + шлюз исходящей почты

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

@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 {

}

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

<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 в конфигурации аннотаций или какие-либо идеи?

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

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

--- Обновление 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


person Vas..    schedule 22.04.2020    source источник
comment
Извините, ваша проблема не ясна. Возможно, у вас уже есть что-то в XML в качестве единого решения, поэтому нам будет легче понять, в чем состоит проблема ... <file:outbound-gateway - это FileWritingMessageHandler в Java. См. В документации: docs.spring.io/spring-integration/docs/5.3.0.M4/reference/html/   -  person Artem Bilan    schedule 22.04.2020
comment
@ArtemBilan, да, вы правы, у нас уже есть решение в конфигурации xml и, как упоминалось в приведенном выше фрагменте кода ‹конфигурация исходящего шлюза, для перемещения файла из входящего каталога в другой директор, а затем обработки в преобразователе.   -  person Vas..    schedule 22.04.2020
comment
М-м-м. так вы хотите поместить FileWritingMessageHandler между вашими @InboundChannelAdapter и JobLaunchRequest @Transformer?   -  person Artem Bilan    schedule 22.04.2020
comment
@ArtemBilan, да отлично, я обновил вопрос с опробованной реализацией, но есть исключения. Также адаптер InboundChannel использовал рекурсивный сканер каталогов, проблема в том, что каталог также сканируется и отображается в списке.   -  person Vas..    schedule 22.04.2020


Ответы (1)


Ok. Поскольку похоже, что вы хотели бы поместить 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 для своей логики, которая создает файл результатов для следующего в потоке @Transformer, чтобы преобразовать файл результатов в JobLaunchRequest. И только после этого на jobLaunchChannel будет отправлено сообщение для отправки пакета Spring Batch Job.

person Artem Bilan    schedule 22.04.2020
comment
Билиан, большое спасибо за ценное предложение и вклад. Это работает нормально, но теперь проблема в том, что у меня нет отслеживания абсолютного пути к исходному файлу, это то, что я могу добавить в заголовок, когда он передается в jobLaunchTransfromerCannel - person Vas..; 22.04.2020
comment
Я не думаю, что об этом правильно думать. FileWritingMessageHandler создает для вас новый File объект, и он есть в вашем toRequest(Message<File> message) методе в качестве полезной нагрузки сообщения. Вам не нужен оригинал, потому что у вас есть все в этом новом File объекте. - person Artem Bilan; 22.04.2020
comment
Билиан, это требуется, потому что входящий канал имеет подкаталоги и с помощью рекурсивного сканера каталогов для опроса файлов в любом из подкаталогов, по крайней мере, необходимо знать, из какого исходного подкаталога файл был перемещен в новый каталог - person Vas..; 22.04.2020
comment
Еще раз хотел бы поблагодарить вас за ваш вклад и ценные предложения ... - person Vas..; 22.04.2020
comment
Ну, технически FileWritingMessageHandler не отменяет исходный заголовок. Пожалуйста, попробуйте просмотреть заголовки сообщений в вашем toRequest(Message<File> message) методе. - person Artem Bilan; 22.04.2020
comment
Билиан, это работает как шарм .. Я использовал этот файл originalIncomingFile = (File) message.getHeaders (). Get (FileHeaders.ORIGINAL_FILE); originalIncomingFilePath = originalIncomingFile.getParent (); - person Vas..; 22.04.2020
comment
Да, это правильно. Теперь давайте рассмотрим это: stackoverflow.com/help/someone-answers! - person Artem Bilan; 22.04.2020
comment
Только одна проблема, с которой я сейчас сталкиваюсь, - это каталог, который также опрашивается как сообщение файла в адаптере входящего канала, поскольку я использую рекурсивный сканер каталогов, есть ли способ ограничить каталог, опрашиваемый как сообщение ... ранее RecursiveLeafOnlyDirectoryScanner теперь устарел, и я я использую RecursiveDirectoryScanner - person Vas..; 22.04.2020
comment
Что ж, вам, вероятно, нужно @Filter их (file.isDirectory()) перед отправкой на этот @Transformer. См. Здесь: docs .spring.io / Spring-integration / docs / 5.3.0.M4 / reference / html / - person Artem Bilan; 23.04.2020