Пружинные кварцевые блокирующие нити - PullRequest
1 голос
/ 23 ноября 2011

В настоящее время я использую пружинный кварц для запуска трех разных работ в разное время.Я использую три разных планировщика для каждого триггера.Этот сценарий работает отлично в течение первых нескольких часов, но затем все кварцевые нити блокируются.Ниже приведено определение моего компонента:

> <!-- 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 java.lang.Object@131b502 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)

Кто-нибудь знает, почему у меня это происходит?Заранее спасибо.

1 Ответ

0 голосов
/ 23 ноября 2011

похоже, что задание (org.springframework.scheduling.quartz.SchedulerFactoryBean # 1_Worker-5) синхронизируется с другим org.springframework.scheduling.quartz.SchedulerFactoryBean # 1_Worker-6 и ожидает его для освобождения ресурс. Есть ли у вас инструкции wait () / notify () в вашей работе? или вы синхронизируете одно и то же задание с какой-то переменной, и вы не задали ее в TriggerJob? Вы не установили concurrent = false, поэтому может быть, что два экземпляра в одном задании выполняются, и один ожидает одного и того же задания, выполненного в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...