Spring4.2.1+quartz2.2.1整合,集群分布式调度

来源:互联网 发布:老司机软件排行 编辑:程序博客网 时间:2024/04/29 07:37

之前做项目很多时候也用到spring的定时任务,不过由于项目的用户量小,一直没有深入研究如果是采用服务器集群作为项目部署,怎么才能让定时任务间能够协调工作?毕竟每个定时任务都有自己承载的业务,如果偷懒点,一台部署定时任务,其他不部署貌似也行,不过哪天一不小心服务器挂了怎么办?快过年了,刚好有时间静下来好好看看怎么处理这个问题场景。

这两天没少百度,经常看着别人写的都有视觉疲劳了。很多配置都很像,但是真的用到自己的项目中又是问题百出。下面我分享下这两天的成果吧~

1. 在项目中添加quartz相关的jar包,quartz-2.2.1.jar和quartz-job-2.2.1.jar;(原本我的项目架构就是使用springMVC,spring的包已经添加了,这里不多说了),主要的是在数据库创建相关的11张表,下载包里面就有。


2. 在src目录下添加quartz.properties


3. 创建JobDetailBean类,继承QuartzJobBean


3. 创建2个定时任务,DemoJob和DemoJob2(2个写法一样,只是个实例)


4.在src目录下添加applicationContext-quartz.xml

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans

            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


<!-- 任务1 -->

<beanid="demoJobDetail"

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

<propertyname="jobClass"value="com.weizx.quartz.JobDetailBean"/>

<propertyname="durability"value="true"/>

<propertyname="description"value="测试job"/>

<propertyname="jobDataAsMap">

<map>

<entrykey="targetObject"value="demoJob"/>

<entrykey="targetMethod"value="execute"/>

</map>

</property>

</bean>


<beanid="demoJobTrigger"

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

<propertyname="jobDetail"ref="demoJobDetail"/>

<propertyname="cronExpression"value="0/5 * * * * ?"/>

</bean>

<!-- 任务2 -->

<beanid="demoJobDetail2"

class="org.springframework.scheduling.quartz.JobDetailFactoryBean">

<propertyname="jobClass"value="com.weizx.quartz.JobDetailBean"/>

<propertyname="durability"value="true"/>

<propertyname="description"value="测试job2"/>

<propertyname="jobDataAsMap">

<map>

<entrykey="targetObject"value="demoJob2"/>

<entrykey="targetMethod"value="execute"/>

</map>

</property>

</bean>


<beanid="demoJobTrigger2"

class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">

<propertyname="jobDetail"ref="demoJobDetail2"/>

<propertyname="cronExpression"value="0/8 * * * * ?"/>

</bean>


<!-- 以下是Quartz定时调度配制 -->

<beanid="schedulerFactory"

class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

<propertyname="configLocation"value="classpath:quartz.properties"/>

<propertyname="dataSource"ref="dataSource"/>

<propertyname="applicationContextSchedulerContextKey"value="applicationContext"/>

<!--可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了 -->

<propertyname="overwriteExistingJobs"value="true"/>

<!-- 设置自动启动 -->

<propertyname="autoStartup"value="true"/>

<propertyname="startupDelay"value="5"/>

<propertyname="triggers">

<list>

<refbean="demoJobTrigger"/>

<refbean="demoJobTrigger2"/>

</list>

</property>

</bean>

</beans>


5.在web.xml中添加applicationContext-quartz.xml



启动项目,查看控制台,运行结果如下:



我实践过程中主要遇到的问题:

我的项目是用mysql作为数据库,连接的驱动jar为mysql-connector-java-5.1.13.jar,结果一直报错,后来查了下才知道是jar包不兼容,网上说要mysql-connector-java-5.1.36及以上的,我这里用mysql-connector-java-5.1.40,没有问题。


0 0
原创粉丝点击