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',因为已存在具有此标识的作业。
答案 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。
您尝试使用已经存在的名称创建作业并触发 数据库。并且调度程序将禁止你这样做。
解决方案: