Пример интеграции DSL Spring для адаптера входящего канала JPA

Я не могу найти полезный пример для опроса источника JPA для входящих данных. Я знаю, как сделать это в XML, но не могу понять, как это сделать в DSL.

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

С уважением

Дэвид Смит

2 ответа

Вы правы: в Java DSL Spring Integration нет поддержки компонентов JPA. Не стесняйтесь поднять JIRA (JavaDSL компонент) по этому вопросу, и мы позаботимся об этом требовании. Не стесняйтесь вносить свой вклад!

Тем временем я могу помочь вам понять, как это сделать без высокоуровневого API.

<int-jpa:inbound-channel-adapter> основан на JpaPollingChannelAdapter а также JpaExecutor объекты (именно их мы будем использовать для API DSL). Вы просто должны настроить @Bean за JpaExecutor и используйте это так:

@Bean
public JpaExecutor jpaExecutor(EntityManagerFactory entityManagerFactory) {
     JpaExecutor jpaExecutor = new JpaExecutor(entityManagerFactory);
     jpaExecutor.setJpaQuery("from Foo");
     ....
     return jpaExecutor;
}

@Bean
public IntegrationFlow jpaFlow(JpaExecutor jpaExecutor) {
    return IntegrationFlows.from(new JpaPollingChannelAdapter(jpaExecutor))
                      .split()
                      .transform()
       ....
}

Все остальное будет сделано фреймворком, как обычно для существующих API компонентов DSL.

ОБНОВИТЬ

Как обеспечить автозапуск = свойство при программном создании JpaPollingChannelAdapter? Кроме того, возможно ли получить этот bean-компонент и вызвать.start(), .stop(), используя control-bus?

Видишь, ответ Гэри. Lifecycle контроль является обязанностью Endpoint в нашем случае это SourcePollingChannelAdapter, Итак, вы должны указать второй лямбда-аргумент, настроить .autoStartup() а также .id() там, чтобы быть в состоянии ввести SourcePollingChannelAdapter для тебя JpaPollingChannelAdapter и работать с ним для ваших целей. Тот id действительно может быть использован из control-bus в start()/stop() во время выполнения.

Да, я согласен JpaPollingChannelAdapter неудачное название для этого класса, потому что это действительно MessageSource реализация.

Подключите JpaPollingChannelAdapter как @Bean и использовать

IntegrationFlows.from(jpaMessageSource(), 
                      c -> c.poller(Pollers.fixedDelay(1000)))
                .transform(...)
                ...

Смотрите DSL Reference для опций конфигурации.

Этот находится ближе к началу (с другим источником сообщения).

Другие вопросы по тегам