在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:这里实现自己的功能 }}
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; }}
<!-- 定义任务 --><bean id="helloTask" value="helloJob" /> <!-- 执行Bean中的哪个方法 --> <entry key="targetMethod" value="executeJob" /></map> </property></bean><!-- 任务触发器 --><bean id="helloTaskTrigger" /> </property> <property name="cronExpression"> <!-- 配置表达式,这里表示每一分钟执行一次 --> <value>0 0/1 * * * ?</value> </property> <!-- 没有这个会异常 --> <property name="volatility" value="true" /></bean><!-- 任务调度入口 --><bean autowire="no" /> </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>