2011-11-23 127 views
1

目前,我使用弹簧石英在不同时间点燃三种不同的工作。我为每个触发器使用三个不同的调度器。 这种情况在前几个小时工作良好,但随后所有石英线都被堵塞。以下是我的bean定义:弹簧石英阻塞线

> <!-- TRAFFIC POLLER DECLERATION --> 
    >  <!-- job --> 
    >  <bean id="TriggerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
    >   <property name="targetObject" ref="TriggerClass" /> 
    >   <property name="targetMethod" value="trigger" /> 
    >  </bean> 
    >  
    >  <!-- trigger --> 
    >  <bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    >   <property name="jobDetail" ref="TriggerJob" /> 
    >   <property name="cronExpression" value="${trigger.cron}" /> 
    >  </bean> 
    >  
    >  <!-- SCHEDULER --> 
    >  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    >   <property name="waitForJobsToCompleteOnShutdown" value="true" /> 
    >   <property name="triggers"> 
    >    <list> 
    >     <ref bean="trigger1" /> 
    >    </list> 
    >   </property> 
    >  </bean> 

以下是我对阻塞的线程的JConsole的堆栈跟踪:

Name: org.springframework.scheduling.quartz.SchedulerFactoryBean#1_Worker-5 
State: BLOCKED on [email protected] owned by: org.springframework.scheduling.quartz.SchedulerFactoryBean#1_Worker-6 
Total blocked: 20 Total waited: 101,919 

Stack trace: 
com.ecs.Trigger.TriggerClass trigger(TriggerClass.java:89) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
java.lang.reflect.Method.invoke(Method.java:597) 
org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273) 
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:264) 
org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:86) 
org.quartz.core.JobRunShell.run(JobRunShell.java:216) 
org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549) 

任何人都得到了,为什么我有这个什么想法?提前致谢。

回答

0

似乎在工作(org.springframework.scheduling.quartz.SchedulerFactoryBean#1_Worker-5)正与另一个org.springframework.scheduling.quartz.SchedulerFactoryBean#1_Worker-6同步,并且正在等待这一个释放资源。 你的工作中是否有一些wait()/ notify()指令? 还是你在一些变量上同步工作并且你没有在你的TriggerJob中设置? 您没有设置concurrent = false,因此可能是同一个作业上的两个实例正在运行,而另一个正在等待在另一个线程中执行的同一作业。

+0

被调用的方法是同步的,没有共享变量或通知/等待。这些方法是完全独立的。 – Tzer001

+0

这些方法是从除工作之外的其他线程调用的? – Giovanni