Spring Integrtion XML и преобразование конфигурации Java - PullRequest
0 голосов
/ 06 ноября 2018

Я очень новичок в Spring Integration , и мой проект использует File Support для чтения файла и загрузки в базу данных.

У меня есть XML-конфигурация, пытающаяся понять его содержание.

<int-file:inbound-channel-adapter auto-startup= true channel="channelOne" directory="${xx}" filename-regex="${xx}" id="id" prevent-duplicates="false">
        <int:poller fixed-delay="1000" receive-timeout="5000"/>
</int-file:inbound-channel-adapter>        

<int:channel id="channelOne"/>

Из приведенного выше фрагмента мое понимание:

  1. Мы определяем канал и
  2. Затем определите адаптер входящего канала - он будет искать каталог для файла и создаст сообщение с файлом в качестве полезной нагрузки.

Мне удалось преобразовать это в JavaConfig, как показано ниже:

@Bean
public MessageChannel fileInputChannel() {
    return new DirectChannel();
}

@Bean
@InboundChannelAdapter(value = "fileInputChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<File> fileReadingMessageSource() {
        FileReadingMessageSource sourceReader= new FileReadingMessageSource();
        RegexPatternFileListFilter regexPatternFileListFilter = new RegexPatternFileListFilter(
                file-regex);

        //List<FileListFilter<File>> fileListFilter = new ArrayList<FileListFilter<File>>();
        fileListFilter.add(regexPatternFileListFilter);
        //CompositeFileListFilter compositeFileListFilter = new CompositeFileListFilter<File>(
                fileListFilter);
        sourceReader.setDirectory(new File(inputDirectorywhereFileComes));
        sourceReader.setFilter(regexPatternFileListFilter );
        return sourceReader;
    }

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

Вот следующий кусок:

<int-file:outbound-gateway
        delete-source-files="true"
        directory="file:${pp}"
        id="id"
        reply-channel="channelTwo"
        request-channel="channelOne"
        temporary-file-suffix=".tmp"/>

<int:channel id="channelTwo"/>
<int:outbound-channel-adapter channel="channelTwo" id="id" method="load" ref="beanClass"/>

Итак, из этого куска мое понимание:

1: определить выходной канал. 2: Определите исходящий шлюз, который запишет это сообщение как файл снова в каталог (другой), а также удалите файл из исходного каталога. И, наконец, он вызовет метод Load of Bean Class. Это наш класс и имеет метод load, который принимает файл в качестве входных данных и загружает его в БД.

Я пытался преобразовать его в Java Config. Вот мой код:

 @Bean
    @ServiceActivator(inputChannel= "fileInputChannel")
    public MessageHandler fileWritingMessageHandler() throws IOException, ParseException {
        FileWritingMessageHandler handler = new FileWritingMessageHandler(new File(path to output directory));
        handler.setFileExistsMode(FileExistsMode.REPLACE);

    beaObject.load(new File(path to output directory or input directory:: Nothing Worked));
        handler.setDeleteSourceFiles(true);
        handler.setOutputChannel(fileOutputChannel());
        return handler;
    }

Я могу записать этот файл в выходную папку, также удалось удалить из источника. После этого я полностью потерян. Мне нужно вызвать метод Load моего BeanClass (ref = class в XML).

Я много пробовал, но не смог его получить. Прочитайте несколько раз документацию по поддержке файлов интеграции, но не можете это сделать.

Примечание: Когда я попытался, я получил одну ошибку, говорящую об исключении «Файл не найден». Я верю, что могу вызвать свой метод, но не могу получить файл.

Этот XML-конфиг работает отлично.

Spring Integration с DSL также может предложить любой, если возможно.

Пожалуйста, помогите мне понять основной поток и сделать это. Любая помощь и комментарии действительно заметны.

Заранее спасибо.

1 Ответ

0 голосов
/ 06 ноября 2018

Прежде всего, вы должны понимать, что метод @Bean предназначен именно для определений конфигурации и компонентов, которые будут использоваться позже во время выполнения. Вы определенно не должны вызывать бизнес-логику в @Bean. Я имею в виду, что твой beaObject.load() совершенно неправ

Итак, сначала перейдите в Spring Framework Docs, чтобы понять, что такое @Bean и его родительский элемент @Configuration: https://docs.spring.io/spring/docs/5.1.2.RELEASE/spring-framework-reference/core.html#beans-java

Ваш @ServiceActivator для FileWritingMessageHandler действительно правильный (когда вы удаляете это beaObject.load()). Вам просто нужно объявить еще один @ServiceActivator для вызова вашего beaObject.load() во время выполнения при появлении сообщения в fileOutputChannel:

@ServiceActivator(inputChannel= "fileOutputChannel")
public void loadFileIntoDb(File payload) {
       this.beaObject.load(payload);
}

Подробнее см. https://docs.spring.io/spring-integration/docs/5.1.1.BUILD-SNAPSHOT/reference/html/configuration.html#annotations.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...