Stack Exchange
Quartz firing twice bean caching issue?
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 

you didn't provide the logging where the job is run twice, only the startup logging of Quartz which looks fine.

well the logging shows only once everytime, but it sends 2 emails when it runs twice, running it externally sends only one email

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.

can I set the bean up not to be started twice in case redeployment is the issue ?

I've updated the question with the thread dump when it sends the duplicated message

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.

No, I have other xmls in there, initially if everything is clean exploded war file and tomcat work directory it has only one thread in the thread dump and works just fine.
