Spring的org.springframework.scheduling.quartz.JobDetailBean提供Job可序列化的实现(具体实现可查看源码)

此时.我们原来的job就可以继承QuartzJobBean,便会自动序列化到数据库,quartz的具体配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="true"> <description>quartz配置</description> <!-- quartz使用的数据源配置 -->
<bean id="quartzDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${quartz.jdbc.driver}" />
<property name="url" value="${quartz.jdbc.url}" />
<property name="username" value="${quartz.jdbc.username}" />
<property name="password" value="${quartz.jdbc.password}" />
</bean> <!-- 另一个事务管理器, Jdbc单数据源事务 -->
<bean id="quartzTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="quartzDataSource" />
</bean> <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource" ref="quartzDataSource"/>
<property name="applicationContextSchedulerContextKey" value="applicationContext"/>
<property name="configLocation" value="classpath:quartz.properties"/><!--
这个是必须的,QuartzScheduler 延时启动,应用启动完后 QuartzScheduler 再启动
-->
<property name="startupDelay" value="30"/><!--
这个是可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
-->
<property name="overwriteExistingJobs" value="true"/>
<property name="jobDetails" >
<list>
<ref bean="serverHealthJobDetail"/>
</list>
</property>
</bean> <!-- 运行次数记录 -->
<bean id="serverHealthJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<!--requestsRecovery属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务-->
<property name="requestsRecovery" value="true"/>
<!-- 标识job是持久的,删除触发器的时候不被删除 -->
<property name="durability" value="true"/>
<property name="jobClass" value="cn.yzzn.hvac.quartz.job.ServerHealthJob"/>
</bean> </beans>

我们看到<property name="applicationContextSchedulerContextKey" value="applicationContext"/>此标签

Spring会帮我们自动注入applicationContext.并非上一篇文章中,通过Spring的工具手动获取applicationContext.

ServerHealthJob代码如下

public abstract class JobSupport extends QuartzJobBean {

    private BuildingManager buildingManager;
private PlcManager plcManager; private static Logger logger = LoggerFactory.getLogger(JobSupport.class); private ApplicationContext applicationContext;
/**
* 从SchedulerFactoryBean注入的applicationContext.
*/
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
} public <T> T getBean(String beanName, Class<T> clazz) {
return this.applicationContext.getBean(beanName, clazz);
} @Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
if (ObjectUtils.isNullOrEmptyString(buildingManager)) {
buildingManager = getBean("buildingManager", BuildingManager.class);
}
if (ObjectUtils.isNullOrEmptyString(plcManager)) {
plcManager = getBean("plcManager", PlcManager.class);
} List<Building> buildingList = buildingManager.getBuildings(); int size = buildingList.size();
for (int i = 0; i < size; i++) {
Building building = buildingList.get(i); Set<Plc> plcSet = building.getPlcs();
for (Plc plc : plcSet) {
innerIter(building, plc, i, size);
}
}
} public abstract void innerIter(Building building, Plc plc,
int index, int size); }
public class ServerHealthJob extends JobSupport { @Override
public void innerIter(Building building, Plc plc, int index, int size) {
// TODO Auto-generated method stub } }

ServerHealthJob就可以被Spring轻松的序列化到数据库.解决了上篇博文中繁琐的操作.

JobSupport是本人系统业务需求,同学们可自定义实现只要继承QuartzJobBean即刻.

数据库中已存在次jobDetail

TriggerManager也没多大变化

/**
* Quartz Scheduler 管理类
* 不带groupName参数的方法都采用自动填充默认组的形式 Scheduler.DEFAULT_GROUP
* @author PigWing
*
*/
public class SchedulerManagerImpl implements SchedulerManager { private QuartzDao quartzDao;
private Scheduler scheduler; private static Logger logger = LoggerFactory.getLogger(UserController.class); /***
* 增加一个触发器任务,采用默认组形式
*/
public void addTrigger(String triggerName, String jobName,
String cronExpression) throws SchedulerException, ParseException {
addTrigger(triggerName, Scheduler.DEFAULT_GROUP, jobName, Scheduler.DEFAULT_GROUP, cronExpression);
} /**
*
* 增加一个触发器任务
*/
public void addTrigger(String triggerName, String triggerGroupName,
String jobName, String jobGrourpName, String cronExpression) throws SchedulerException, ParseException {
if(StringUtils.isEmpty(triggerName)) {
throw new RuntimeException("triggerName can not be null");
} try {
JobDetail jobDetail = scheduler.getJobDetail(jobName, jobGrourpName);
if(jobDetail != null) {
scheduler.addJob(jobDetail, true);
CronTrigger cronTrigger = new CronTrigger(triggerName, triggerGroupName, jobDetail.getName(), jobGrourpName);
cronTrigger.setCronExpression(cronExpression);
scheduler.scheduleJob(cronTrigger);
scheduler.rescheduleJob(cronTrigger.getName(), cronTrigger.getGroup(), cronTrigger);
}else {
logger.error("cant not find jobDetail: " + jobGrourpName);
}
}catch(SchedulerException e) {
logger.error(e.getMessage());
throw e;
}
} /**
* 返回所有触发器信息
*/
public List<Map<String, Object>> getAllTriggers() {
return quartzDao.getQuartzTriggers();
} /**
* 停止触发器
*/
public void parseTrigger(String triggerName, String groupName)
throws SchedulerException {
try {
scheduler.pauseTrigger(triggerName, groupName);
}catch(SchedulerException e) {
logger.error(e.getMessage());
throw e;
} } /**
* 停止触发器,采用默认组形式
*/
public void parseTrigger(String triggerName) throws SchedulerException {
parseTrigger(triggerName, Scheduler.DEFAULT_GROUP); } /**
* 重启触发器
*/
public void resumeTrigger(String triggerName, String groupName)
throws SchedulerException {
try {
scheduler.resumeTrigger(triggerName, groupName);
}catch(SchedulerException e) {
logger.error(e.getMessage());
throw e;
} } /**
* 重启触发器,采用默认组形式
*/
public void resumeTrigger(String triggerName) throws SchedulerException {
resumeTrigger(triggerName, Scheduler.DEFAULT_GROUP);
} /**
* 移除触发器
*/
public boolean removeTrigger(String triggerName, String groupName)
throws SchedulerException {
try {
parseTrigger(triggerName, groupName);
return scheduler.unscheduleJob(triggerName, groupName);
}catch(SchedulerException e) {
logger.error(e.getMessage());
throw e;
}
} /**
* 移除触发器,采用默认组形式
*/
public boolean removeTrigger(String triggerName) throws SchedulerException {
try {
return removeTrigger(triggerName, Scheduler.DEFAULT_GROUP);
}catch(SchedulerException e) {
logger.error(e.getMessage());
throw e;
}
} /**
* 返回所有的任务名称
*/
public String[] getJobNames(String groupName) throws SchedulerException {
return scheduler.getJobNames(groupName);
} public String[] getJobNames() throws SchedulerException {
return scheduler.getJobNames(Scheduler.DEFAULT_GROUP);
} @Autowired
public void setQuartzDao(QuartzDao quartzDao) {
this.quartzDao = quartzDao;
} @Autowired
public void setScheduler(Scheduler scheduler) {
this.scheduler = scheduler;
} }

本文转自:http://www.cnblogs.com/pigwing/archive/2011/07/12/2104002.html

Quartz与Spring整合进行热部署的实现(二)的更多相关文章

  1. Quartz与Spring整合进行热部署的实现(一)

    先来几张实现图 任务管理页 新建任务管理.目前实现叫简单的需求...若各位同学要实现复杂的设计...quartz都有提供强大的支持.小弟目前的需求做到这已经够用了. 接下来.我们如何实现quartz的 ...

  2. Spring整合JMS-基于activeMQ实现(二)

    Spring整合JMS-基于activeMQ实现(二) 1.消息监听器      在Spring整合JMS的应用中我们在定义消息监听器的时候一共能够定义三种类型的消息监听器,各自是MessageLis ...

  3. spring boot 调试 - 热部署

    maven gradle Maven: 命令行方式: mvn spring-boot:run -Drun.jvmArguments="-Xdebug -Xrunjdwp:transport= ...

  4. spring boot 之热部署(三)

    热部署:当发现程序修改时自动启动应用程序. spring boot使用的是spring-boot-devtools是一个为开发者服务的一个模块.其原理用了classLoader 其中一个加载不变的类, ...

  5. Spring Boot实现热部署

    在Spring Boot实现代码热部署是一件很简单的事情,代码的修改可以自动部署并重新热启动项目. 引用devtools依赖 <dependency> <groupId>org ...

  6. 1. Spring boot 之热部署

    1. spring boot 热部署 1.1. springloaded springloaded可以实现修改类文件的热部署.下载地址:springloaded 安装单击Run Configurati ...

  7. spring boot 之热部署

    热部署:当发现程序修改时自动启动应用程序. spring boot使用的是spring-boot-devtools是一个为开发者服务的一个模块.其原理用了classLoader 其中一个加载不变的类, ...

  8. Spring boot的热部署

    当把配置文件,比如yml也打到jar包后,如何修改配置,而又不用重新发布呢? 在jar包同一目录下,放置Application.yml (注意,不管jar包内是否此文件名)修改配置文件后,重新启动ja ...

  9. IDEA下配置Spring Boot的热部署

    © 版权声明:本文为博主原创文章,转载请注明出处 devtools简介 spring-boot-devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的 ...

随机推荐

  1. 关于ubuntu配置静态IP 无法正常上网的解决方案

    在ubuntu中配置静态IP后无法正常上网. 解决: 1.在终端执行 vim /etc/network/interfaces 在文件中加入如下内容,网关要写上,我开始一直无法上网就是因为没有配置网关 ...

  2. iOS 关于Layer的疑问

    很久很久以前,就对ios的Layer十分的不解,学习了android后,打算通过android中的相关实现,分析一下ios中layer的作用,结果没有找到android中的对应的内容!十分让人郁闷.于 ...

  3. TinyMCE textarea 输入框外部程序动态修改方法

    TinyMCE textarea 输入框外部程序动态修改方法 Public Function C2IE_TINYMCE(ByVal id As String, ByVal value As Strin ...

  4. BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...

  5. poj 2421 Constructing Roads 解题报告

    题目链接:http://poj.org/problem?id=2421 实际上又是考最小生成树的内容,也是用到kruskal算法.但稍稍有点不同的是,给出一些已连接的边,要在这些边存在的情况下,拓展出 ...

  6. 【2016-08-06】QTableWidget的一些用法总结

    1. QTableWidget的列宽如何自适应显示区域大小? QTableWidget的列头继承自QHeaderView,因此如果不使用固定列宽而需要Table中多列的列宽自适应显示区域大小的话, 可 ...

  7. Step deep into GLSL

    1 Lighting computation is handled in eye space(需要根据眼睛的位置来计算镜面发射值有多少进入眼睛), hence, when using GLSL (GP ...

  8. 解决reload AVD list: cvc-enumeration-valid: Value '360dpi' is not facet-valid with respect to enumeration '[ldpi, mdpi, tvdpi, hdpi, 280dpi, xhdpi, 400dpi, xxhdpi, 560dpi, xxxhdpi]'. It must be a v

    解法: 将 D:\work\android-sdk-windows\tools\lib\devices.xml 替换到 D:\work\android-sdk-windows\system-image ...

  9. Android之Tab类总结

    本文主要包括以下Tab类实现方式 FragmentTabHost+Fragment实现 传统的ViewPager实现 FragmentManager+Fragment实现 ViewPager+Frag ...

  10. Zabbix discoverer processes more than 75% busy

    [root@86 ~]# grep -n "StartDiscoverers" /usr/local/zabbix/etc/zabbix_server.conf 176:### O ...