我正在处理一个场景,其中我们有一个具有多个架构的数据库,每个客户一个架构。这使每个客户可以为其工作设置不同的时间表。所有模式都有相同的作业集,只有时间表不同。
我需要编写一个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注释的方式定义这些调度程序,并期望它能工作(假设属性正确)?我想念什么吗?
答案 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;
}