我确信这个问题已被无数次询问,但我已经尝试了所有我读过的内容,似乎没有任何工作。我确信修复可能也很简单。
我有以下单例,应该在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。
非常感谢任何帮助。
感谢。
修改
现在正在执行启动方法,但调度方法不会运行。
答案 0 :(得分:8)
我的问题是我使用了错误的Singleton
课程,而不是javax.inject.Singleton
但javax.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)