Spring Boot Quartz, адаптер для входящего канала интеграции и триггерные привязки - PullRequest
1 голос
/ 14 апреля 2020

У нас есть адаптер Quartz Job + File Integration, использующий конфигурации XML, и он работает нормально, однако, поскольку пытается перейти на Spring Boot и эти конфигурации к аннотациям

Ниже приведена конфигурация XML, для которой я ищу эквивалентные аннотации и привязки

<bean id="scheduler" 
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="schedulerContextAsMap">
            <map>
                <entry key="inboundadapterendpoint"><ref bean="incomingfiles" /></entry>
                <entry key="inboundendpointtrigger"><ref bean="incomingfiles-trigger"/></entry>
            </map>
        </property>
</bean>

<bean id="inboundendpointtrigger" class="abc.xyz.Trigger" />

<file:inbound-channel-adapter id="incomingfiles" channel="xyz" directory=""  scanner="recursiveScanner" auto-startup="false" prevent-duplicates="false">
    <integration:poller task-executor="fileChannelTaskExecutor" trigger="incomingfiles-trigger" max-messages-per-poll="1">
    </integration:poller>
</file:inbound-channel-adapter>

Как получить триггер входящего адаптера Bean & poller, созданный с помощью приведенных ниже аннотаций, при создании фабрики планировщика весной Конфигурация Boot Quartz

@Bean
@InboundChannelAdapter(poller = @Poller(trigger="customTrigger")
public MessageSource<File> fileReadingMessageSource() {

}

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

Артем Билан, большое спасибо за ответ.

В последующем посте с вопросами опробуйте код, указанный в ответе

@Configuration
public class QuartzConfig {

    @Autowired
    private CustomTrigger inboundEndPointTrigger;

    @Autowired
    private AbstractEndpoint incomingFiles;


    @Bean
    public SchedulerFactoryBean schedulerFactoryBean() {

    System.out.println("incomingFiles value is  " + incomingFiles);

    }   
}



@Bean(name = "incomingFiles")
@InboundChannelAdapter(autoStartup = "false", value = "xyz", poller = @Poller(trigger = "inboundEndPointTrigger", maxMessagesPerPoll = "2", errorChannel = "abc"))
public MessageSource<File> fileReadingMessageSource() {

}

Вывод выше является ссылкой для errorLogger вместо адаптера входящего канала.

значением входящего файла является bean-компонент '_org.springframework.integration.ergrationLogger'

Как привязать точный входящий адаптер с именем входящим файлом к ​​фабрике планировщика?


Обновить после попытки с @EndPointId ...

  @Bean
  @EndPointId("incomingFiles")
    @InboundChannelAdapter(autoStartup = "false", value = "xyz", poller = @Poller(trigger = "inboundEndPointTrigger", maxMessagesPerPoll = "2", errorChannel = "abc"))
    public MessageSource<File> fileReadingMessageSource() {

    }

System.out.println("incomingFiles value is  " + incomingFiles);  print in  QuartzConfig class above is still giving a reference to  Logger object 

incomingFiles value is  bean '_org.springframework.integration.errorLogger'

Находится нижеприведенный ответ SO ( Spring Cloud Stream + Quartz ) о том, как будет создан компонент для адаптера входящего канала.

Since the AbstractEndPoint is returning the logger reference instead of InboundChannelAdapter , 
is it ok to  get the Inbound Adapter channel bean reference via application context  in scheduler factory ? are there any issues with this ?

try {
    ApplicationContext applicationContext = (ApplicationContext) context.getScheduler().getContext().get("applicationContext");
    AbstractEndpoint abstractEndPoint = (AbstractEndpoint) applicationContext
                    .getBean("fileConfig.fileReadingMessageSource.inboundChannelAdapter");
} catch(SchedulerException ex) {
}


fileConfig is the Spring File integration configuration class name where InboundChannelAdapter is defined.. 

1 Ответ

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

Я не уверен, почему вы закрыли свой старый вопрос - вы можете просто отредактировать его правильно, и у нас будет ссылка на другой вопрос. Но в любом случае, ответ будет таким:

Любое определение компонента XML может быть объявлено в Java и в конфигурации аннотации с определением метода @Bean.

Итак, <bean id="inboundendpointtrigger" class="abc.xyz.Trigger" /> будет Java следующим образом:

@Bean
Trigger customTrigger() {
   return new abc.xyz.Trigger();
}

Вы уже используете его имя компонента в качестве ссылки в @Poller.

То же самое, что вы делаете для SchedulerFactoryBean и настройте его setSchedulerContextAsMap() в этом @Bean методе. У вас уже есть бин customTrigger() для справки, и вы получаете доступ к конечной точке SourcePollingChannelAdapter на основе @InboundChannelAdapter, который необходимо внедрить в метод @Bean. Напишите это:

 @Bean
 SchedulerFactoryBean schedulerFactory(Trigger trigger, SourcePollingChannelAdapter endpoint) {

 }

Не забудьте использовать @InboundChannelAdapter(autoStartup = "false"), как Гэри рекомендует в другом вопросе.

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