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

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

4

3 回答 3

1

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

于 2013-07-19T05:55:57.433 回答
0

trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);

正在为无限重复计数设置触发器。这意味着,触发器将永远存在于数据库中。结果,与触发器关联的作业也将永远存在于数据库中。

因此,您第一次执行了您的程序,并且很高兴看到它运行。你停止了处决,喝了杯咖啡。然后你回来想把这个展示给你的经理和@#$%@# BOOM #$%#$%#$5。

您尝试使用数据库中已有的名称创建作业和触发器。调度程序会阻止你这样做。

解决方案:

  1. 在开始下一次执行程序之前,清除石英数据库表中的所有数据。或者
  2. 不要使用无限期的触发器。使用一个简单的。一次执行或两次或三次但不是〜。或者
  3. 使用 RAMJobStore。
于 2013-07-19T08:12:04.540 回答
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);
 }
}

小服务程序

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>

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

于 2013-07-18T11:30:21.813 回答