我正在使用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工作。但是如果我在星期四重新启动我的服务器并将开始时间设置为星期天它就没有开火。
在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);
}
答案 0 :(得分:1)
WebSphere Application Server中没有空闲的线程查杀机制,因此不应该有任何原因计时器不运行。我建议采用核心线程转储来查看您的线程是否仍在运行(可能是在调度之后立即执行),也可能是核心转储以检查字段值以确保它们具有预期值。我最好的猜测是,启动计时器的逻辑实际上并不是出于某种原因而运行。
那就是说,为什么你首先使用java.util.Timer?在任何Java EE服务器中都不建议这样做。如果您使用的是WebSphere 8.0或更高版本,我建议您使用EJB计划时间,您可以使用类似cron的语法进行配置。否则,如果升级不是一个选项,我建议使用WebSphere Scheduler。
答案 1 :(得分:0)
在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);