论坛首页 Java企业应用论坛

quatrz 任务监控管理 (2)

浏览 16300 次
精华帖 (1) :: 良好帖 (1) :: 新手帖 (2) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-06-08  
liwy2008 写道
请教楼主:怎么部署该用,我把它放到tomcat下跑步了啊

下载后用eclipse导入就可以了。
0 请登录后投票
   发表时间: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,谢谢!您会万福的!
0 请登录后投票
   发表时间:2010-06-16  
恩...关注楼主的文章很久了,自己也实际用到了Quartz

很强大。

在任务部署中,可以通过前台传参数的方法给任务进行定制,这里就会用到JobDataMap,任务持久化,这个Map里的东西会一起持久。

然后再任务运行中,偶尔会遇到任务的状态为ERROR,因为用了LZ之前的代码,经过自己测试时任务在运行时意外终止服务器,就会导致服务器再次启动时触发上次未完成的任务。

如果温柔的关闭服务器,任务的状态则为等待,在trigger表就没有记录,也就没有这个问题。

像seesionfactory也很棘手,不过LZ也已经解决了。

还有个问题是:

在任务持久化之后,我如何能立即触发这个任务?

通过调度器我们可以得到任务的信息,也可以让任务立即执行,但是任务的执行还是会从等待状态到运行,有没有办法能够让任务进入运行状态,或者动态更改触发的时间??

我现在的处理办法也是添加,判断是否有,有则删除,添加为立即触发的任务。

应该有更好的办法:)




0 请登录后投票
   发表时间: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怎么来配置动态参数,而不是写死到里面?
0 请登录后投票
   发表时间:2010-06-30  
targetMethod方法里怎么获取JobExecutionContext这个方法
0 请登录后投票
   发表时间: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时引入依赖的业务逻辑
0 请登录后投票
   发表时间:2010-07-11  
我使用的定时器的设计思想:
1.定义任务模板,一般提供一套规范的任务模板定义机制
2.根据任务模板,生成具体的任务,关联上一个定时器


0 请登录后投票
   发表时间:2010-08-11  
请教楼主 在MethodInvokingJobDetailFactoryBean类中 注入 shouldRecover为false.  Quartz服务在指定时间段停止后 重新启动 为什么还会尝试未执行的任务?
0 请登录后投票
   发表时间:2010-09-14  
感谢你的思路,但是太麻烦了,不需如此。
Quartz已经提供了Job实例化的入口:
public interface JobFactory {
 Job newJob(TriggerFiredBundle bundle) throws SchedulerException;
}

可以构造一个SpringJobFactory对象,注入Spring ApplicationContext对象。
把任务对象在ApplicationContext配置的名称和要执行的方法放在jobDataMap中。
用SpringJobFactory构造一个Job代理类调用任务对象的方法。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics