当前位置: 首页 > 知识库问答 >
问题:

TimerService EJB初始化多次

仲孙善
2023-03-14

一方面,我有一个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();
  }

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

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

共有1个答案

苏鸿羽
2023-03-14

最后我得到了;这是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();
  }
}
 类似资料:
  • 在Microservice中,我们将多个DTO数据作为字符串json发布。 控制器: 发布Json: DTO: Dto1和Dto2是java DTO对象名称.如何将字符串json转换为java对象?

  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的

  • new iSlider(DOM, DATA, OPTIONS) Name Type Description DOM dom 容器dom节点 DATA Array 数据列表 OPTIONS Object 配置项 DOM new iSlider(DOM, DATA, OPTIONS); {HTMLElement} 容器dom节点 作为第一个参数并不是必须的,会被OPTIONS.dom覆盖,但是这十分必

  • 确认初始化操作 1)初始化操作用来清空此统计ID的统计数据 2)与启用新的统计ID不同的是,初始化操作使您不需更换网站上的统计代码就可以重新开始统计 注意:初始化操作将清除此统计ID的所有统计数据,此操作不可恢复!!!

  • 创建版本库 git 基于文件夹(工作树)进行版本控制,在一个文件夹中创建 git版本库: $ cd project/ $ git init Initialized empty Git repository in .git/ 输出信息:在当前文件夹的 .git/ 目录下创建版本库 将文件提交到 git索引: git add file1 file2 file3 …… 更方便的作法是