当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Quartz,Integration Inbound channel适配器和触发器绑定

莘聪
2023-03-14

我们有使用XML配置的Quartz Job+File Integration adapter,并且工作得很好,但是,由于尝试将这些配置转移到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&使用下面的注释创建的轮询器触发器是在spring Boot quartz config中的调度器工厂创建过程中注入的

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

}

提前感谢您对此提供的任何帮助或建议

Artem Bilan非常感谢你的回复。

跟进问题后试用答复中提供的代码

@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的参考,而不是入站通道适配器。

incomingFiles值为bean“_org.springframework.integration.errorlogger”

如何将名为incomingFiles的入站适配器绑定到调度程序工厂?

  @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)中找到了关于如何为入站通道适配器创建bean的响应。

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个答案

缑永年
2023-03-14

我不知道为什么你关闭了你的旧问题-你可以只是编辑它适当,我们将有一个链接到其他问题。但不管怎样,答案是这样的:

任何XML bean定义都可以用@bean方法定义在Java&annotation config中声明。

因此, 在Java中的格式如下:

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

您已经在@poller中使用它的bean名称作为引用。

SchedulerFactoryBean也是这样做的,并在@bean方法中配置它的setSchedulerContextAsMap()。您已经有一个customTrigger()bean可供参考,并且可以基于@InboundChannelAdapter访问SourcePollingChannelAdapterendpoint,您需要注入@bean方法。差不多是这样的:

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

 }

不要忘记使用@InboundChannelAdapter(autoStartup=“false”),正如Gary在其他SO问题中所建议那样。

 类似资料:
  • 我已经审阅了Microsoft提供的关于触发器的文档。[https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=python][1] 事实上,在Azure函数中使用参数允许我们检索blob和一些属性(),我们还可以使用函数读取字节,但是我们如何将字节转换为

  • 我已经创建了一个绑定适配器来显示毕加索的图片,但它不工作。我有以下错误: 发现数据绑定错误。****/数据绑定错误****Msg:在Android.Widget.ImageView上找不到参数类型为java.lang.String的属性'app:loadPicture'的设置器。文件:/home/groupevsc.com/mathieu_labar/documents/projects/andr

  • 将 HTTP 参数转换成一个函数参数的过程是一个典型适配过程,执行这个过程的对象被称为适配器了。 Nutz.Mvc 提供了 org.nutz.mvc.HttpAdaptor 接口,隔离了这种行为。 在每一个入口函数上,你都可以通过注解 @AdaptBy 来声明如何适配 HTTP 参数。当然,你 没必要在每一个入口函数上都声明,在子模块类上声明,或者在整个应用的主模块上声明均可。 如何使用适配器?

  • 在Casbin中,策略存储作为adapter(Casbin的中间件) 实现。 Casbin用户可以使用adapter从存储中加载策略规则 (aka LoadPolicy()) 或者将策略规则保存到其中 (aka SavePolicy())。 为了保持代码轻量级,我们没有把adapter代码放在主库中。 目前支持的适配器列表 Casbin的适配器完整列表如下。 我们欢迎任何第三方对adapter进行

  • 适配器 In some cases you might not want to use socket.io. It's not a problem. Nest allows you to use any other websockets library, you only have to create an adapter. Let's imagine that you want to use w

  • 本文向大家介绍Android RecyclerView适配器中的数据绑定,包括了Android RecyclerView适配器中的数据绑定的使用技巧和注意事项,需要的朋友参考一下 示例 也可以在RecyclerView适配器中使用数据绑定。 资料模型 XML布局 转接器类别