在Spring 下配置Quartz集群

由于项目将要上线,而项目中的Quartz集群配置一直没时间弄,本以为应该是一件挺简单的事,没想到Gooble了一两天才解决问题,主要是因为Spring到3.0.7这个版本为止都没有原生支持Quartz的集群,原来的Quartz配置在单实例下运行正常,配置集群之后各种异常都来了,今天终于配置成功,在这里做一个笔记,避免以后走弯路。

这里要先感谢一下http://blog.csdn.net/lifetragedy/article/details/6212831的博主,在参考了此博客后才得以成功。

首先是任务Bean,可以是一个普通的Service或者Bean


@Service("helloJob")
public HelloServiceImpl implements HelloService{
@Autowired
private HelloDao dao;
public void executeJob(){
List list = dao.findJob();
// TODO:这里实现自己的功能
}
}


第二步创建一个任务代理类DetailQuartzJobBean

public class DetailQuartzJobBean extends QuartzJobBean implements ApplicationContextAware {
protected final Log logger = LogFactory.getLog(getClass());

private String targetObject;
private String targetMethod;
private ApplicationContext ctx;

protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
try {
logger.info("execute [" + targetObject + "] at once>>>>>>");
Object otargetObject = ctx.getBean(targetObject);
Method m = null;
try {
m = otargetObject.getClass().getMethod(targetMethod,new Class[] {});
m.invoke(otargetObject, new Object[] {});
} catch (SecurityException e) {
logger.error(e);
} catch (NoSuchMethodException e) {
logger.error(e);
}
} catch (Exception e) {
throw new JobExecutionException(e);
}
}

public void setApplicationContext(ApplicationContext applicationContext){
this.ctx=applicationContext;
}

public void setTargetObject(String targetObject) {
this.targetObject = targetObject;
}

public void setTargetMethod(String targetMethod) {
this.targetMethod = targetMethod;
}


这个类是调用Job service的关键

第三步建立Spring quartz配置文件

<!-- 定义任务 -->
<bean id="helloTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<!-- 上面的任务代理类 -->
<value>your.package.DetailQuartzJobBean</value>
</property>
<property name="jobDataAsMap">
<map>
<!-- 实际的任务的Bean name,填上HelloServiceImpl的Bean name -->
<entry key="targetObject" value="helloJob" />
<!-- 执行Bean中的哪个方法 -->
<entry key="targetMethod" value="executeJob" />
</map>
</property>
</bean>
<!-- 任务触发器 -->
<bean id="helloTaskTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<!-- 任务代理Bean name -->
<ref bean="helloTask" />
</property>
<property name="cronExpression">
<!-- 配置表达式,这里表示每一分钟执行一次 -->
<value>0 0/1 * * * ?</value>
</property>
<!-- 没有这个会异常 -->
<property name="volatility" value="true" />
</bean>
<!-- 任务调度入口 -->
<bean autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 任务列表,可以配置多个任务加入到该List -->
<property name="triggers">
<list>
<ref local="helloTaskTrigger" />
</list>
</property>
<!-- 数据源,如果Quartz的表位于项目数据源中则可直接使用项目数据源-->
<property name="dataSource" ref="dataSource"></property>
<property name="transactionManager" ref="txManager" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">BatchScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">5</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>
<prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.jobStore.useProperties">false </prop>
</props>
</property>
</bean>


最后差点要忘了,得建立Quartz表,quartz的集群同步是通过数据库保证的,所以位于同一个集群中的Quartz必须连接到同一个数据源。

此方法在Spring 3.0.7、Quartz 1.86下测试通过,quartz的建表语句可以从quartz子目录docs\dbTables下找到。

希望本篇笔记能帮到有需要的人。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值