Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 Openshift cron执行servlet-计划作业_Java_Servlets_Cron_Scheduled Tasks_Openshift - Fatal编程技术网

Java Openshift cron执行servlet-计划作业

Java Openshift cron执行servlet-计划作业,java,servlets,cron,scheduled-tasks,openshift,Java,Servlets,Cron,Scheduled Tasks,Openshift,我需要在我的服务器上每5分钟执行一次任务,以更新数据库上的一些数据,我发现在openshift上,我有一个cron,它每次都执行一些脚本。是否可以制作一个脚本,对servlet或java代码进行简单调用以运行此作业? 我对服务器端编程很陌生,所以请说得简单些 另外,我正在使用Tomcat 6(Jboss EWS 1.0)、mySQL 5.5服务器据我所知,你需要你的应用程序每XX分钟运行一次sth。 为了计算开始时间,我制作了一个助手函数“getStartTime”,我可以使用人类可读的时间,如

我需要在我的服务器上每5分钟执行一次任务,以更新数据库上的一些数据,我发现在openshift上,我有一个cron,它每次都执行一些脚本。是否可以制作一个脚本,对servlet或java代码进行简单调用以运行此作业? 我对服务器端编程很陌生,所以请说得简单些


另外,我正在使用Tomcat 6(Jboss EWS 1.0)、mySQL 5.5服务器

据我所知,你需要你的应用程序每XX分钟运行一次sth。 为了计算开始时间,我制作了一个助手函数“getStartTime”,我可以使用人类可读的时间,如“23:30”(注意,我来自德国,所以它不适用于am/PM,只需根据您的需要更改)

助手方法:

private static long getStartTime(String startTime) {
    int hour = Integer.parseInt(startTime.split(":")[0]);
    int minutes = Integer.parseInt(startTime.split(":")[1]); 
    Calendar cal = Calendar.getInstance();
    Date dateNow = cal.getTime();
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, minutes);
    cal.set(Calendar.SECOND, 0);

    if(cal.getTime().before(dateNow)) {
        cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DAY_OF_MONTH) + 1);
        return cal.getTime().getTime();
    } else {
        return cal.getTime().getTime();
    }
}
现在您可以从Java使用ScheduledExecutorService。例如:

    ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);

    long startClearRequests = getStartTime(DEFAULT_JOB_START_TIME) - System.currentTimeMillis();
并将您的需求设置为预定的固定费率:

    scheduledExecutorService.scheduleAtFixedRate(clearRequests, startClearRequests, Math.round(DEFAULT_JOB_PERIOD_HOURS * 60 * 60 * 1000), TimeUnit.MILLISECONDS);
例如,我使用:

    private static final int NUM_OF_THREADS = 2;
    private static final String DEFAULT_JOB_START_TIME = "23:30";
    private static final double DEFAULT_JOB_PERIOD_HOURS = 24;
如您所见,您可以更改线程数(取决于应用程序正在执行的操作)、启动时间(这只是应用程序启动所需的时间(第一次启动作业的时间)。 还有周期(每XX小时,作业将运行一次……我花了几个小时,但最后需要ti插入毫秒,因此需要5分钟(需要5*60*1000毫秒)

问候

编辑有关运动员的评论: 要在应用程序启动时启动,有几种方法。一种方法是在启动时像这样启动servlet

<servlet>
    <servlet-name>ServletStartups</servlet-name>
    <servlet-class>model.initialization.ServletStartups</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
}

重要提示: 上面我有一个方法“clearRequests”,很抱歉这是我的方法,我没有重命名它来添加到这里。这个方法将在我的应用程序中每24小时调用一次

从ScheduledExecutorService调用的方法必须是可调用的,如下所示:

private Runnable clearRequests = new Runnable() { 

    public void run() {
        try {
             // Here do your task
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
};

非常感谢,但我的问题是,我不知道在哪里以及如何调用此代码,我已尝试使用TimerTask,但如何告诉我的服务器自动启动此代码?
private Runnable clearRequests = new Runnable() { 

    public void run() {
        try {
             // Here do your task
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
};