`

Spring定时任务的动态配置

 
阅读更多

     首先吐槽下,去年11月以实习生的身份来到现在的公司,到今年毕业转正,转正还没多久,社保卡都没发下来呢。实习这段时间没有怎么好好的学习工作吧,毕业后工资也不是很高,很多同学都比我高不少,无奈毕业季工作不好找也害怕去找就安稳的呆着,反正还有好多东西要学,工资也能养活自己,不用管家里要钱了吧。可是有的时候还是很不平衡,毕竟自我感觉自己的技术和很多工资比我高的同学相比,还算不赖吧!也算是对自己的考验吧,等把公司的东西都学会了自己的水平也提高了,再要高点,可能公司给多点的几率不大,那就再跳呗。

     吐槽下自己,这一段时间太沉迷于游戏了,没有好好的利用时间整理自己的知识系统,有好多工作中领悟的东西都没及时记下来,到现在都忘记了。于是我打算从新来过,好好管理我的IT眼,好好工作学习。

     好了,开始正题:Spring定时任务动态配置,我也有好多不懂的,既然来了就留下脚印,交流下把。吐槽下网上的好多动态配置定时任务的帖子,都是一样的,让我好是蛋疼。对比着来把。

       首先是我们自己书写的类的Bean创建:

<bean id="logAdd2FARSTask" class="com.thid.business.task.LogAdd2FARSTask" >
	<property name="scheduler" ref="schedulerFactory" /> 
	<property name="personAlarmLogService">
			<ref bean="personAlarmLogService"/>
	</property>
</bean>
<bean id="logAdd2FARSTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject">
		<ref bean="logAdd2FARSTask" />
	</property>
	<property name="targetMethod">
		<value>addStart</value>
	</property>
	<property name="concurrent" value="false"/>
</bean>
<bean id="logAdd2FARSTaskJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail">
		<ref bean="logAdd2FARSTaskJob" />
	</property>
	<property name="cronExpression">
		<value>0/10 * * * * ?</value>
	</property>
</bean>
<bean id="schedulerFactory"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
	<property name="triggers" >
		<list>
			<ref bean="logAdd2FARSTaskJobTrigger" />	
		</list>
	</property>
</bean>
 


<bean id="logAdd2FARSTask" class="com.thid.business.task.LogAdd2FARSTask" >
	<property name="personAlarmLogService">
		<ref bean="personAlarmLogService"/>
	</property>
</bean>
<bean id="logAdd2FARSTaskJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject">
		<ref bean="logAdd2FARSTask" />
	</property>
	<property name="targetMethod">
		<value>addStart</value>
	</property>
	<property name="concurrent" value="false"/>
</bean>
<bean id="logAdd2FARSTaskJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	<property name="jobDetail">
		<ref bean="logAdd2FARSTaskJob" />
	</property>
	<property name="cronExpression">
		<value>0/10 * * * * ?</value>
	</property>
</bean>
<bean id="schedulerFactory"  class="org.springframework.scheduling.quartz.SchedulerFactoryBean" >
	<property name="triggers" >
		<list>
			<ref bean="logAdd2FARSTaskJobTrigger" />
		</list>
	</property>
</bean>

  本来想弄个颜色把不同的地方标注起来,可是不太会用~说吧,两者的区别就在于第一个Bean中,动态配置的时候需要将schedulerFactory这个类注入到我们写的业务类中,注意观察下就可以发现,这个schedulerFactory就是我们代码最后的对所有定时任务进行管理的定时器工厂类,可以看下哦!之所以要向我们自己写的类中注入工厂类是因为我们要通过工厂类对我们要动态配置的定时任务进行管理。其实动态任务的实现就是通过工厂类对定时任务的cronExpression进行更改管理,从而实现动态配置的目的。下面看下Java代码中是如何配置:


public void setPersonAlarmLogService(PersonAlarmLogService personAlarmLogService) throws ParseException, SchedulerException {
	this.personAlarmLogService = personAlarmLogService;
	String triggerName = "logAdd2FARSTaskJobTrigger";
	CronTriggerBean trigger = (CronTriggerBean)scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
	if(trigger!=null){
		SysParameter param = sysUserService.getSysParam();
		String cronExpression = getCronExpressionFromDB(param);
	    trigger.setCronExpression(cronExpression);
	}
}

/**
 * 自定义定时器调度时间
 *  @param  triggerName 触发器名称
 *  @throws  Exception 
 */ 
public void updateNotificationInterval(String triggerName,SysParameter sysParameter)
         throws  SchedulerException, ParseException   {
    // 得到trigger 
    CronTriggerBean trigger = (CronTriggerBean)scheduler.getTrigger(triggerName, Scheduler.DEFAULT_GROUP);
    // 得到cron expression       
    if(trigger!=null){
    	String cronExpression = getCronExpressionFromDB(sysParameter);
	    String oldCronExpression = trigger.getCronExpression();
	    if(!oldCronExpression.equals(cronExpression)){
		    // 设置trigger的时间规则 
		    trigger.setCronExpression(cronExpression);
		    // 重置job 
		    scheduler.rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, trigger);
	    }
	    System.out.println(trigger.getCronExpression());
    }
} 

public String getCronExpressionFromDB(SysParameter sysParameter){
	String dbCronExpression = null;
	if(sysParameter==null){
		dbCronExpression = "0 0 0 * * * ?";
	}else{
		String hour =sysParameter.getRev7();
		dbCronExpression = "0"+" "+"0"+" "+"*/"+hour+" "+"*"+" "+"*"+" "+"?";
	}
	return dbCronExpression;
}

       首先如果我们不需要在服务器启动的时候去数据库读定时任务的执行时间的话,那么第一个方法可以直接跳过,但是大多数向做动态定时任务的都应该会在启动的时候去读数据库。简单做下介绍,这个方法是personAlarmLogService的set方法,在程序启动加载到这里的时候,会通过我们注入的scheduler的getTrigger查找名为logAdd2FARSTaskJobTrigger的触发器,如果找到了就从数据库中查询我们添加的执行方案,然后通过setCronExpression方法将执行方案设置到我们查找的trigger中,就形成了启动时的动态配置。

       然后我们每次更改时间的时候,都调用下更改触发器的方法,在我的代码里是updateNotificationInterval方法。同样是通过名称获得trigger,然后setCornExpression,都进行完了之后别忘了从新启动定时任务,也就是这行代码

 

scheduler.rescheduleJob(triggerName, Scheduler.DEFAULT_GROUP, trigger);

 

 还有就是这个类要继承CronTriggerBean类.

 ---------------------以下是我遇到的问题求解答--------------------

1. 网上的例子启动的时候就从数据库读取规则是不用设置时间规则,也就是下面这段不用配置,可是我把他注释掉会报错。求解答

 

<property name="cronExpression">
	<value>0/10 * * * * ?</value>
</property>

 2.为什么我在工厂类的LIST中将这个触发器注释掉,会报错,然后再把下面代码注释掉就不报错了?这个service就是我在启动时设置定时任务的cronExpression的方法。

 

<property name="personAlarmLogService">
		<ref bean="personAlarmLogService"/>
</property>

 

希望走过路过的兄弟姐妹们帮着小弟解答下问题,代码有点水见谅。



 

分享到:
评论

相关推荐

    springboot动态配置定时任务(schedule)

    在Spring Boot应用中,动态配置定时任务是提升系统灵活性和可维护性的重要手段。Spring Boot集成了Spring Framework的TaskExecution和TaskScheduling模块,使得我们可以方便地创建和管理定时任务。本文将深入探讨...

    spring动态配置定时任务

    这时,我们可以将定时任务配置移到数据库中,通过读取数据库中的定时规则来动态执行任务。首先,我们需要创建一个数据库表来存储这些规则,如`job_config`,包含字段`id`、`task_name`、`cron_expression`等。 接着...

    spring定时任务配置

    spring定时任务SimpleTrigger 和CronTrigger 配置

    springboot定时任务的动态开启关闭

    在Spring Boot应用的配置文件(`application.properties`或`application.yml`)中,我们可以设置全局的定时任务配置。例如,我们可以设置一个固定的延迟时间让定时任务开始执行: ```properties spring.task....

    spring整合java quartz实现动态定时任务的前台网页配置与管理

    可以通过quartz和spring的简单配置即可完成,但如果要改变任务的执行时间、频率,废弃任务等就需要改变配置甚至代码需要重启服务器,这里介绍一下如何通过quartz与spring的组合实现动态的改变定时任务的状态的一个...

    spring定时任务关键jar包(齐全)

    以上是关于Spring定时任务的关键知识点,这些内容涵盖了从任务的创建、配置到执行和监控的整个过程。通过理解并熟练运用这些概念,开发者可以有效地利用Spring来构建强大的定时任务系统。在实际项目中,务必确保`lib...

    Spring定时任务

    Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置Spring定时任务调用配置

    Spring定时任务实现(非Web项目)

    在非Web项目中实现Spring定时任务,主要步骤如下: 1. **配置Spring Task**:在Spring的配置文件(如`applicationContext.xml`或使用Java配置类)中,我们需要启用任务调度功能并配置相应的执行器或调度器。例如,...

    spring定时任务实现

    Spring框架提供了多种方式来实现定时任务,...推荐使用Spring Task,因为它简化了配置,降低了学习成本,同时仍然能满足大部分定时任务的需求。当然,如果需要高度定制和复杂的时间调度,Quartz仍然是一个强大的选择。

    spring定时任务依赖的jar包

    2. **依赖的jar包**:实现Spring定时任务,通常需要以下10个关键的jar包: - `spring-context`: 包含了Spring的核心功能,如依赖注入(DI),AOP,事件处理等,是实现定时任务的基础。 - `spring-context-support`: ...

    Springboot中使用数据库配置定时任务

    4. 从数据库加载定时任务配置并更新到Spring Boot的配置中。 5. 在业务逻辑类中使用`@Scheduled`注解来定义定时任务,并根据数据库配置动态调整执行频率。 通过这种方式,我们可以灵活地管理和调整应用中的定时任务...

    spring xml 定时任务

    在Spring框架中,XML配置是传统且广泛使用的方式来设置应用的组件和行为,包括实现定时任务。定时任务在软件开发中扮演着重要角色,它允许应用程序在预设的时间执行特定的任务,例如数据清理、日志归档或者发送通知...

    Spring 定时任务源码(spring 三种定时任务的实现方式)

    在Spring框架中,定时任务是实现系统自动化运行关键任务的重要工具。Spring提供了多种方式来创建和管理定时任务,...在chapter13目录下的文件可能包含了这些源码示例,你可以逐一研究,加深对Spring定时任务的理解。

    spring+quartz动态定时任务创建 +mybatis

    **Spring+Quartz动态定时任务创建** 将Spring与Quartz结合,我们可以方便地在运行时动态创建和修改定时任务。首先,我们需要在Spring配置文件中声明一个SchedulerFactoryBean,然后定义JobDetail和Trigger,分别表示...

    Spring定时任务的配置

    Spring 定时任务ApplicationContext.xml配置

    Spring @Scheduled定时任务动态修改cron参数

    `@Scheduled`注解是Spring Framework中用于创建定时任务的重要工具,它允许开发者在不重启应用的情况下,实现定时任务的动态配置,特别是修改cron表达式来调整执行周期。 在Spring中,定时任务主要通过`@Scheduled`...

    Spring 定时任务配置范例

    本文档详细介绍了Spring定时任务配置的两种方式。一种方式是使用Spring提供的 MethodInvokingJobDetailFactoryBean 代理类,Quartz通过该代理类直接调度任务类的某个函数,另外一种方式是任务类继承并实现Quartz接口...

    spring的定时任务的配置

    ### Spring 定时任务配置详解 #### 一、Spring 定时任务简介 Spring 框架提供了强大的任务调度功能,使得开发者能够轻松地在应用中实现定时任务。本篇文章将详细探讨如何在 Spring 中配置定时任务,并通过具体的...

Global site tag (gtag.js) - Google Analytics