Java 使用弹簧控制器手动运行石英

Java 使用弹簧控制器手动运行石英,java,spring,spring-mvc,quartz-scheduler,Java,Spring,Spring Mvc,Quartz Scheduler,我使用以下配置类将spring framework与Quartz集成,它工作正常,但一旦应用程序启动,作业就会动态启动,因为我使用@configuration annotation,我想通过控制器和ui手动启动作业,有人能告诉我如何做吗 这是石英配置类 @Configuration public class QuartzConfig { @Autowired private PlatformTransactionManager transactionManager; @Autowired p

我使用以下配置类将spring framework与Quartz集成,它工作正常,但一旦应用程序启动,作业就会动态启动,因为我使用@configuration annotation,我想通过控制器和ui手动启动作业,有人能告诉我如何做吗

这是石英配置类

@Configuration
public class QuartzConfig {

@Autowired
private PlatformTransactionManager transactionManager;

@Autowired
private ApplicationContext applicationContext;

@Bean
public SchedulerFactoryBean quartzScheduler() {
    SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean();

    quartzScheduler.setTransactionManager(transactionManager);
    quartzScheduler.setOverwriteExistingJobs(true);

    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory();
    jobFactory.setApplicationContext(applicationContext);
    quartzScheduler.setJobFactory(jobFactory);

    Trigger[] triggers = {
            processMyJobTrigger().getObject()
    };

    quartzScheduler.setTriggers(triggers);

    return quartzScheduler;
}

@Bean
public JobDetailFactoryBean processMyJob() {
    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
    jobDetailFactory.setJobClass(HelloJob.class);
    jobDetailFactory.setDurability(true);
    return jobDetailFactory;
}

@Bean
public CronTriggerFactoryBean processMyJobTrigger() {
    CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();
    cronTriggerFactoryBean.setJobDetail(processMyJob().getObject());
    cronTriggerFactoryBean.setCronExpression("0 0/1 * * * ?");
    return cronTriggerFactoryBean;
}
}

石英作业

@Service
@Transactional
public class HelloJob implements Job{

@Inject
TestrecordRepository testrecordRepository;
@Inject
ScoreRepository scoreRepository;


public void execute(JobExecutionContext context)
        throws JobExecutionException {
            System.out.println("Hello Quartz!");    
            List<Testrecord> records=testrecordRepository.findAll();
            for(Testrecord t:records){
                Testrecord testrecord = new Testrecord();
                testrecord.setValue_integer(t.getValue_integer());
                testrecord.setId(t.getId());
                RuleExecutor ruleExecutor = new RuleExecutor();
                Score score= ruleExecutor.processRules(testrecord);
                scoreRepository.save(score);    
            }

        }
@服务
@交易的
公共类HelloJob实现作业{
@注入
TestrecordRepository TestrecordRepository;
@注入
记分库记分库;
public void execute(作业执行上下文)
抛出JobExecutionException异常{
System.out.println(“Hello Quartz!”);
List records=testrecordRepository.findAll();
for(Testrecord t:records){
Testrecord Testrecord=新的Testrecord();
testrecord.setValue_integer(t.getValue_integer());
setId(t.getId());
RuleExecutor RuleExecutor=新的RuleExecutor();
Score得分=ruleExecutor.processRules(testrecord);
scoreRepository.save(score);
}
}

}

您只需要一个bean,在其中注入调度程序和已有的工厂。例如:

@Service
public class QuartzService {
    private Scheduler scheduler;
    private CronTriggerFactoryBean cronTriggerFactory;
    private JobDetailFactoryBean jobDetailFactory;

    public void createJob() {
        JobDetail job = jobDetailFactory.getObject();
        Trigger trigger = cronTriggerFactory.getObject();
        scheduler.scheduleJob(job, trigger);
    }

    // other methods: delete (unschedule), update (modify job), ...

    // getters and setters

}
修改此类,使其符合您的要求。我使用这样的类作为web服务中的服务,但它可以用于web应用程序或其他任何东西

此服务由spring创建很重要,这意味着它必须在spring配置bean中定义:

@Bean
public QuartzService quartzService() {
    QuartzService service = new QuartzService();
    service.setScheduler(quartzScheduler());
    service.setJobDetailFactoryBean(processMyJob());
    service.setCronTriggerFactoryBean(processMyJobTrigger());
    return service;
}