作业调度程序不会调用

时间:2013-07-18 10:57:18

标签: java spring quartz-scheduler

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中安排我的活动,但是我收到错误消息

错误: - 无法存储具有名称的作业:'dummyJ'和group:'DEFAULT',因为已存在具有此标识的作业。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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 Mapping

<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>

这将在您部署或启动应用程序后立即启动作业。希望这会有所帮助。

答案 2 :(得分:0)

  

trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);

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

所以,你第一次执行你的程序,并很高兴看到它运行。 你停止了执行,喝了一杯咖啡。 然后你回来想要向你的经理展示这个,@#$%@#BOOM#$%#$%#$ 5。

您尝试使用已经存在的名称创建作业并触发 数据库。并且调度程序将禁止你这样做。

解决方案:

  1. 在开始下一次执行之前,擦除石英数据库表中的所有数据 程序。 OR
  2. 不要使用无限期触发器。使用一个简单的。一次性执行或两次或三次但不是〜。 OR
  3. 使用RAMJobStore。
相关问题