Quartz 动态控制job


Scheduler 初始化:

package com.sf.module.waybill;

import java.util.List;

import org.quartz.Scheduler;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import com.sf.module.intfLog.biz.IBjTaskSchedulingBiz;
import com.sf.module.intfLog.domain.BjTaskScheduling;


public class TaskTriggerInit implements BeanPostProcessor{
	private IBjTaskSchedulingBiz bjTaskSchedulingBiz;
	@Override
	public Object postProcessAfterInitialization(Object arg0, String arg1)
			throws BeansException {
		if(arg1.equals("schedulerFactory"))
		{
			if(arg0 instanceof SchedulerFactoryBean){
				Scheduler scheduler = ((SchedulerFactoryBean)arg0).getScheduler();
				CronTriggerBean trigger;
				try {
					BjTaskScheduling bjTaskScheduling = new BjTaskScheduling();
					List<BjTaskScheduling> jobs = bjTaskSchedulingBiz.findBjTaskSchedulings(bjTaskScheduling);
					for(BjTaskScheduling job : jobs)
					{
						if("1".equals(job.getActive())){
							trigger = (CronTriggerBean)scheduler.getTrigger(job.getTaskName(), Scheduler.DEFAULT_GROUP);
							trigger.setCronExpression(job.getTimer());
							scheduler.rescheduleJob(job.getTaskName(), Scheduler.DEFAULT_GROUP, trigger);
						}else{
							trigger = (CronTriggerBean)scheduler.getTrigger(job.getTaskName(), Scheduler.DEFAULT_GROUP);
							scheduler.interrupt(trigger.getJobName(), Scheduler.DEFAULT_GROUP);
							scheduler.unscheduleJob(job.getTaskName(), Scheduler.DEFAULT_GROUP);
						}
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
		return arg0;
	}

	@Override
	public Object postProcessBeforeInitialization(Object arg0, String arg1)
			throws BeansException {
		return arg0;
	}

	public IBjTaskSchedulingBiz getBjTaskSchedulingBiz() {
		return bjTaskSchedulingBiz;
	}

	public void setBjTaskSchedulingBiz(IBjTaskSchedulingBiz bjTaskSchedulingBiz) {
		this.bjTaskSchedulingBiz = bjTaskSchedulingBiz;
	}
}


动态改变Job时间

package com.sf.module.intfLog.biz;


import java.util.List;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.impl.StdScheduler;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.scheduling.quartz.CronTriggerBean;

import com.sf.module.intfLog.domain.BjTaskScheduling;

public class SchedulerController implements ApplicationContextAware
{
	private IBjTaskSchedulingBiz bjTaskSchedulingBiz;
	private StdScheduler scheduler;
	private ApplicationContext context;
	
	/**
	 * @param triggerName
	 * @param cronExper
	 * @throws Exception
	 */
	public void changeTrigger(String triggerName, String cronExper) throws Exception
	{
		CronTriggerBean trigger = (CronTriggerBean)scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
		trigger.setCronExpression(cronExper);
		scheduler.rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, trigger);
	}
	
	public void pauseJob(String triggerName) throws Exception{
		Trigger trigger = scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
		scheduler.pauseJob(trigger.getJobName(), Scheduler.DEFAULT_GROUP);
		scheduler.pauseTrigger(triggerName, Scheduler.DEFAULT_GROUP);
	}
	
	public void resumeJob(String triggerName) throws SchedulerException{
		Trigger trigger = scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
		scheduler.resumeJob(trigger.getJobName(), Scheduler.DEFAULT_GROUP);
		scheduler.resumeTrigger(triggerName, Scheduler.DEFAULT_GROUP);
	}
	
	public  void interruptJob(String triggerName)
			throws SchedulerException{
		Trigger trigger = scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
		scheduler.interrupt(trigger.getJobName(), Scheduler.DEFAULT_GROUP);
		scheduler.unscheduleJob(triggerName, Scheduler.DEFAULT_GROUP);
	}

	public void restartJob(String triggerName) throws Exception {
		CronTriggerBean trigger = (CronTriggerBean)context.getBean(triggerName);
		BjTaskScheduling bjTaskScheduling = new BjTaskScheduling();
		bjTaskScheduling.setTaskName(triggerName);
 		List<BjTaskScheduling> dbbjTaskScheduling = bjTaskSchedulingBiz.findBjTaskSchedulings(bjTaskScheduling);
		if(dbbjTaskScheduling != null && !dbbjTaskScheduling.isEmpty())
		{
			trigger.setCronExpression(dbbjTaskScheduling.get(0).getTimer());
			scheduler.scheduleJob(trigger);
			scheduler.start();
		}
	}

	public StdScheduler getScheduler() {
		return scheduler;
	}

	public void setScheduler(StdScheduler scheduler) {
		this.scheduler = scheduler;
	}

	public IBjTaskSchedulingBiz getBjTaskSchedulingBiz() {
		return bjTaskSchedulingBiz;
	}

	public void setBjTaskSchedulingBiz(IBjTaskSchedulingBiz bjTaskSchedulingBiz) {
		this.bjTaskSchedulingBiz = bjTaskSchedulingBiz;
	}

	@Override
	public void setApplicationContext(ApplicationContext context)
			throws BeansException {
		this.context = context;
	}
	
}


配置任务

     <bean id="taskService" class="com.sf.module.waybill.biz.WayBillAccumulateService">
     </bean>
     
     <bean id="taskTrigger"  class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <bean id="taskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	            <property name="targetObject" ref="taskService"/>
	            <property name="targetMethod" value="start"/>
	            <property name="concurrent" value="false" />
            </bean>
       </property>
        <property name="cronExpression" value="0 0 12 * 1987 ?"/> 
    </bean>
   
   <bean id="schedulerFactory" lazy-init="false" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	  <property name="triggers">
		<list>
		  <ref local="taskTrigger" />
		</list>
	  </property>
   </bean>
	<bean class="com.sf.module.waybill.TaskTriggerInit" lazy-init="false">
		<property name="bjTaskSchedulingBiz" ref="bjTaskSchedulingInitBiz"/>
	</bean>
	<bean id="schedulerController" class="com.sf.module.intfLog.biz.SchedulerController">
    	<property name="scheduler" ref="schedulerFactory"/>
    	<property name="bjTaskSchedulingBiz" ref="bjTaskSchedulingBiz"/>
    </bean>

jobDetail


package com.sf.module.waybill.biz;

import org.quartz.InterruptableJob;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.UnableToInterruptJobException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class WayBillAccumulateService implements InterruptableJob {
	
	 private static Logger logger = LoggerFactory.getLogger(WayBillAccumulateService.class);
	 private boolean _interrupted = false;  
	public void start(){

		System.out.println("开始~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
        if(_interrupted) {  //中止正在运行的线程
		     return;   
		 }  
	}

	@Override
	public void execute(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void interrupt() throws UnableToInterruptJobException {
		_interrupted = true;  
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,关于Spring Boot集成Quartz实现动态定时任务,具体实现步骤如下: 1. 在`pom.xml`中添加`quartz`和`spring-boot-starter-quartz`依赖,如下所示: ``` <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 配置Quartz的相关属性,如下所示: ``` # 配置Quartz的数据源 spring.quartz.job-store-type=jdbc spring.quartz.jdbc.initialize-schema=always spring.datasource.url=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=123456 # 配置Quartz的任务调度线程池 spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount=10 ``` 3. 创建一个`Job`接口,并实现`execute()`方法,该方法中编写要执行的任务逻辑。例如: ``` public interface MyJob extends Job { @Override void execute(JobExecutionContext context) throws JobExecutionException; } ``` 4. 创建一个`JobDetail`实例,并设置相关属性,如下所示: ``` JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "groupName") .build(); ``` 5. 创建一个`Trigger`实例,并设置相关属性,如下所示: ``` Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerName", "groupName") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); ``` 6. 创建`SchedulerFactory`实例,并从中获取`Scheduler`实例,如下所示: ``` SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); ``` 7. 调用`Scheduler`实例的`scheduleJob()`方法,将`JobDetail`和`Trigger`添加到调度器中,如下所示: ``` scheduler.scheduleJob(jobDetail, trigger); ``` 8. 调用`Scheduler`实例的`start()`方法,启动调度器,如下所示: ``` scheduler.start(); ``` 9. 如果需要修改或删除已有的定时任务,可以通过以下方法实现: - 修改任务:首先根据`Job`名称和组名获取到`JobDetail`,然后根据`Trigger`名称和组名获取到`Trigger`,修改`JobDetail`和`Trigger`的相关属性,最后重新调用`scheduleJob()`方法将修改后的`JobDetail`和`Trigger`添加到调度器中即可。 - 删除任务:首先根据`Job`名称和组名获取到`JobDetail`,然后根据`Trigger`名称和组名获取到`Trigger`,调用`Scheduler`实例的`unscheduleJob()`方法,将`Trigger`从调度器中移除,最后调用`好的,我来回答关于Spring Boot Quartz动态定时的问题。 使用Quartz实现动态定时任务可以让我们在运行时动态地创建和修改定时任务,而不需要停止应用程序或重启服务器。在Spring Boot中,我们可以通过集成Quartz来实现动态定时任务。 以下是实现步骤: 1. 添加依赖项 在pom.xml文件中添加Quartz依赖项: ``` <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 创建Job 创建一个实现`org.quartz.Job`接口的类,这个类将被用来实现我们的定时任务逻辑。 例如: ```java public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello Quartz!"); } } ``` 3. 创建Trigger Trigger用于指定Job的执行时间。在这里,我们将使用CronTrigger来定义Job的执行时间。 例如,我们可以创建一个每隔5秒钟执行一次的Trigger: ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); ``` 4. 创建Scheduler SchedulerQuartz的核心组件,它用于调度Job和Trigger的执行。在Spring Boot中,我们可以使用`org.springframework.scheduling.quartz.SchedulerFactoryBean`类来创建Scheduler。 例如: ```java @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); schedulerFactoryBean.setTriggers(trigger.getObject()); return schedulerFactoryBean; } ``` 5. 启动Scheduler 在应用程序启动时,我们需要启动Scheduler。 例如: ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; @PostConstruct public void start() throws SchedulerException { schedulerFactoryBean.getScheduler().start(); } ``` 6. 动态创建和修改定时任务 使用Quartz,我们可以在运行时动态地创建和修改定时任务。 例如,我们可以通过调用`SchedulerFactoryBean`的`getScheduler()`方法来获取Scheduler实例,并使用它来创建和修改Job和Trigger。 ```java @Autowired private SchedulerFactoryBean schedulerFactoryBean; public void addJob() throws SchedulerException { JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .build(); Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/10 * * * * ?")) .build(); schedulerFactoryBean.getScheduler().scheduleJob(jobDetail, trigger); } public void updateJob() throws SchedulerException { TriggerKey triggerKey = new TriggerKey("trigger1", "group1"); Trigger newTrigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ?")) .build(); schedulerFactoryBean.getScheduler().rescheduleJob(triggerKey, newTrigger); } 好的,下面是关于使用Spring Boot和Quartz实现动态定时任务的解释。 首先,Spring Boot是一个基于Spring框架的开发平台,可以帮助我们快速构建Spring应用程序。而Quartz是一个开源的作业调度框架,可以实现在指定时间或间隔时间内执行任务的功能。 在Spring Boot中使用Quartz实现动态定时任务的步骤如下: 1.添加Quartz依赖项 在Spring Boot中使用Quartz,需要在项目中添加Quartz的相关依赖项。可以使用Maven或Gradle等构建工具来管理项目依赖项。以下是一个Maven依赖项的示例: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2.编写定时任务 编写一个定时任务类,需要实现Job接口并重写execute方法。在execute方法中编写定时任务的具体逻辑。以下是一个示例: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 定时任务的逻辑 } } ``` 3.配置Quartz 在Spring Boot中,可以使用@Configuration注解来配置Quartz。在@Configuration类中,需要创建一个SchedulerFactoryBean实例,并使用该实例来创建Scheduler对象。以下是一个示例: ```java @Configuration public class QuartzConfig { @Bean public JobDetail myJobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("myJob") .storeDurably() .build(); } @Bean public Trigger myTrigger() { return TriggerBuilder.newTrigger() .forJob(myJobDetail()) .withIdentity("myTrigger") .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * * * ?")) .build(); } @Bean public SchedulerFactoryBean schedulerFactory(Trigger myTrigger) { SchedulerFactoryBean schedulerFactory = new SchedulerFactoryBean(); schedulerFactory.setTriggers(myTrigger); return schedulerFactory; } } ``` 在上面的配置中,我们创建了一个JobDetail对象和一个Trigger对象,并将它们传递给SchedulerFactoryBean实例,最终创建了一个Scheduler对象。在这个示例中,我们使用了Cron表达式来定义任务的执行时间,表示每小时执行一次任务。 4.启动定时任务 启动定时任务非常简单,只需要在Spring Boot应用程序中注入Scheduler对象并调用start方法即可。以下是一个示例: ```java @Service public class MyService { @Autowired private Scheduler scheduler; public void startJob() throws SchedulerException { scheduler.start(); } } ``` 在上面的示例中,我们注入了Scheduler对象,并在MyService类中定义了一个startJob方法来启动定时任务。 总结一下,使用Spring Boot和Quartz实现动态定时任务需要完成以下步骤: 1.添加Quartz依赖项 2.编好的,下面是关于 Spring Boot Quartz 动态定时的回答: Spring Boot Quartz 是一个强大的定时任务框架,可以方便地实现定时任务的调度和管理。在 Spring Boot 中使用 Quartz,需要添加相关依赖,然后配置定时任务。 对于动态定时任务的实现,可以使用 Spring Boot Quartz 提供的 CronTriggerFactoryBean 和 SchedulerFactoryBean 类来实现。具体步骤如下: 1. 添加依赖 在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 2. 配置定时任务 在 Spring Boot 的配置文件(如 application.yml 或 application.properties)中,添加以下配置: ``` spring.quartz.job-store-type=jdbc spring.datasource.url=jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.quartz.properties.org.quartz.scheduler.instanceName = MyScheduler spring.quartz.properties.org.quartz.scheduler.instanceId = AUTO spring.quartz.properties.org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX spring.quartz.properties.org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate spring.quartz.properties.org.quartz.jobStore.tablePrefix = QRTZ_ spring.quartz.properties.org.quartz.jobStore.isClustered = false spring.quartz.properties.org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool spring.quartz.properties.org.quartz.threadPool.threadCount = 5 spring.quartz.properties.org.quartz.threadPool.threadPriority = 5 spring.quartz.properties.org.quartz.jobStore.dataSource = myDataSource spring.quartz.properties.org.quartz.dataSource.myDataSource.driver = com.mysql.jdbc.Driver spring.quartz.properties.org.quartz.dataSource.myDataSource.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai spring.quartz.properties.org.quartz.dataSource.myDataSource.user = root spring.quartz.properties.org.quartz.dataSource.myDataSource.password = 123456 spring.quartz.properties.org.quartz.dataSource.myDataSource.maxConnections = 10 ``` 上述配置文件中,我们使用了 MySQL 数据库作为 Quartz 的存储介质,并指定了相关的连接信息。 3. 定义定时任务 定义一个继承自 QuartzJobBean 的类,实现 executeInternal 方法来编写定时任务的业务逻辑。 ``` public class MyJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("定时任务开始执行:" + new Date()); // TODO: 执行具体的业务逻辑 } } ``` 4. 定义 Cron 表达式 定义一个 Cron 表达式,用来指定定时任务的执行时间。例如,我们可以将定时任务设置为每天的凌晨 3 点执行: ``` 0 0 3 * * ? ``` 5. 配置定时任务调度器 在 Spring Boot 的配置类中,好的,下面是关于使用Spring Boot和Quartz进行动态定时的回答: 1. 首先,在Spring Boot项目中添加Quartz依赖项。你可以在pom.xml文件中添加以下代码: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> ``` 2. 然后,创建一个实现Job接口的任务类。例如,下面是一个打印消息的简单任务类: ```java public class MyJob implements Job { public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Hello Quartz!"); } } ``` 3. 接下来,配置Quartz的调度器和触发器。你可以在Spring Boot的配置类中添加以下代码: ```java @Configuration public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class).withIdentity("myJob").storeDurably().build(); } @Bean public Trigger trigger(JobDetail job) { return TriggerBuilder.newTrigger().forJob(job).withIdentity("myTrigger").withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")).build(); } @Bean public Scheduler scheduler(Trigger trigger, JobDetail job) throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(job, trigger); scheduler.start(); return scheduler; } } ``` 这里我们定义了一个名为“myJob”的任务和一个名为“myTrigger”的触发器。触发器使用了Cron表达式,表示每5秒执行一次任务。 4. 最后,在你的Spring Boot应用程序中,你可以注入Scheduler并使用它来控制Quartz调度程序的启动和停止: ```java @Autowired private Scheduler scheduler; // 启动调度程序 scheduler.start(); // 停止调度程序 scheduler.shutdown(); ``` 这就是使用Spring Boot和Quartz进行动态定时的基本步骤。你可以根据自己的需求调整任务和触发器的配置,实现更复杂的定时任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值