首页 > 解决方案 > 如何在多个服务中使用调度程序?

问题描述

我尝试了以下方法来使用调度程序,但我找不到答案,所以我想问你一个问题。调度程序服务正按时运行。但是,只有“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);
    }

}

标签: javaspringscheduler

解决方案


我曾经在使用 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>

推荐阅读