在我们开发的一个系统中,有定时任务,自然就想到了Quartz,由于框架采用的Spring,Quartz跟Spring的集成也非常简单,所以就把Quartz配置到框架中,当系统启动后,定时任务也就自动启动。在开发的过程中一直没有发现问题,但是最后上线的时候,采用的是weblogic cluster,启动了4个节点,发现有的定时任务执行了不止一次,才恍然大悟,4个节点启动了4个应用,也就启动了4个定时任务,所以在同一个时间定时任务执行了不止一次。去网上搜索,发现Quartz也支持cluster,但是我觉得就我们的系统而言,没有必要采用cluster的定时任务,也许是比较懒吧,就想让定时任务只执行一次。在网上搜到了robbin的一篇文章(http://robbin.iteye.com/blog/40989 ),发现把quartz集中到webapp当中还是有一定的风险,同时同一个时间点执行也不止一次。Robbin的解决办法就是自己单独启动一个Job Server,来quartz跑job,不要部署在web容器中。
我也比较同意这个办法。鉴于时间比较紧,就想有没有比较方便的方法。其实把原来的webapp当做一个quartz的容器就可以了。可以自己写一个线程来跑应用,再写一个command启动这个线程就可以了。线程类很简单,如下:
public class StartServer {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
new String[] { "/spring/context-annotation.xml","/spring/context-transaction.xml",
"/spring/context-hibernate.xml",
"/spring/context-quartz.xml"});
System.out.println("start server....");
while (true) {
try {
Thread.sleep(900);
} catch (InterruptedException ex) {
}
}
};
}
去掉了系统的controller配置servlet.xml,运行这个类就可以了。
在web-inf目录下写一个command来启动这个java类:
setlocal ENABLEDELAYEDEXPANSION
if defined CLASSPATH (set CLASSPATH=%CLASSPATH%;.) else (set CLASSPATH=.)
FOR /R .\lib %%G IN (*.jar) DO set CLASSPATH=!CLASSPATH!;%%G
Echo The Classpath definition is==== %CLASSPATH%
set CLASSPATH=./classes;%CLASSPATH%
java com.company.job.StartServer
这个command需要把需要的jar(web-inf/lib中)包都放到classpath中。
每次启动的时候执行这个command就可以了。跟原来的应用分开了,调试起定时任务也不用影响到原来的应用,还是比较方便的。部署的时候原样拷贝一份,然后执行这个command就好了,部署起来也比较方便。
分享到:
相关推荐
python定时任务 每天运行一次 在 Python 中可以使用 schedule 模块来实现定时任务。以下是一个每天运行一次的例子: import schedule import time def job(): print("I'm running at 5:00am every day.") # 设定...
利用jdk中的timer和timertask来实现,每天定时执行的任务。
.net core 定时执行某一时间的任务,可设置循环的小时,分钟,秒, 资源里只执行了一次定时任务,可循环多次,运行时自动进入方法
使用Python的timer来完成每天执行一次的定时任务,环境是windows,python3.4
一,任务列表(多个定时任务可在task:scheduled-tasks中写多个task:scheduled-task) */5 * * * * ?"/> </task:scheduled-tasks> 二,相对的类和方法 <bean id="myTaskXml" class="test.task"></bean>
1)Service默认运行在主线程中,IntentService运行在一个新的线程中 2)Service需要主动调用stopSelf()或stopService()服务才可以停止,IntentService运行完后自动停止 使用IntentService需要注意2点: 1)构造函数中...
1.很简单的源代码 通俗易懂 2.通过Spring是JAR-quartz写的一个定时任务 1)普通的定时任务,定时...执行多少次 好久执行一次 到2001-10-10 10:10:10 结束任务 具体详细下了就知道。。。 内附 quartz-all-1.6.0.jar
用C# Timer 实现的简易定时任务windows服务,加入执行时间自行修补功能,可以基本实现每隔1分钟调取一次接口的场景,代码从项目中剥离,无法直接运行,可以下载后查阅源代码,核心代码在 PushService.cs 文件中
asp.net定时任务,只要运行页面或者发布到iis(启动iis)之后每隔10秒执行一次
spring定时任务 spring多线程的一个简单示例。
只需要在web.xml文件中添加监听器listener,然后加入附件中的文件,并将lstener指向所添加的文件TimerTaskListener,定时任务的研发便可轻松搞定!
Windows定时任务.bat文件
Timer schedule JAVA J2EE WEB 指定每一天某时某分执行某项任务的功能。 读取目录下配置文件的内容。 开发环境jdk1.5.0_22、MyEclipse6.5中文版。...定时任务管理器,定时执行,定时任务,run 绝对能用
但是停止时间为 定时cron.php 中当前运行下一次 的时间触发停止。。 使用情况:有可能出现进程过多,apache 停止。 IIS 运行暂无发现问题。 linux 系统建议使用 crontab 定时任务,window建议使用计划任务。
DynamicSchedule ...手动执行一次定时任务:/scheduled/manual-task 前端传递任务ID即可手动执行一次任务。 开始执行定时任务:/scheduled/execute-task 前端传递任务ID即可按照cron表达式开始任务。
Quartz定时任务框架,本次小白使用它实现一个简单的定时任务。每隔3秒打印一次Hello。这个是例子的jar包,实现过程在博客首页可看到。
一个tomcat下部署了两个应用,一个是普通web应用syncc,另一个应用syncc_wx属于微信公众号后台程序涉及消息定时推送,tomcat未分离...”spring定时任务执行两次的异常排查处理.docx"针对上述描述问题进行分析和解决。
spring3 配置quartz定时任务的使用。一个小例子。可直接运行Test.java。就可以启动定时任务。每10秒钟执行一次,可以根据自己配置。
页面打开自动加载事件、页面定时任务,页面关闭则定时任务无效,第一次打开自动执行一次,间隔指定时间后再次执行
python定时任务 每天运行一次