【问题标题】:Java EE 6 @Startup and @Schedule never being executedJava EE 6 @Startup 和 @Schedule 永远不会被执行
【发布时间】:2013-03-09 09:24:29
【问题描述】:

我有以下单例,应该在 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。

编辑

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

【问题讨论】:

  • 你能显示单例注释的导入吗?
  • 嗨。它是:import javax.ejb.Singleton;
  • 您在(重新)部署期间是否看到 GlassFish 的任何错误/日志?
  • 没有错误。反正和这个没什么关系。单身人士的位置有影响吗?我目前将它放在一个 .util 包中。努力寻找其他可能的问题。
  • 也许我的回答在这里适用。 stackoverflow.com/questions/13092567/…

标签: jakarta-ee singleton ejb scheduling startup


【解决方案1】:

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

【讨论】:

  • 我现在遇到了完全相同的问题,直到我意识到导入了错误的 Singleton 注释之前,我都快疯了。
  • 这两个类应该是哪一个?
  • 我同意彼得,这很难从评论中看出!
  • 这也是我的错误。有关如何在 Java EE/Jarkata EE 中使用单例创建调度程序的完整说明,请参阅stackoverflow.com/a/7499769/1090666。只要确保当你这样做时,你导入了正确的 Singleton 类。
  • 我遇到了同样的问题。您必须使用 javax.ejb.Singletonjavax.ejb.Startup 才能正常工作。
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 没有。通常情况下,计时器的调用状态为 true 和 false,持续为 true 和 false。
  • 相关问题中给出的其他答案似乎是合理的。在 GF 启动期间,您是否遇到过任何 derby 错误?
  • 当然,计时器仍然会触发,但我认为这里发生的是首先部署了一个没有跟踪的计时器。因此,当您稍后更改计时器以包含输出跟踪时,它不会被部署。更改保持状态或使计时器非持久化会重新部署新计时器。
【解决方案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 "*";
}

【讨论】:

  • 谢谢!我想不通,但是阅读您的答案很有意义并解决了我的问题。
【解决方案4】:

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

persistent=false

所以我的日程注释现在是

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

【讨论】:

  • 问题中公开的代码运行良好,没有设置persistence=false。如果这个解决方案真的解决了问题,那就是不小心隐藏了你真正的问题
猜你喜欢
  • 2019-12-07
  • 2021-08-19
  • 2016-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
相关资源
最近更新 更多