Openshift cron 执行 servlet - 预定作业
Openshift cron execute servlet - Scheduled Job
我需要每 5 分钟在我的服务器上执行一次任务以更新数据库上的一些数据,我发现在 openshift 上我有一个 cron 每次都执行一些脚本。是否可以制作一个脚本来简单调用 servlet 或 java 代码以 运行 此作业?
我对服务器端编程很陌生,所以请说得轻松一点!
Ps。我正在使用 Tomcat 6 (Jboss EWS 1.0)、mySQL 5.5 服务器
据我了解,您需要每隔 XX 分钟申请 运行 某事。
为了计算开始时间,我做了一个辅助函数 "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();
并将您的需求设置到 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 毫秒。
问候
编辑关于作者的评论:
要在应用程序启动时启动,您有几种方法。一种方法是像这样在启动时启动一个 servlet。插入 web.xml
<servlet>
<servlet-name>ServletStartups</servlet-name>
<servlet-class>model.initialization.ServletStartups</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这将在应用程序启动时调用Class 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);
}
}
};
我需要每 5 分钟在我的服务器上执行一次任务以更新数据库上的一些数据,我发现在 openshift 上我有一个 cron 每次都执行一些脚本。是否可以制作一个脚本来简单调用 servlet 或 java 代码以 运行 此作业? 我对服务器端编程很陌生,所以请说得轻松一点!
Ps。我正在使用 Tomcat 6 (Jboss EWS 1.0)、mySQL 5.5 服务器
据我了解,您需要每隔 XX 分钟申请 运行 某事。 为了计算开始时间,我做了一个辅助函数 "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();
并将您的需求设置到 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 毫秒。
问候
编辑关于作者的评论: 要在应用程序启动时启动,您有几种方法。一种方法是像这样在启动时启动一个 servlet。插入 web.xml
<servlet>
<servlet-name>ServletStartups</servlet-name>
<servlet-class>model.initialization.ServletStartups</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
这将在应用程序启动时调用Class 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);
}
}
};