【问题标题】:Openshift cron execute servlet - Scheduled JobOpenshift cron 执行 servlet - 计划作业
【发布时间】:2016-06-12 20:20:00
【问题描述】:

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

附言。我正在使用 Tomcat 6 (Jboss EWS 1.0)、mySQL 5.5 服务器

【问题讨论】:

    标签: java servlets cron scheduled-tasks openshift


    【解决方案1】:

    据我了解,您需要您的应用程序每 XX 分钟运行一次。 为了计算开始时间,我做了一个辅助函数“getStartTime”,我可以使用人类可读的时间,比如“23:30”(注意,我来自德国,所以它不适用于上午/下午,只需根据您的需要进行更改)。

    辅助方法:

    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();
    

    并将您的需求设置为 scheduleAtFiexed Rate:

        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 小时运行一次......我花了几个小时,但你需要在最后插入毫秒,所以 5 分钟(你必须 5 * 60 *1000 毫秒。

    问候

    关于 athors cmets 的编辑: 要在应用程序启动时启动,您有几种方法。一种方法是像这样在启动时启动一个 servlet。插入到web.xml中

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

    这将在应用程序启动时调用 ServletStartups 类(load-on-startup 中的数字是优先级,因为您可以有多个条目并且可以决定先启动哪个条目(1、2、3 ...)

    现在在您的 servlet 中定义一个 init() 方法,该方法会自动调用,如下所示:

    public class ServletStartups extends HttpServlet{
    
    
    public void init() throws ServletException{
        // HEre you can put your methods as described above      //(scheduledExecutorService( ...   
    
    }
    

    }

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

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

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

    【讨论】:

    • 非常感谢,但我的问题是我不知道在哪里以及如何调用此代码,我已经尝试使用 TimerTask 但我如何让我的服务器自动启动它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多