首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

在Spring 停配置Quartz集群

2012-07-15 
在Spring 下配置Quartz集群由于项目将要上线,而项目中的Quartz集群配置一直没时间弄,本以为应该是一件挺简

在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" 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>  


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

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

希望本篇笔记能帮到有需要的人。

热点排行