Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TimerService EJB多次初始化_Java_Multithreading_Jakarta Ee_Ejb_Wildfly 8 - Fatal编程技术网

Java TimerService EJB多次初始化

Java TimerService EJB多次初始化,java,multithreading,jakarta-ee,ejb,wildfly-8,Java,Multithreading,Jakarta Ee,Ejb,Wildfly 8,一方面,我有一个CronScheduler类,用于为每个应用程序启动一次,并配置TimerService。 另一方面,我有一项繁重的任务(注释为@EJB),我想在计时器的@timeout中调用它。请注意,在计时器中,我创建了一个调用p.go() 守则: @Singleton @Startup public class CronScheduler { @EJB Processor p; @Resource private TimerService timerService;

一方面,我有一个CronScheduler类,用于为每个应用程序启动一次,并配置TimerService。
另一方面,我有一项繁重的任务(注释为
@EJB
),我想在计时器的
@timeout
中调用它。请注意,在计时器中,我创建了一个调用
p.go()

守则:

@Singleton
@Startup
public class CronScheduler {

  @EJB
  Processor p;

  @Resource
  private TimerService timerService;

  @PostConstruct
  public void init() {
      String h = ... // h,m ,s work fine
      String m = ... 
      String s = ... 
      ScheduleExpression conf = new ScheduleExpression();
      conf.hour(h);
      conf.minute(m);
      conf.second(s);
      // I've tried with the second param (TimerConfig) enabled and disabled 
      timerService.createCalendarTimer(conf, new TimerConfig("msg ", false));
      LOG.log(Level.INFO, ">> Ready for: " + conf.toString());
  }

  @Timeout
  public void run() {
    LOG.log(Level.INFO, "Calling the process");
    Thread t = new Thread() {
      @Override
      public void run() {
        super.run();
        p.go();
      }
    };
    t.start();
  }

}
关键是,cron被多次初始化。
@PostConstruct
代码运行N次。在我看到的日志中

Ready for: A-B-C
Ready for: A-B-C
Ready for: A-B-C

结果是
p.go()
被多次调用。
@singleton
注释工作正常吗?

也许您运行了多个计时器?我最近遇到了一个奇怪的场景,计时器被设置为1k毫秒,新的计时器在前一个计时器完成之前启动。加上某种锁,我把它修好了。也许是类似的情况


您可以调试并检查有多少线程处于活动状态。

我终于找到了;这是EJB和手工线程的问题。关键不在于计时器本身,而在于创建一个新线程,该线程不是由EJB魔法处理的

@Singleton
@Startup
public class CronScheduler {

  @EJB
  Processor p;

  @Resource
  private TimerService timerService;

  @PostConstruct
  public void init() {
      String h = ... // h,m ,s work fine
      String m = ... 
      String s = ... 
      ScheduleExpression conf = new ScheduleExpression();
      conf.hour(h);
      conf.minute(m);
      conf.second(s);
      timerService.createCalendarTimer(conf, new TimerConfig("desc msg ", false));
      LOG.log(Level.INFO, ">> Ready for: " + conf.toString());
  }


  @Timeout
  public void run() {
    LOG.log(Level.INFO, "Calling the process");
    p.go();
  }
}
可能相关:以及