2016-02-29 159 views
1

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

Ps。我正在使用Tomcat 6(Jboss EWS 1.0),mySQL 5.5服务器

回答

1

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

helper方法:

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

现在你可以使用ScheduledExecutorService的从Java。例如:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); 

    long startClearRequests = getStartTime(DEFAULT_JOB_START_TIME) - System.currentTimeMillis(); 

,并设置您需要到scheduleAtFiexed率:

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小时工作应该un ...我花了几个小时,但你需要在最后插入毫秒,所以5分钟(你必须达到5 * 60 * 1000毫秒。

问候

编辑在对于athors评论: 要启动在应用程序启动的事情,你有几种方法。一种方法是像这样在启动时启动一个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,因为你可以有多个条目,可以决定首先启动(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(... 

} 

}

IMPORTA NT注意:上面的 我有一个方法“clearRequests”,对不起,这是我的方法,我没有重新命名它在这里添加它。该方法将每隔24小时在我的应用程序中调用。

您从ScheduledExecutorService的调用的方法必须是一个可调用的,就像这样:

private Runnable clearRequests = new Runnable() { 

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

非常感谢,但我的问题是,我不知道在哪里以及如何调用这个代码,我我试过用TimerTask,但我怎么能说我的服务器自动启动它? –

+0

我更新了我的答案 – GobiRan