Java EE 6 @Startup和@Schedule永远不会被执行

时间:2013-03-20 10:25:04

标签: java-ee singleton ejb scheduling startup

我确信这个问题已被无数次询问,但我已经尝试了所有我读过的内容,似乎没有任何工作。我确信修复可能也很简单。

我有以下单例,应该在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 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:5)

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

设置persistence=false解决问题的原因可能是由于在keepstate设置为true时已经存在,因此不会重新创建持久定时器。

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

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

我认为我的回答here(连同Roland Tiefenbrunner对同一问题的回答)在一定程度上涵盖了这个问题。

答案 2 :(得分:2)

还要注意注释的默认值。小时,分钟和秒默认为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 "*";
}

答案 3 :(得分:1)

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

persistent=false

所以我的日程安排注释现在是

@Schedule(second="*/10", minute="*", hour="*", persistent=false)