java – Quartz触发两次bean缓存问题?

弹簧report.xml将

<bean id="scheduleReportEmailJob"
      class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass"
              value="schedule.ReportQuartzJobBean"/>
    <property name="jobDataAsMap">
        <map>
            <entry key="reportService" value-ref="reportService"/>
        </map>
    </property>
</bean>

<bean id="cronEmailTrigger"
      class="org.springframework.scheduling.quartz.crontriggerBean">
    <property name="jobDetail" ref="scheduleReportEmailJob"/>
    <property name="cronExpression" value="0 0,15,30,45 * ? * MON-FRI"/>
</bean>

<bean id="scheduler" class="org.springframework.scheduling.quartz.Schedulerfactorybean">
    <property name="triggers">
        <list>
            <ref bean="cronEmailTrigger"/>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">Reports</prop>
            <prop key="org.quartz.scheduler.instanceId">FirstInstance</prop>
            <prop key="org.quartz.scheduler.rmi.export">false</prop>
            <prop key="org.quartz.scheduler.rmi.proxy">false</prop>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">1</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
            <prop key="org.quartz.scheduler.jobFactory.class">org.quartz.simpl.SimpleJobFactory</prop>
        </props>
    </property>
</bean>
private static beanfactory factory = new ClasspathXmlApplicationContext("spring-report.xml");

当我启动tomcat时

2011-02-07 06:46:57,005(ISO8601) [main] DEBUG   org.springframework.beans.factory.support.DefaultListablebeanfactory  - Invoking afterPropertiesSet() on bean with name 'scheduler'
2011-02-07 06:46:57,083(ISO8601) [main] INFO    org.quartz.core.SchedulerSignalerImpl  - Initialized Scheduler Signaller of type: class org.quartz.core.Schedu
lerSignalerImpl
2011-02-07 06:46:57,083(ISO8601) [main] INFO    org.quartz.core.QuartzScheduler  - Quartz Scheduler v.1.6.3 created.
2011-02-07 06:46:57,084(ISO8601) [main] INFO    org.quartz.core.QuartzScheduler  - JobFactory set to: org.quartz.simpl.SimpleJobFactory@3dd510be
2011-02-07 06:46:57,085(ISO8601) [main] INFO    org.quartz.simpl.RAMJobStore  - RAMJobStore initialized.
2011-02-07 06:46:57,085(ISO8601) [main] INFO    org.quartz.impl.StdSchedulerFactory  - Quartz scheduler 'Reports' initialized from an externally provided prop
erties instance.
2011-02-07 06:46:57,085(ISO8601) [main] INFO    org.quartz.impl.StdSchedulerFactory  - Quartz scheduler version: 1.6.3
2011-02-07 06:46:57,087(ISO8601) [main] INFO    org.quartz.core.QuartzScheduler  - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactor
y@206fa7ec
2011-02-07 06:46:57,094(ISO8601) [main] INFO    org.springframework.scheduling.quartz.Schedulerfactorybean  - Starting Quartz Scheduler Now
2011-02-07 06:46:57,094(ISO8601) [main] INFO    org.quartz.core.QuartzScheduler  - Scheduler Reports_$_FirstInstance started.
2011-02-07 06:46:57,139(ISO8601) [main] DEBUG   org.springframework.beans.factory.support.DefaultListablebeanfactory  - Finished creating instance of bean 'sc
heduler'
2011-02-07 06:46:57,140(ISO8601) [main] DEBUG   org.springframework.context.support.ClasspathXmlApplicationContext  - Publishing event in context [org.springf
ramework.context.support.ClasspathXmlApplicationContext@4275b35]: org.springframework.context.event.ContextRefreshedEvent[source=org.springframework.context.s
upport.ClasspathXmlApplicationContext@4275b35: display name [org.springframework.context.support.ClasspathXmlApplicationContext@4275b35]; startup date [Mon Fe
b 07 06:46:55 EST 2011]; root of context hierarchy]

在我启动tomcat之后的一段时间后,Jobs会激活两次,如果我从工作目录和爆炸的war文件删除所有缓存并重新部署它只会激活一次该作业.有任何想法吗 ?也许缓存豆?

@jhouse重新部署似乎是我在重新部署之后粘贴了线程转储的问题,我的选择是什么?

@jhouse

Object.wait()中的“Reports_QuartzSchedulerThread”prio = 10 tid = 0x00002aab0c10b000 nid = 0x1dc0 [0x0000000044501000]
   java.lang.Thread.State:TIMED_WAITING(在对象监视器上)
    at java.lang.Object.wait(Native Method)
     – 等待< 0x00002aaac9e6d298> (一个java.lang.Object)
    在org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:433)
     – 已锁定< 0x00002aaac9e6d298> (一个java.lang.Object)

Object.wait()中的“Reports_Worker-1”prio = 10 tid = 0x00002aab0c10a800 nid = 0x1dbf [0x0000000044400000]
   java.lang.Thread.State:TIMED_WAITING(在对象监视器上)
    at java.lang.Object.wait(Native Method)
     – 等待< 0x00002aaac9e4c980> (a org.quartz.simpl.SimpleThreadPool $WorkerThread)
    在org.quartz.simpl.SimpleThreadPool $WorkerThread.run(SimpleThreadPool.java:519)
     – 已锁定< 0x00002aaac9e4c980> (a org.quartz.simpl.SimpleThreadPool $WorkerThread)

Object.wait()中的“Reports_QuartzSchedulerThread”prio = 10 tid = 0x00002aab0841b800 nid = 0x1da3 [0x0000000041715000]
   java.lang.Thread.State:TIMED_WAITING(在对象监视器上)
    at java.lang.Object.wait(Native Method)
     – 等待< 0x00002aaac4fc71d0> (一个java.lang.Object)
    在org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:433)
     – 已锁定< 0x00002aaac4fc71d0> (一个java.lang.Object)

Object.wait()中的“Reports_Worker-1”prio = 10 tid = 0x00002aab091a3000 nid = 0x1da2 [0x0000000041614000]
   java.lang.Thread.State:TIMED_WAITING(在对象监视器上)
    at java.lang.Object.wait(Native Method)
     – 等待< 0x00002aaac4e21b10> (a org.quartz.simpl.SimpleThreadPool $WorkerThread)
    在org.quartz.simpl.SimpleThreadPool $WorkerThread.run(SimpleThreadPool.java:519)
     – 已锁定< 0x00002aaac4e21b10> (a org.quartz.simpl.SimpleThreadPool $WorkerThread)

如果我停止服务器,然后检查线程转储它是空的,然后启动(不清理)服务器,该线程泵有重复的线程运行

解决方法

好奇的是,您是否也在web.xml中配置了spring-report.xml?像这样?

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:spring-report.xml
    </param-value>
</context-param>

我问的原因是因为你发表上述声明: –

private static beanfactory factory = new ClasspathXmlApplicationContext("spring-report.xml");

如果你在web.xml和Java代码中都有spring-report.xml,那么是的,它可能会激活两次作业.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...