Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计时器和计时器任务不更新_Java_Timer - Fatal编程技术网

Java 计时器和计时器任务不更新

Java 计时器和计时器任务不更新,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

我有一个可以设置处理时间的应用程序。问题是当我更新时间时,处理会增加。例如: 最初,计时器在上午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 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的时间表,那么另一个呢?