我在spring application.yml
文件中定义了一组计划,如下所示:
reports:
reportPaths:
11: "\\\\path\\pnl\\"
10: "\\\\path\\balance\\"
schedule-1:
description: Deliver pnl files
report: 11
format: PDF
cron: '0 00 17* * *'
schedule-2:
description: Deliver balance sheet files
report: 10
format: PDF
cron: '0 00 16* * *'
在不同的时间在服务器上创建不同的文件类型。我的应用程序希望根据 cron 计划来执行报告。
我按如下方式注册和安排工作:
threadPoolTaskScheduler.schedule(new Job(schedule), new CronTrigger(environment.getProperty(schedule + ".cron")));
工作班:
public class Job implements Runnable {
private String job;
public ScheduledJobRouter(String job) {
this.job= job;
}
@Override
public void run() {
logger.info("Running Report job'{}' ({})", job);
}
}
我的问题是,当我为每个发送给订阅者的报告类型处理多个目录时,如何根据spring-integration
的计划启动集成工作流程。例如,在16:00 hrs:.
FileReadingMessageSource`的计划时间读取报告10的目录
在17:00,FileReadingMessageSource
读取报告11的目录。
如何在预定时间初始化我正在处理的多个目录的FileReadingMessageSource
。我是否必须为我正在处理的每个报告目录定义多个bean?
也许,这个框架提供了更好的替代方案来处理这种情况?
答案 0 :(得分:2)
您可以在每次投票之前或之后使用smart poller重新配置MessageSource
。
修改强>
@SpringBootApplication
public class So46409658Application {
public static void main(String[] args) {
SpringApplication.run(So46409658Application.class, args);
}
@Value("reports.reportPaths.10")
private String ten;
@Value("reports.reportPaths.11")
private String eleven;
@Bean
@InboundChannelAdapter(channel = "foo", poller = @Poller("poller"))
public MessageSource<File> frms() {
new File(this.ten).mkdirs();
new File(this.eleven).mkdirs();
FileReadingMessageSource source = new FileReadingMessageSource();
source.setDirectory(new File(this.ten));
return source;
}
@Bean
public PollerMetadata poller() {
PollerMetadata poller = new PollerMetadata();
poller.setTrigger(new PeriodicTrigger(5000));
poller.setAdviceChain(Arrays.asList(advice()));
return poller;
}
public AbstractMessageSourceAdvice advice() {
return new AbstractMessageSourceAdvice() {
private volatile boolean swap;
@Override
public boolean beforeReceive(MessageSource<?> source) {
File directory = new File(this.swap ? eleven : ten);
((FileReadingMessageSource) source).setDirectory(directory);
swap = !swap;
System.out.println("Polling " + directory);
return true;
}
@Override
public Message<?> afterReceive(Message<?> result, MessageSource<?> source) {
return result;
}
};
}
}
如果您使用的是XML配置,请将建议链添加到<poller/>
。