2013-07-18 57 views
1
JobDetail job = new JobDetail(); 
job.setName("dummyJ"); 
job.setJobClass(NotificationCreater.class); 

SimpleTrigger trigger = new SimpleTrigger(); 
trigger.setName("mn"); 
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000)); 
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
trigger.setRepeatInterval(30000); 

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.start(); 
scheduler.scheduleJob(job, trigger); 

我用上面的代码来安排我在NotificationCreater.class活动,但我得到错误信息作业调度不调用

错误:-Unable到作业存储与名称:“dummyJ”和组:“DEFAULT ',因为一个已经存在这个识别。

+0

您的错误字符串为您提供确切的原因 - 组中有另一个具有相同名称的计划作业。 – Richie

+0

@里奇我只有一个预定的工作 – nakul

+0

然后尝试通过更改作业名称。 –

回答

0

如果使用servlet,并且想在应用程序启动时运行你的工作,我想这就是你应该如何着手实现的。

作业类

public class DummyJob{ 

public DummyJob() throws ParseException, SchedulerException { 

JobDetail job = new JobDetail(); 
job.setName("dummyJ"); 
job.setJobClass(NotificationCreater.class); 

SimpleTrigger trigger = new SimpleTrigger(); 
trigger.setName("mn"); 
trigger.setStartTime(new Date(System.currentTimeMillis() + 1000)); 
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
trigger.setRepeatInterval(30000); 

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.start(); 
scheduler.scheduleJob(job, trigger); 
} 
} 

该servlet

public class JobInitializerServlet extends HttpServlet { 

/** 
* 
*/ 
private static final long serialVersionUID = 5102955939315248840L; 

/** 
* Application logger to log info, debug, error messages. 
*/ 
private static final Logger APP_LOGGER = Logger.getLogger("appLogger"); 

/** 
* @see Servlet#init(ServletConfig) Initializes DummyJob 
*/ 
public void init(ServletConfig config) throws ServletException { 

    try { 
     DummyJob scheduler = new DummyJob(); 
    } catch (java.text.ParseException e) { 
     APP_LOGGER.error(e.getLocalizedMessage(), e); 
    } catch (SchedulerException e) { 
     APP_LOGGER.error(e.getLocalizedMessage(), e); 
    } 

} 

}

和servlet映射

<servlet> 
    <description> 
    </description> 
    <display-name>JobInitializerServlet</display-name> 
    <servlet-name>JobInitializerServlet</servlet-name> 
    <servlet-class>com.job.servlet.JobInitializerServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

这将会尽快部署或开始启动工作你的应用离子。希望这可以帮助。

1

您可以使用Servlet中的init方法来初始化和启动计划。在移除应用程序后,您还应该使用Servlet中的destroy方法从池中移除计划作业,以避免在重新部署期间发生相同的错误。你可以像scheduler.unscheduleJob()scheduler.shutdown()这样删除作业并停止调度程序销毁方法。

0

trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);

该触发器正在设置为不确定重复计数。 意思是,触发器将永远存在数据库中。 因此,与触发器关联的作业将永远存在于数据库 中。

所以,你第一次执行你的程序,很高兴看到它运行。 你停止执行并休息一下。 然后你回来,想要显示给你的经理和@#$%@#BOOM#$%#$%#$ 5。

您试图创建作业并使用已在 数据库中的名称进行触发。而调度程序将会导致你无法做到这一点。

解决方案:

  1. 消灭从石英数据库表中的所有数据,你开始 程序的下一个执行之前。或
  2. 请勿使用无限期的触发器。使用一个简单的。一次执行或两到三次而不是〜。 OR
  3. 使用RAMJobStore。