4
votes

spring-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");

When I start 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]

Jobs fires twice after some time after I start tomcat, if i remove all the cache from the work directory and the exploded war file and re deploy it fires the job only once. any ideas ? maybe caching the bean ?

@jhouse the re deploy seems to be the problems I've pasted the thread dump after it's being redeployed, what are my options ?

@jhouse

"Reports_QuartzSchedulerThread" prio=10 tid=0x00002aab0c10b000 nid=0x1dc0 in Object.wait() [0x0000000044501000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00002aaac9e6d298> (a java.lang.Object) at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:433) - locked <0x00002aaac9e6d298> (a java.lang.Object)

"Reports_Worker-1" prio=10 tid=0x00002aab0c10a800 nid=0x1dbf in Object.wait() [0x0000000044400000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00002aaac9e4c980> (a org.quartz.simpl.SimpleThreadPool$WorkerThread) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:519) - locked <0x00002aaac9e4c980> (a org.quartz.simpl.SimpleThreadPool$WorkerThread)

"Reports_QuartzSchedulerThread" prio=10 tid=0x00002aab0841b800 nid=0x1da3 in Object.wait() [0x0000000041715000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00002aaac4fc71d0> (a java.lang.Object) at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:433) - locked <0x00002aaac4fc71d0> (a java.lang.Object)

"Reports_Worker-1" prio=10 tid=0x00002aab091a3000 nid=0x1da2 in Object.wait() [0x0000000041614000] java.lang.Thread.State: TIMED_WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00002aaac4e21b10> (a org.quartz.simpl.SimpleThreadPool$WorkerThread) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:519) - locked <0x00002aaac4e21b10> (a org.quartz.simpl.SimpleThreadPool$WorkerThread)

If I stop the server, then check the thread dump it's empty, then start (without cleaning) the server,the threadump has duplicate threads running

1
you didn't provide the logging where the job is run twice, only the startup logging of Quartz which looks fine.Salandur
well the logging shows only once everytime, but it sends 2 emails when it runs twice, running it externally sends only one emailRodriguez
is this in an environment where you are doing hot re-deploys? It could be that the previous instance isn't fully terminating. I'd suggest producing a thread dump of the process right after you get the duplicate email, so that you can see how many quartz instances there are.jhouse
can I set the bean up not to be started twice in case redeployment is the issue ?Rodriguez
I've updated the question with the thread dump when it sends the duplicated messageRodriguez

1 Answers

2
votes

Just curious, do you have spring-report.xml configured in your web.xml too? Like this?

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

The reason I asked is because you post this statement above:-

private static BeanFactory factory = new ClassPathXmlApplicationContext("spring-report.xml");

If you have spring-report.xml in both web.xml and Java code, then yes, it will potentially fire the job twice.