惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
P
Proofpoint News Feed
D
DataBreaches.Net
C
Check Point Blog
L
LangChain Blog
量子位
美团技术团队
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
V
Visual Studio Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Last Week in AI
Last Week in AI
The GitHub Blog
The GitHub Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
腾讯CDC
M
MIT News - Artificial intelligence
Microsoft Azure Blog
Microsoft Azure Blog
Blog — PlanetScale
Blog — PlanetScale

博客园 - 南郭先生kaka

待处理数据的两种模型 nginx重启无法找到PId的解决办法 Wiki版产品需求---产品需求文档到底是谁的?产品到底是谁的? 为什么说private方法是有罪的 XML2JSON 的【net.sf.json.JSONException: nu.xom.ParsingException must be followed by either attribute specifications, ">" or "/>"】问题解决办法 继承的第一原则 致那些不甘寂寞的人 上传File时,浏览器总是添加<pre>的解决办法 使用XSLT转换XML2XML Java 模拟 Http Post WITH AS SQL语句的用法 【Code Style】多余判断 java.lang.NoClassDefFoundError错误 FactoryBean在XML中的依赖注入方法 Camel FTP中文目录解决办法 配置CentOS6.3 NFS Bean复制的几种框架性能比较(Apache BeanUtils、PropertyUtils,Spring BeanUtils,Cglib BeanCopier) 重读《目标》---目标 重读《目标》---序
Spring 中Quartz配置数据库化
南郭先生kaka · 2013-04-01 · via 博客园 - 南郭先生kaka

       因为项目要求根据数据库的配置信息启动Spring中的Quartz的任务,这样就要求CronTriggerBean是动态多样的。搜索了很多文档也没有得其所以然,于是从Spring的配置信息进行入手了。

       网上介绍的各种例子中,默认都是以SchedulerFactoryBean进行开始的,也看到,里面就一个参数就是triggers,那么这样就好说了,只要把trigger根据数据库中的配置信息进行生成就好了。

<bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="doTime"/>
                </list>
            </property>
        </bean>

       伪代码就是这样的,写个类继承SchedulerFactoryBean

XXXvo = queryDB();
CronTriggerBean bean = new CronTriggerBean();
bean.setBeanName("beanNameFileSchedule");
            bean.setCronExpression(xxxvo.getCronExpression());

            jobDetailFactoryBean.setArguments(new Object[] { XXX});

    
            bean.setJobDetail((JobDetail) jobDetailFactoryBean.getObject());
            bean.afterPropertiesSet();

this.setTriggers((CronTriggerBean[]) this.triggerBeanList
                .toArray(new CronTriggerBean[0]));
        this.afterPropertiesSet();

  这样基本上就大功告成了,但是调试过程中的小问题却不少。

第一:CronTriggerBean和SchedulerFactoryBean都实现了InitializingBean接口,这样的话,需要在两个类的设置完属性之后,需要手动的调用afterPropertiesSet的方法。

第二:CronTriggerBean需要设置BeanName,原因看一下CronTriggerBean方法的afterPropertiesSet就知道了,quartz的trigger如果没有Name的话,就会报出来错误。

第三:Schedule的执行类配置到了Spring的XML中,但又因Schedule的执行类的执行方法有参数,这个参数又是动态传入的。这样的一个问题就是在SchedulerFactoryBean中调用下面的方法【jobDetailFactoryBean.setArguments(new Object[] { XXX});】设置参数的时候就已经晚了,因为Spring在实例化MethodInvokingJobDetailFactoryBean的时候就会报出来找不到方法的错误。现在的处理方式就是先在XML中为MethodInvokingJobDetailFactoryBean配置一个假的参数进去,只是为了占据类型,然后在SchedulerFactoryBean中重新设置一遍,设置完成后,不能忘记调用afterPropertiesSet()方法,不然trigger不起作用。

     写的稍微乱了一些,就先记录下来吧,后续再整理了。