【问题标题】:Trigger an action after a certain period of time一定时间后触发动作
【发布时间】:2015-05-05 05:08:54
【问题描述】:

我和我的团队正在使用 Java EE 开发一个 Web 应用程序,我们正在考虑一些事情。

我们的一个类有一定的生命周期,它会在一定的时间后通过阶段。

我们如何做到这一点,我们怎么做,比如说,在创建对象后 10 分钟,前进到下一阶段,然后在 2 小时后,前进到第三阶段,然后在 50 分钟后,前进。 ...等等。

谢谢

编辑:这个类不会只有一个实例,而是多个,可能有数百个,因此使用预定事件不会提供我们正在寻找的功能。

【问题讨论】:

  • 您肯定听说过和/或读过调度机制吗?您可能会对这个现有问题感兴趣:stackoverflow.com/questions/21598155/…
  • 我过去使用过调度机制,但我们在这里讨论的可能是数百个实例,其中一些甚至不会被加载,因为它们是持久化的。他们都应该有单独的“计时器”,我不是在寻找一个调度程序,它在固定的时间段内做某事,每个实例都不同。

标签: jakarta-ee jboss cdi


【解决方案1】:

我认为有一个简单的解决方案。

System.currentTimeMillis() gives you the actual time in milliseconds (actually it returns 

当前时间与 UTC 时间 1970 年 1 月 1 日午夜之间的差异,以毫秒为单位。 -- Java SE 7 文档

因此,您可以在对象的构造函数中存储创建时间,并定期(如运行和无限循环或其他)测试是否经过了足够的时间。如果是,那么您可以前进,否则请注意。

这可能看起来有点暴力,但我认为它可能会起作用。

【讨论】:

    【解决方案2】:

    让我们调用具有特定生命周期的类。

    创建一个 EJBTimer 单例实例(使用 @Singleton 和 @Startup 注释),其中包含一组 A 实例并将其注入到所有 A 实例中。 每个 A 实例将负责在其实例化后将自己注册到计时器 Set 中(例如在 @PostConstruct 方法中)。

    计时器方法将在每个实例上进行迭代并检查它是否需要提升其生命周期。

    【讨论】:

    • 但这是否意味着它必须每秒检查一次?我想这将是一个巨大的性能问题。
    • 您的生命周期需要第二个精度?每 1/2 分钟或每分钟呢?恕我直言,一个线程定期运行的性能比很少唤醒的许多线程(每个 A 实例一个)要好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 2011-04-07
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多