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