Spring 从 xml 到 Java 的 InboundChannelAdapter 集成导致新的轮询控制台日志

Spring Integration InboundChannelAdapter from xml to Java causing new polling console log

已将 Spring 集成 bean 从 xml 翻译成 Java。现在我为每个 @InboundChannelAdapter 获得了新的控制台日志,这是我之前没有得到的:

AbstractPollingEndpoint task-scheduler-7 DEBUG 在轮询期间未收到消息,返回 'false'

这是初始配置:

<file:inbound-channel-adapter id="the-file-input"
    directory="file:${import.file.dir.incomingFileDir}" channel="the-input" filter="customFilter" />
<si:channel id="the-input" />
<si:service-activator input-channel="the-input"
    output-channel="job-requests" ref="theJobLauncher" />

<bean id="theJobLauncher" class="com.example.POJO">

</bean>

新Java配置:

@Bean(name="theInput")
public MessageChannel manifestInputChannel() {
    return new DirectChannel();
}

@Bean(name="theFileInput")
@InboundChannelAdapter(channel="theInput")
public MessageSource<File> filesInboundChannelAdapter(@Value("${import.file.dir.incomingFileDir}") String incomingDirectory){
    FileReadingMessageSource sourceReader = new FileReadingMessageSource();
    sourceReader.setDirectory(new File(incomingDirectory));
    sourceReader.setFilter(customFileFilter);

    sourceReader.afterPropertiesSet();

    return sourceReader;
}


@Bean
@ServiceActivator(inputChannel="theInput", outputChannel="jobRequestsChannel")
public Pojo theJobLauncher() {
    Pojo theJobLauncher = new Pojo();

    return theJobLauncher;
}

theJobJaucher 引用了一个带有 @MessageEndpoint 注释和 @ServiceActivator 方法的 class

这个新的控制台日志行是正常的还是我的配置有问题?

您所指的正是在 AbstractPollingEndpoint:

    if (message == null) {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Received no Message during the poll, returning 'false'");
        }
        result = false;
    }

所以,这肯定意味着您已经以某种方式将 org.springframework.integration 类别的记录器配置为 DEBUG 级别。

不过一点也不痛。你只是在你以前的版本中没有那个日志记录配置。

您不需要自己打电话给 sourceReader.afterPropertiesSet();。那是一个应用程序上下文回调,它确实会被调用,因为您将它声明为一个 bean。

您的 @ServiceActivator 定义不正确。仅当您使用 MessageHandler 实现时, @Bean 注释才能存在。

您可以将 @ServiceActivator(inputChannel="theInput", outputChannel="jobRequestsChannel") 移动到 Pojo 方法,只需使用 @BeanPojo 声明一个 bean。或者因为您已经在 class 上使用了 @MessageEndpoint,您可以考虑打开 @ComponentScan 让应用程序上下文获取您的 class 一个 bean。

另一种方法真的很像 MessageHandler 调用你的 Pojo:

的实现
@Bean
@ServiceActivator(inputChannel="theInput", outputChannel="jobRequestsChannel")
public MessageHandler theJobLauncherServiceActivator(Pojo theJobLauncher) {
    return new MethodInvokingMessageHandler(theJobLauncher, (String) null);
}