I have scheduled a JOB using Quartz scheduler in my Struts2 web application. Everything is working fine as I expected but the trigger is firing two times : on the specified time. After some research I found That ApplicationContext
is loading twice. I found these links are useful. Job Triggered twice Application Context loading Twice But that was not so descriptive or I am unable to understand that. Please help to deal with this.
Will provide the code on Request.
My web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>MyAPP</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
<context-param>
<param-name>tilesDefinitions</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>
<welcome-file-list>
<welcome-file>Login.jsp</welcome-file>
</welcome-file-list>
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<error-page>
<error-code>404</error-code>
<location>/jsp/error/pagenotfound.jsp</location>
</error-page>
<listener>
<listener-class>
com.MYAPP.listners.QuartzListners
</listener-class>
</listener>
</web-app>
My QuartzListner.java
public class QuartzListner implements ServletContextListener {
private static final Logger log=Logger.getLogger(QuartzListner.class);
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
log.info("----Quartz Scheduler destroyer Intialized----");
try{
ServletContext context =arg0.getServletContext();
Scheduler scheduler =(Scheduler)context.getAttribute("DocRevScheduler");
scheduler.shutdown(true);
log.info("----Scheduler Shutting downnn ---- "+scheduler.isShutdown());
}catch(Exception se)
{
log.warn("--Exception while Shutdowning the Scheduler..."+se);
se.printStackTrace();
}
}
/* (non-Javadoc)
* @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
*/
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
log.info("--Qurz Scheduler intialized----");
JobDetail job = JobBuilder.newJob(MailSendingJOB.class)
.withIdentity("mailJob", "group1").build();
JobDetail jobDetail =JobBuilder.newJob(DBOperationsJOB.class)
.withIdentity("DBJOB", "group2").build();
try {
ResourceBundle resource = ResourceBundle.getBundle("resources.application");
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("anyTriggerName", "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(resource.getString("triggerTime")))
.build();
Trigger trigger1 = TriggerBuilder
.newTrigger()
.withIdentity("sampleTrigger", "group2")
.withSchedule(
CronScheduleBuilder.cronSchedule(resource.getString("triggetTime")))
.build();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
scheduler.scheduleJob(jobDetail, trigger1);
ServletContext context = arg0.getServletContext();
context.setAttribute("MyJOBScheduler", scheduler);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
In My Propertyfile triggerTime=0 19 11 ? * MON *