锁定老帖子 主题:quatrz 任务监控管理 (2)
精华帖 (1) :: 良好帖 (1) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-08
liwy2008 写道 请教楼主:怎么部署该用,我把它放到tomcat下跑步了啊 下载后用eclipse导入就可以了。 |
|
返回顶楼 | |
发表时间:2010-06-09
运行楼主的demo,添加一个trigger的时候,抛出如下的错误提示:
1:Caused by: org.quartz.JobPersistenceException: Couldn't store job: JobDataMap values must be Strings when the 'useProperties' property is set. Key of offending value: simpleService [See nested exception: java.io.IOException: JobDataMap values must be Strings when the 'useProperties' property is set. Key of offending value: simpleService] at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1105) at org.quartz.impl.jdbcjobstore.JobStoreSupport$4.execute(JobStoreSupport.java:1075) at org.quartz.impl.jdbcjobstore.JobStoreSupport$40.execute(JobStoreSupport.java:3688) at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:244) at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInLock(JobStoreSupport.java:3684) at org.quartz.impl.jdbcjobstore.JobStoreSupport.storeJob(JobStoreSupport.java:1071) at org.quartz.core.QuartzScheduler.addJob(QuartzScheduler.java:814) at org.quartz.impl.StdScheduler.addJob(StdScheduler.java:288) at com.sundoctor.quartz.service.SchedulerServiceImpl.schedule(SchedulerServiceImpl.java:91) ... 21 more JobDataMap values must be Strings when the 'useProperties' property is set. Key of offending value: simpleService 解决办法: 找到 applicationContext-quartz.xml文件 注释掉下面的语句即可解决上面的问题。 #org.quartz.jobStore.useProperties = true 不过楼主的applicationContext-quartz.xml配置文件 本身就是注释掉的,是小弟自己打开才出现上面这个错误的,还好google下搞定了,呵呵! 感想您给广大网友提供的demo,谢谢!您会万福的! |
|
返回顶楼 | |
发表时间:2010-06-16
恩...关注楼主的文章很久了,自己也实际用到了Quartz
很强大。 在任务部署中,可以通过前台传参数的方法给任务进行定制,这里就会用到JobDataMap,任务持久化,这个Map里的东西会一起持久。 然后再任务运行中,偶尔会遇到任务的状态为ERROR,因为用了LZ之前的代码,经过自己测试时任务在运行时意外终止服务器,就会导致服务器再次启动时触发上次未完成的任务。 如果温柔的关闭服务器,任务的状态则为等待,在trigger表就没有记录,也就没有这个问题。 像seesionfactory也很棘手,不过LZ也已经解决了。 还有个问题是: 在任务持久化之后,我如何能立即触发这个任务? 通过调度器我们可以得到任务的信息,也可以让任务立即执行,但是任务的执行还是会从等待状态到运行,有没有办法能够让任务进入运行状态,或者动态更改触发的时间?? 我现在的处理办法也是添加,判断是否有,有则删除,添加为立即触发的任务。 应该有更好的办法:) |
|
返回顶楼 | |
发表时间:2010-06-21
<bean id="jobDetail" class="frameworkx.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--shouldRecover属性为true,则当Quartz服务被中止后,再次启动任务时会尝试恢复执行之前未完成的所有任务--> <property name="shouldRecover" value="true"/> <property name="targetObject" ref="customerService"/> <property name="targetMethod" value="testMethod1"/> </bean> 这个 targetMethod怎么来配置动态参数,而不是写死到里面? |
|
返回顶楼 | |
发表时间:2010-06-30
targetMethod方法里怎么获取JobExecutionContext这个方法
|
|
返回顶楼 | |
发表时间:2010-07-11
public class SpringBeanService implements Serializable
也就是说在持久化时,都必须将这个SpringBeanService 序列化到数据库中,若是service还依赖其他的业务逻辑,那就关联的东西就太大了。 其实是可以更简单一点的,在quartzScheduler中 <property name="applicationContextSchedulerContextKey" value="applicationContextKey"/> 在代码中直接引用这个applicationContext就OK了 public void execute(JobExecutionContext context) throws JobExecutionException { SchedulerContext schedulerContext = null; try { schedulerContext = context.getScheduler().getContext(); if (null == schedulerContext) { //ERROR return; } } catch (SchedulerException e) { e.printStackTrace(); } this.executionContext = context; this.applicationContext = (ApplicationContext) schedulerContext.get(TaskConstant.CONSTANT_APPLICATION_CONTEXT_KEY); init(); execute(); } protected abstract void init(); // 自己初始化Bean 这样就可以避免序列化Service时引入依赖的业务逻辑 |
|
返回顶楼 | |
发表时间:2010-07-11
我使用的定时器的设计思想:
1.定义任务模板,一般提供一套规范的任务模板定义机制 2.根据任务模板,生成具体的任务,关联上一个定时器 |
|
返回顶楼 | |
发表时间:2010-08-11
请教楼主 在MethodInvokingJobDetailFactoryBean类中 注入 shouldRecover为false. Quartz服务在指定时间段停止后 重新启动 为什么还会尝试未执行的任务?
|
|
返回顶楼 | |
发表时间:2010-09-14
感谢你的思路,但是太麻烦了,不需如此。
Quartz已经提供了Job实例化的入口: public interface JobFactory { Job newJob(TriggerFiredBundle bundle) throws SchedulerException; } 可以构造一个SpringJobFactory对象,注入Spring ApplicationContext对象。 把任务对象在ApplicationContext配置的名称和要执行的方法放在jobDataMap中。 用SpringJobFactory构造一个Job代理类调用任务对象的方法。 |
|
返回顶楼 | |