6

我有以下单例,应该在 Web 应用程序启动时执行但它没有,并且计划任务也没有运行。

@Singleton
@Startup
public class Scheduler {

    private static int count = 0;

    @PostConstruct
    public void onStartup() {
        System.out.println("Initialization success.");
    }

   @Schedule(second="*/10", minute="*", hour="*")
   public void execute() {
      System.out.println("its running count..."+count);
      count++;
   }
}

我正在使用 Glassfish 服务器 3.1.2。

编辑

启动方法现在正在执行,但调度方法没有运行。

4

4 回答 4

11

我的问题是我使用了错误的Singleton课程,而javax.inject.Singleton不是javax.ejb.Singleton

于 2015-01-26T07:56:21.100 回答
5

添加另一个答案,因为 Boreded 自己的答案有一些问题。

设置解决问题的原因可能是如果设置为 truepersistence=false时已经存在,则不会重新创建持久计时器。keepstate

您应该在日志中看到以下内容

INFO: keepstate is true and will not create new auto timers during deployment.

我认为我在这里的回答(连同 Roland Tiefenbrunner 对同一问题的回答)很好地涵盖了这个问题。

于 2013-03-20T18:57:49.267 回答
3

还要注意注释的默认值。小时、分钟和秒默认为 0 NOT *,而其他默认为 * ,因此例如 @Schedule(minute = "*/20", persistent = false) 只会在午夜过后 20 + 40 分钟触发。

@Target(value=METHOD)
@Retention(value=RUNTIME)
public @interface Schedule {
   String dayOfMonth() default "*";

   String dayOfWeek() default "*";

   String hour() default "0";

   String info() default "";

   String minute() default "0";

   String month() default "*";

   boolean persistent() default true;

   String second() default "0";

   String timezone() default "";

   String year() default "*";
}
于 2018-06-25T15:07:47.627 回答
1

对于其他有类似问题的人,添加以下解决了我的问题:

persistent=false

所以我的日程注释现在是

@Schedule(second="*/10", minute="*", hour="*", persistent=false)
于 2013-03-20T12:36:50.777 回答