java - 如何在多个服务中使用调度程序?
问题描述
我尝试了以下方法来使用调度程序,但我找不到答案,所以我想问你一个问题。调度程序服务正按时运行。但是,只有“sessionService.getUserInfo()”运行。
我们没有在 youtubeSearchService.searchYoutube 和 youtubeSearchService.searchYoutube 上做任何工作。
为什么只有一项服务。我想知道如何使用多种服务。
@Component
public class SchedulerService {
private static final Logger logger = LoggerFactory.getLogger(SchedulerService.class);
@Autowired
private YoutubeSearchService youtubeSearchService;
@Autowired
private WeatherService weatherService;
@Autowired
private SessionService sessionService;
public static int i = 0;
public static int j = 0;
@Scheduled(cron="0 40 0/1 * * *")
public void weatherSchedulerService() throws Exception {
++i;
weatherService.insertRTweather(sessionService.getUserInfo());
}
@Scheduled(cron = "0 0/1 * * * *")
public void youtubeSearchSchedulerService() throws Exception {
++j;
youtubeSearchService.searchYoutube(sessionService.getUserInfo(),j);
}
}
解决方案
我曾经在使用 spring 调度程序时遇到过挑战,尤其是基于注释的配置,最后使用以下解决方案,我希望它有所帮助:
SchedulerConfig.java 使用石英
@Configuration
public class SchedulerConfig
{
private static final Logger logger = Logger.getLogger(SchedulerConfig.class.getName());
@Autowired
private ApplicationContext applicationContext;
@Bean
public SpringBeanJobFactory springBeanJobFactory()
{
AutoWiringSpringBeanJobFactory jobFactory = new AutoWiringSpringBeanJobFactory();
logger.info("Configuring Job factory");
jobFactory.setApplicationContext(applicationContext);
return jobFactory;
}
@Bean
public SchedulerFactoryBean scheduler(Trigger trigger, JobDetail job)
{
SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean();
schedulerFactory.setConfigLocation(new ClassPathResource("quartz.properties"));
logger.info("Setting the Scheduler up");
schedulerFactory.setJobFactory(springBeanJobFactory());
schedulerFactory.setJobDetails(job);
schedulerFactory.setTriggers(trigger);
return schedulerFactory;
}
@Bean
public JobDetailFactoryBean jobDetail()
{
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(SchedulerService.class);
jobDetailFactory.setName("Qrtz_Job_Detail");
jobDetailFactory.setDescription("Invoke Sample Job service...");
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public CronTriggerFactoryBean trigger(JobDetail job)
{
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
//three am
trigger.setCronExpression("0 0 3 * * ?");
trigger.setJobDetail(job);
trigger.setName("Qrtz_Trigger");
return trigger;
}
}
quartz.properties : 把它放在 classptah
# thread-pool
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=1
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread=true
# job-store
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
# others
org.quartz.jobStore.misfireThreshold = 60000
您的调度程序服务定义如下:
@Component
public class SchedulerService implements Job {
@Autowired
private YoutubeSearchService youtubeSearchService;
@Autowired
private WeatherService weatherService;
@Autowired
private SessionService sessionService;
public void execute(JobExecutionContext context) throws JobExecutionException
{
weatherService.insertRTweather(sessionService.getUserInfo());
}
}
如果您想要两个定义多个计划,您可以通过添加 jobdetail 和 trigger来将其添加到 schedulerconfig 中。
不要忘记添加石英 jar 文件
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>${quartz.version}</version>
</dependency>
推荐阅读
- python - 创建实例后更改基类 (__bases__)。isinstance() 操作。蟒蛇 2.7
- javascript - 试图在第三方网站上仅勾选包含 Javascript/jQuery 中某些选择器的复选框
- apache - 流浪域 ERR_CONNECTION_REFUSED
- python - Pydoop mapreduce“AttributeError:模块'wordcount_minimal'没有属性'__main__'”
- .htaccess - 如何忽略 Htaccess 中 url 参数字符串的结尾?
- php - php fileinfo文件上传验证不起作用
- php - Magento 2在Minicart(DropdownDialog)打开时禁用浏览器滚动?
- c# - 将日期时间设置为晚上 11:59:59
- css - 与现代 CSS 兼容的 Maven 的 CSS 缩小器
- javascript - Javascript 在 DOM 中查找给定 div 及其内容的出现