处理多个目录并安排spring集成

时间:2017-09-25 16:10:48

标签: java spring spring-integration

我在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?

也许,这个框架提供了更好的替代方案来处理这种情况?

1 个答案:

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