带有Quartz和多个调度程序的Spring-Boot

时间:2018-09-12 21:33:50

标签: spring spring-boot quartz-scheduler

我正在处理一个场景,其中我们有一个具有多个架构的数据库,每个客户一个架构。这使每个客户可以为其工作设置不同的时间表。所有模式都有相同的作业集,只有时间表不同。

我需要编写一个Spring-Boot应用程序来运行所有架构中的所有作业。

似乎可以通过为每个架构定义不同的quartz.properties,然后为每个架构配置不同的Scheduler来完成,就像这样:

@SpringBootApplication
@Configuration
public class MyApplication{

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

    @Bean
    public Scheduler schedulerA(Trigger trigger, JobDetail job) {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(new ClassPathResource("quartzA.properties").getInputStream());

        Scheduler scheduler = factory.getScheduler();
        scheduler.setJobFactory(springBeanJobFactory());
        scheduler.scheduleJob(job, trigger);

        scheduler.start();
        return scheduler;
    }

    @Bean
    public Scheduler schedulerB(Trigger trigger, JobDetail job) {
        StdSchedulerFactory factory = new StdSchedulerFactory();
        factory.initialize(new ClassPathResource("quartzB.properties").getInputStream());

        Scheduler scheduler = factory.getScheduler();
        scheduler.setJobFactory(springBeanJobFactory());
        scheduler.scheduleJob(job, trigger);

        scheduler.start();
        return scheduler;
    }    
}

我的问题是,这正确吗?我是否可以在我的SpringBootApplication类中用@Configuration注释的方式定义这些调度程序,并期望它能工作(假设属性正确)?我想念什么吗?

2 个答案:

答案 0 :(得分:1)

  

我的问题是,这正确吗?我可以在下面定义这些调度程序吗   我的SpringBootApplication类带有@Configuration批注

这是正确的。另外,您可以将Spring @Schelduled批注与属性文件中定义的Cron一起使用。

@Scheduled(cron = "0 15 10 15 * ?")
public void scheduleTaskUsingCronExpression() {
.
.
.

但是,如果要对故障转移等作业进行更多控制,请重试策略或从仪表板跟踪和运行/重新运行作业。想想spring-batch

答案 1 :(得分:1)

受上述示例的启发,我找到了一种使用在应用程序属性中管理的配置的方法,该方法似乎更容易且与 Spring-Boot 应用程序的其余部分更一致。重用数据源配置特别有用。任何数量的第二种 bean 都是可能的。

public IList<SearchResult> GetSpotifyAuthorization(string parameters)
    {
        IList<SearchResult> searchResults = new List<SearchResult>();
        ParseElementViewModel parseElement = new ParseElementViewModel();

        parameters = Regex.Replace(parameters, "[^A-Za-z0-9]", ""); // just an example
        string url = $"https://accounts.spotify.com/authorize/{parameters}? format=json";
        HttpClient client = new HttpClient();

        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        try
        {
            var request = client.GetAsync(url).Result;
            if (request.IsSuccessStatusCode)
            {
                var res = request.Content.ReadAsStringAsync().Result;
                JObject search = JObject.Parse(res);
                IList<JToken> results = search["Results"].Children().ToList();

                foreach (JToken result in results)
                {
                    SearchResult jsonResults = JsonConvert.DeserializeObject<SearchResult>(result.ToString());
                    searchResults.Add(jsonResults);
                }

            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            return null;
        }
        return searchResults;
    }