2008-05-22
quartz 在WEB中应用小结
前一个项目曾经用到过quartz,没好好总结一下,现在的项目中又用到了,害得我又花了查了两天查资料、做测试!现在OK了,系统目前运行正常,做个小结。
1. 基本配置
官网上有quartz的所有版本,下一个,把quartz-all-*.jar(根据需要)添加到lib目录中,在classpath目录添加quartz.properties属性文件,接下来你就可以进行开发了。
这是quartz.properties的基本配置。
2. web基本应用
quartz在web项目中有多种应用方式,和项目使用的其他技术也有关系。
添加一个servlet,将它配置到web.xml中:
这样你就可以在这个servlet中,在服务器加载的时候同时加载定时任务:
任务定义和加载在quartz的示例中有,这里不多费口舌了。
3. xml形式的任务配置
xml形式的应用,需要使用quartz的xml支持插件,只需有实现Job接口的任务就可以;这时需要在web.xml中添加默认的servlet配置:
在quartz.properties中添加xml配置需要的参数:
上面配置中的fileNames是指向的classpath根目录。
在xml文件中定义任务名称和触发器,例如:
这样就OK了!几种配置可以同时应用,不会冲突!
4. quartz的动态时间管理
有时需要在不停止web服务的情况下修改任务的执行时间格式,网上的资料大多是在使用spring框架支持时如何动态管理时间格式的介绍。在使用spring支持时可以,不使用spring时更加简单。
动态时间管理的关键是要共享调度管理器对象Scheduler,我们可以在最初加载任务调度的时候将它添加到servlet上下文中。
这样,我们就可以在需要修改时间格式的地方使用了!下面的ctt变量就是一个ServletContext对象。通过Scheduler 的getTrigger方法取到触发器,用触发器对象的getCronExpression方法可以获得时间格式。之后你可以另外创建一个同名的触发器,也可以修改现有触发器,再让调度管理器重新加载到内存就可以了!
5.相关问题
配置完成后,定时任务不加载执行,在日志中报错:
java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
这个是commons-collections.jar版本过低的原因,更换个新版本的就可以了!
还有,为了防止开发人员在本地测试时,执行定时任务造成数据冲突,需要对主机服务器Ip进行判断,只有指定的服务器上才可以执行定时任务!
quartz还可以对数据库操作,还有JobStore等等,以后应用到再说!哈!附带一份《quartz开发指南》!
1. 基本配置
官网上有quartz的所有版本,下一个,把quartz-all-*.jar(根据需要)添加到lib目录中,在classpath目录添加quartz.properties属性文件,接下来你就可以进行开发了。
这是quartz.properties的基本配置。
#============================================================================ # Configure Main Scheduler Properties #============================================================================ org.quartz.scheduler.instanceName = TestScheduler org.quartz.scheduler.instanceId = AUTO #============================================================================ # Configure ThreadPool #============================================================================ org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount = 3 org.quartz.threadPool.threadPriority = 5 #============================================================================ # Configure JobStore #============================================================================ org.quartz.jobStore.misfireThreshold = 60000 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
2. web基本应用
quartz在web项目中有多种应用方式,和项目使用的其他技术也有关系。
添加一个servlet,将它配置到web.xml中:
<servlet> <servlet-name>QuartzStartupServlet</servlet-name> <servlet-class>com.StartupServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
这样你就可以在这个servlet中,在服务器加载的时候同时加载定时任务:
public void init(ServletConfig cfg) throws javax.servlet.ServletException
{
log.info("server start!");
initScheduler(cfg);
}
protected void initScheduler(ServletConfig cfg)
{
try
{
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
SimpleExample simpleExample = new SimpleExample(scheduler);
simpleExample.run();
} catch (Exception e)
{
log.error(e);
}
}
任务定义和加载在quartz的示例中有,这里不多费口舌了。
3. xml形式的任务配置
xml形式的应用,需要使用quartz的xml支持插件,只需有实现Job接口的任务就可以;这时需要在web.xml中添加默认的servlet配置:
<servlet> <display-name>Quartz Initializer Servlet</display-name> <servlet-name>QuartzInitializer</servlet-name> <servlet-class> org.quartz.ee.servlet.QuartzInitializerServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
在quartz.properties中添加xml配置需要的参数:
#============================================================================ # Configure Plugins #============================================================================ org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin org.quartz.plugin.jobInitializer.fileNames = jobs.xml org.quartz.plugin.jobInitializer.overWriteExistingJobs = true org.quartz.plugin.jobInitializer.failOnFileNotFound = true org.quartz.plugin.jobInitializer.scanInterval = 10 org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
上面配置中的fileNames是指向的classpath根目录。
在xml文件中定义任务名称和触发器,例如:
<?xml version="1.0" encoding="UTF-8"?> <quartz> <job> <job-detail> <name>dailybalance</name> <group>balance</group> <job-class>com.SimpleJob</job-class> </job-detail> <trigger> <cron> <name>dailybalancetrigger</name> <group>balance</group> <job-name>dailybalance</job-name> <job-group>balance</job-group> <cron-expression>0/50 * * * * ?</cron-expression> </cron> </trigger> </job> </quartz>
这样就OK了!几种配置可以同时应用,不会冲突!
4. quartz的动态时间管理
有时需要在不停止web服务的情况下修改任务的执行时间格式,网上的资料大多是在使用spring框架支持时如何动态管理时间格式的介绍。在使用spring支持时可以,不使用spring时更加简单。
动态时间管理的关键是要共享调度管理器对象Scheduler,我们可以在最初加载任务调度的时候将它添加到servlet上下文中。
SchedulerFactory sf = new StdSchedulerFactory(); Scheduler scheduler = sf.getScheduler(); ...... ...... cfg.getServletContext().setAttribute(SCHEDULER_KEY, scheduler); scheduler.start();
这样,我们就可以在需要修改时间格式的地方使用了!下面的ctt变量就是一个ServletContext对象。通过Scheduler 的getTrigger方法取到触发器,用触发器对象的getCronExpression方法可以获得时间格式。之后你可以另外创建一个同名的触发器,也可以修改现有触发器,再让调度管理器重新加载到内存就可以了!
/**
* reset quartz job time
*/
public void reSetLotteryLoseBiddingTime(int lotteryType, Date date)
{
scheduler = (Scheduler) this.ctt.getAttribute(TIMING_WORK_SCHEDULER);
try
{
String lotteryName = "";
switch (lotteryType)
{
case 1://
lotteryName = "ssq";
break;
case 2://
{
lotteryName = "3D";
}
break;
case 3://
{
lotteryName = "qlc";
}
break;
case 4://
{
lotteryName = "23x5";
}
break;
default:
break;
}
loseBiddingJob = scheduler.getJobDetail("loseBiddingJob_" + lotteryName, "loseBiddingGroup");
loseBiddingTrigger = (CronTrigger) scheduler.getTrigger("loseBiddingTrigger_" + lotteryName,
"loseBiddingGroup");
String time = loseBiddingTrigger.getCronExpression();
if (!time.equals(this.timeFormat(date)))
{
loseBiddingTrigger = new CronTrigger("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup",
"loseBiddingJob_" + lotteryName, "loseBiddingGroup", this.timeFormat(date));
Date ft = scheduler.rescheduleJob("loseBiddingTrigger_" + lotteryName, "loseBiddingGroup",
loseBiddingTrigger);
log.info(loseBiddingJob.getFullName() + " has been scheduled to run at: " + ft
+ " and excute based on expression: " + loseBiddingTrigger.getCronExpression());
}
} catch (Exception e)
{
log.error(e);
}
}
5.相关问题
配置完成后,定时任务不加载执行,在日志中报错:
java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
这个是commons-collections.jar版本过低的原因,更换个新版本的就可以了!
还有,为了防止开发人员在本地测试时,执行定时任务造成数据冲突,需要对主机服务器Ip进行判断,只有指定的服务器上才可以执行定时任务!
public boolean compareService(String thisIp)
{
Properties properties = this.getProperties();
String serviceIp = "";
try
{
if (properties != null)
{
serviceIp = properties.getProperty("timing.work.serviceIp");
if (serviceIp != null && serviceIp.equals(thisIp))
return true;
}
} catch (Exception e)
{
log.error(e);
}
return false;
}
quartz还可以对数据库操作,还有JobStore等等,以后应用到再说!哈!附带一份《quartz开发指南》!
- 08:46
- 浏览 (1537)
- 评论 (8)
- 分类: 技术研究
- 发布在 济南JavaEyer群 圈子
- 相关推荐
评论
chc123456
2008-05-23
我倒是不喜欢吧quartz直接放到Web容器里头 都是单独启动 当然也可以单独启动个tomcat来干调度的事情~
lsk
2008-05-23
我用的没有这么复杂.只需要在spring当中注册一下就可以了.
具体可以看看
http://lsk.javaeye.com/admin/blogs/173924
具体可以看看
http://lsk.javaeye.com/admin/blogs/173924
daoger
2008-05-23
笔误!已改正!
fight_bird
2008-05-23
基于jdk6的应用基本可以抛开quartz,楼主的标题是不是笔误?还是新名词?
王者之剑
2008-05-23
写得不错,不过我认为不应该把定时的程序和Web程序绑在一起。
做成一个单独的程序要好一些。
做成一个单独的程序要好一些。
miracle9i
2008-05-23
牛人 支持一下~
daoger
2008-05-22
LS这位老兄也说一下你们的用法吧!让俺学习一下,哈!
imKenny
2008-05-22
顶一个
前段时间刚把quartz用到项目中去
不过和LZ手段不太相同
发表评论
- 浏览: 190901 次
- 性别:

- 来自: 山东济南

- 详细资料
搜索本博客
我的相册
image007
共 105 张
共 105 张
最近加入圈子
最新评论
-
让人头疼的新手
ql = " from OccurProj a where a.id=" + i ...
-- by kimmking -
让人头疼的新手
sql = " select sum(amount) from OccurPro ...
-- by kimmking -
让人头疼的新手
这样的新人,为什么会转正,当初怎么过试用期的!这才是应该反思的!
-- by javaxy -
svg应用
你好,我目前在做的一个项目也是使用SVG做实时监控,目前已经实现了主要功能,但是 ...
-- by zpj888 -
让人头疼的新手
moneyworship 写道太恐怖了吧~~这..这..太刺激了~~ ???
-- by daoger






评论排行榜