Java 计时器不会在 Websphere 服务器上触发
Java Timer doesn't fire at Websphere server
我正在使用 java.Util.Timer 库来安排我的工作。
我想每个星期天在 22:00 调用我的函数。所以我的代码就像:
rspServer = new RSPServer();
Calendar scheduleStartTime = Calendar.getInstance();
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 22);
scheduleStartTime.set(Calendar.MINUTE, 0);
scheduleStartTime.set(Calendar.SECOND, 0);
scheduleStartTime.set(Calendar.MILLISECOND, 0);
rspServer.startScheduler(Class.forName("xx.xx.xx.xx.RSP.RSPServer"),rspServer, "PopulateModels", scheduleStartTime, 7 * 24 * 60 * 60 * 1000);
我在星期四部署了该代码并重新启动了 websphere 服务器。我原以为该功能将在星期日开始。但它没有火。服务器中没有错误或日志。
我试过了
我将开始时间更新为周一 11:00 上午。并于周一上午 10:40 重新启动服务器。 20 分钟后,我的功能按预期在 11:00 am 运行。但是,如果我在星期四重新启动服务器并将开始时间设置为星期日,它就不会触发。
在 webshere 服务器中是否有一种空闲线程终止时间或其他东西?
这可能是什么原因?
这是我的 startScheduler 函数
public void startScheduler(final Class<?> serverClass, final Object server,
final String methodName, Calendar _startAfterTime, int _repeatAfterTime) {
timer = new Timer();
TimerTask timerTask = new TimerTask() {
private java.lang.reflect.Method method;
@Override
public void run() {
try {
method = serverClass.getMethod(methodName);
method.invoke(server);
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println("Error!");
e.printStackTrace();
}
}
};
timer.schedule(timerTask, _startAfterTime.getTime(), _repeatAfterTime);
}
WebSphere Application Server 中没有闲置线程终止机制,所以没有理由不使用计时器 运行。我建议进行核心线程转储以查看您的线程是否仍在 运行ning(可能在它被安排后立即),并且可能进行核心转储来检查字段值以确保它们具有预期值。我最好的猜测是,出于某种原因,这种启动计时器的逻辑实际上并不是 运行ning。
就是说,您为什么首先要使用 java.util.Timer?在任何 Java EE 服务器中都不推荐这样做。如果您使用的是 WebSphere 8.0 或更高版本,我建议您使用 EJB 计划时间,您可以使用类似 cron 的语法对其进行配置。否则,如果升级不是一个选项,我会建议使用 WebSphere Scheduler。
在 websphere 默认 java 时间配置中,一周从星期日开始。在土耳其,一周从星期一开始。因此,当我通过代码将日期设置为星期三的星期日时:
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
在我的本地设置为下周日,但在 websphere 中设置为上周日。
在定时器功能中,如果您设置的开始日期小于当前日期,则定时器功能不会触发。这是图书馆限制。所以我解决了我的问题
Calendar scheduleStartTime = Calendar.getInstance();
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 11);
scheduleStartTime.add(Calendar.DAY_OF_YEAR, 7); // added this line to set next sunday
scheduleStartTime.set(Calendar.MINUTE, 0);
scheduleStartTime.set(Calendar.SECOND, 0);
scheduleStartTime.set(Calendar.MILLISECOND, 0);
我正在使用 java.Util.Timer 库来安排我的工作。
我想每个星期天在 22:00 调用我的函数。所以我的代码就像:
rspServer = new RSPServer();
Calendar scheduleStartTime = Calendar.getInstance();
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 22);
scheduleStartTime.set(Calendar.MINUTE, 0);
scheduleStartTime.set(Calendar.SECOND, 0);
scheduleStartTime.set(Calendar.MILLISECOND, 0);
rspServer.startScheduler(Class.forName("xx.xx.xx.xx.RSP.RSPServer"),rspServer, "PopulateModels", scheduleStartTime, 7 * 24 * 60 * 60 * 1000);
我在星期四部署了该代码并重新启动了 websphere 服务器。我原以为该功能将在星期日开始。但它没有火。服务器中没有错误或日志。
我试过了
我将开始时间更新为周一 11:00 上午。并于周一上午 10:40 重新启动服务器。 20 分钟后,我的功能按预期在 11:00 am 运行。但是,如果我在星期四重新启动服务器并将开始时间设置为星期日,它就不会触发。
在 webshere 服务器中是否有一种空闲线程终止时间或其他东西? 这可能是什么原因?
这是我的 startScheduler 函数
public void startScheduler(final Class<?> serverClass, final Object server,
final String methodName, Calendar _startAfterTime, int _repeatAfterTime) {
timer = new Timer();
TimerTask timerTask = new TimerTask() {
private java.lang.reflect.Method method;
@Override
public void run() {
try {
method = serverClass.getMethod(methodName);
method.invoke(server);
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println("Error!");
e.printStackTrace();
}
}
};
timer.schedule(timerTask, _startAfterTime.getTime(), _repeatAfterTime);
}
WebSphere Application Server 中没有闲置线程终止机制,所以没有理由不使用计时器 运行。我建议进行核心线程转储以查看您的线程是否仍在 运行ning(可能在它被安排后立即),并且可能进行核心转储来检查字段值以确保它们具有预期值。我最好的猜测是,出于某种原因,这种启动计时器的逻辑实际上并不是 运行ning。
就是说,您为什么首先要使用 java.util.Timer?在任何 Java EE 服务器中都不推荐这样做。如果您使用的是 WebSphere 8.0 或更高版本,我建议您使用 EJB 计划时间,您可以使用类似 cron 的语法对其进行配置。否则,如果升级不是一个选项,我会建议使用 WebSphere Scheduler。
在 websphere 默认 java 时间配置中,一周从星期日开始。在土耳其,一周从星期一开始。因此,当我通过代码将日期设置为星期三的星期日时:
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
在我的本地设置为下周日,但在 websphere 中设置为上周日。
在定时器功能中,如果您设置的开始日期小于当前日期,则定时器功能不会触发。这是图书馆限制。所以我解决了我的问题
Calendar scheduleStartTime = Calendar.getInstance();
scheduleStartTime.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
scheduleStartTime.set(Calendar.HOUR_OF_DAY, 11);
scheduleStartTime.add(Calendar.DAY_OF_YEAR, 7); // added this line to set next sunday
scheduleStartTime.set(Calendar.MINUTE, 0);
scheduleStartTime.set(Calendar.SECOND, 0);
scheduleStartTime.set(Calendar.MILLISECOND, 0);