100分求助,quartz触发时间的奇怪问题

艾德 2008-01-07 11:04:04
我使用quartz注册job的时候,如果一次注册很多个job,总是前一到两个job可以准时触发,后面的job要等大约20多分钟才触发。

不知大家有谁也遇到过这样的问题吗?

注:我用的JDBC-JobStoreCMT, 好像是scheduler lock在什么地方了。从dump出来的thread stack来看,好像是lock在SimpleSemaphore.obtainLock(...) 里面了.
...全文
613 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunyujia 2008-01-13
  • 打赏
  • 举报
回复
恭喜,恭喜
艾德 2008-01-12
  • 打赏
  • 举报
回复
问题找到了,是因为用的CMT,导致transaction 被lock住了。
艾德 2008-01-10
  • 打赏
  • 举报
回复
我早跟过了,没发现问题在哪。只知道把线程挂起后停在SimpleSemaphore.obtainLock()方法里面了。releaseLock()里面倒是有一个notify线程的方法,但是不知道谁会叫到这个notify.

sunyujia 2008-01-09
  • 打赏
  • 举报
回复
会不会这个有问题com.vitria.bpmn.timer.TimerJobStore
sunyujia 2008-01-09
  • 打赏
  • 举报
回复
// make sure only one scheduler instance is returned for all threads.
synchronized(tsf)
这个地方,必须这样吗,可以通过其他方式来实现啊,我感觉这里首先有潜在的易患,我认为不是非常必须的时候最好还是不用这个synchronized

jta我没研究过,要不你挂上quartz的源码单步跟踪,一般实在搞不定的问题我都这么干,运气好的时候可以通过源码发现问题,希望能帮到你吧,这帖子太冷了,
艾德 2008-01-09
  • 打赏
  • 举报
回复
非常感谢!代码和配置如下。代码太多,贴不全,如果有其它要知道的可以联系我。
qq:6711632, msn:freeliuade@yahoo.com.cn
问题应该和我用的是JobStoreCMT有关

配置如下:
org.quartz.scheduler.instanceName=BPMNTimerScheduler
org.quartz.scheduler.instanceId=BPMNTimerScheduler_NonClustered
org.quartz.jobStore.tablePrefix=VT_TM_
org.quartz.jobStore.dataSource=bpmn
org.quartz.jobStore.class=com.vitria.bpmn.timer.TimerJobStore

org.quartz.dataSource.bpmn.connectionProvider.class=com.vitria.bpmn.timer.TimerConnectionProvider

org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount=25
org.quartz.threadPool.threadPriority=5

org.quartz.scheduler.classLoadHelper.class=com.vitria.bpmn.timer.ThreadContextClassLoadHelper

org.quartz.plugin.shutdownHook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown = true

org.quartz.scheduler.idleWaitTime=5000


一部分的代码如下:
final SimpleTrigger trigger = new SimpleTrigger(name, groupName, createFireDate(compInstance, event.getTimer()));

// make sure only one scheduler instance is returned for all threads.
synchronized(tsf) {
final Scheduler sched = tsf.getScheduler();
if (isGlobalTx()){
Runnable r = new Runnable() {
public void run() {
try {
sched.scheduleJob(jobDetail, trigger);
sched.start();
} catch (SchedulerException e) {
BPMNLogger.error(MessageCode.Timer_ScheduleJob_Fail, e, jobDetail.toString(), trigger.toString());
}
}
};
(new Thread(r)).start();
} else {
sched.scheduleJob(jobDetail, trigger);
sched.start();
}
}
sunyujia 2008-01-08
  • 打赏
  • 举报
回复
把配置和代码全贴出来明天下班回来帮你看看,我以前用过一段时间这玩艺,但不保100%解决啊
艾德 2008-01-07
  • 打赏
  • 举报
回复
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5

我的一些设置如上,这应该和线程排队没关系。比如说我同时scheduder的30个job,想让这些job都在2分钟后触发,结果是有那么一两个可以在2分钟后准时触发,而其它的要等到大约20分钟后才触发。
sunyujia 2008-01-07
  • 打赏
  • 举报
回复
这个默认线程数可以改的,另外你先查清你有多少个job触发,最主要看看有没有逻辑问题
sunyujia 2008-01-07
  • 打赏
  • 举报
回复
默认10个线程 超过10个调度排队

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧