Java 计时器和计时器任务不更新
我有一个可以设置处理时间的应用程序。问题是当我更新时间时,处理会增加。例如: 最初,计时器在上午7:00启动 比方说,我将计时器更新为08:00AM,然后第二天开始,程序将在07:00AM和08:00AM再次运行。(07:00AM仍在计划程序中,如何删除07:00AM?) 如何使调度程序只运行第二天上午8:00Java 计时器和计时器任务不更新,java,timer,Java,Timer,我有一个可以设置处理时间的应用程序。问题是当我更新时间时,处理会增加。例如: 最初,计时器在上午7:00启动 比方说,我将计时器更新为08:00AM,然后第二天开始,程序将在07:00AM和08:00AM再次运行。(07:00AM仍在计划程序中,如何删除07:00AM?) 如何使调度程序只运行第二天上午8:00 public void setKonfigurasi(String name, String value) { log.info(SERVLET_NAME + "Entering
public void setKonfigurasi(String name, String value) {
log.info(SERVLET_NAME + "Entering setKonfigurasi");
amBean.setParam(name,value); //update the time into database
//name = 'processFileConf|kodPT|userA|20140312 08:30 AM'
// reschedule timer after configured by user
try {
String kodPT = name.substring(name.indexOf("|") + 1, name.indexOf("|",name.indexOf("|") + 1));
String configStr = value.substring(2); //get the new time
String currentStr = CommonUtil.getCurrentDate();
DateFormat dateformat = new SimpleDateFormat("dd/MM/yyyy KK:mm:ss a");
Date currentDate=new Date() ;
Date configDate = dateformat.parse(currentStr+" "+configStr);
long config = configDate.getTime();
long current = currentDate.getTime();
// today
long delay = config-current;
if (delay < 0)
// tomorrow
delay += (1000*60*60*24);
// create the timer and timer task objects
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("showtime for "+kodPT);
processFile("auto"+kodPT);
}
}, delay, 1000*60*60*24);
ServletContextEvent servletContextEvent = EtServletContextListener.getContext();
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.removeAttribute ("timer");
servletContext.setAttribute ("timer", timer);
} catch (Exception e) {
log.error("Exception on date format : "+e.getMessage());
}
log.info(SERVLET_NAME + "Exiting setKonfigurasi");
}
public void setKonfigurasi(字符串名称、字符串值){
log.info(SERVLET_NAME+“输入setKonfigurasi”);
amBean.setParam(名称、值);//将时间更新到数据库中
//name='processFileConf | kodPT | userA | 20140312 08:30 AM'
//用户配置后重新安排计时器
试一试{
字符串kodPT=name.substring(name.indexOf(“|”)+1,name.indexOf(“|”,name.indexOf(“|”)+1);
字符串configStr=value.substring(2);//获取新时间
字符串currentStr=CommonUtil.getCurrentDate();
DateFormat DateFormat=新的简化格式(“dd/MM/yyyy KK:MM:ss a”);
日期currentDate=新日期();
Date configDate=dateformat.parse(currentStr+“”+configStr);
long config=configDate.getTime();
long current=currentDate.getTime();
//今天
长延时=配置电流;
如果(延迟<0)
//明天
延时+=(1000*60*60*24);
//创建计时器和计时器任务对象
定时器=新定时器();
timer.scheduleAtFixedRate(新TimerTask(){
public void run(){
System.out.println(“显示时间为”+kodPT);
进程文件(“自动”+kodPT);
}
},延迟,1000*60*60*24);
ServletContextEvent ServletContextEvent=EtServletContextListener.getContext();
ServletContext=servletContextEvent.getServletContext();
servletContext.removeAttribute(“计时器”);
servletContext.setAttribute(“计时器”,计时器);
}捕获(例外e){
log.error(“日期格式异常:+e.getMessage());
}
log.info(SERVLET_NAME+“正在退出setKonfigurasi”);
}
您需要在上一个计时器上调用取消()
,并创建一个新的计时器。javadoc说:
终止此计时器,放弃所有当前计划的任务。做
不干扰当前正在执行的任务(如果存在)。每年一次
计时器已终止,其执行线程正常终止,
并且不能在其上安排更多任务
我已经知道如何做我想做的事了。我们不应该使用java.util.Timer来创建计时器,而应该使用javax.ejb.Timer,因为ejb中的计时器具有标识每个计时器的信息。 我是否在timer.scheduleAtFixedRate(new TimerTask())之前调用cancel()?如果我设置了超过1的时间表,那么另一个呢?