【问题标题】:How to delay processing reasonably in Java EE context?如何在 Java EE 上下文中合理延迟处理?
【发布时间】:2013-10-01 11:59:53
【问题描述】:

在 Java EE 5 环境中,在继续处理我自己的数据之前,我遇到了确保其他部分写入的某些数据存在的问题。

从历史上看(J2EE 时间),它是通过将要处理的数据对象在等待例如通过 Thread.sleep 500 毫秒。

但这感觉不是处理该问题的最佳方法,所以我有 2 个问题:

  1. 在 Java EE 上下文中使用 sleep 方法有什么问题吗?
  2. 在 Java EE 5 应用程序中延迟某些处理的合理解决方案是什么?

编辑:

我应该提到,我的处理发生在通过 MDB 处理来自 JMS 队列的对象时。

可能是这样的,我等待的数据永远不会出现,所以一定有某种超时,之后我可以对我的数据进行一些特殊的处理。

【问题讨论】:

    标签: java sleep java-ee-5


    【解决方案1】:

    您可以使用 EJB TimerService 功能。应避免在托管环境中使用线程。

    【讨论】:

      【解决方案2】:

      我同意@dkaustubh 关于计时器和避免JavaEE 中的线程操作的观点。

      另一种可能性是使用延迟交付的 JMS 队列。尽管它不是 JavaEE API 的一部分,但大多数消息传递系统供应商都支持它。 check here.

      【讨论】:

      • 这是一个很好的提示 - 应用程序在 JBoss 5.1 中运行,所以 this JBoss forum question,必须设置 JMS_JBOSS_SCHEDULED_DELIVERY_PROP_NAME
      【解决方案3】:

      我认为,使用一些高级线程方法是可能的。除了考虑手动同步和线程管理之外,您还可以随时使用Java Concurrent 包。

      Future 可以是执行此操作的方法之一。请参考Java并发包。

      【讨论】:

        【解决方案4】:

        使用通知和Object#wait() / Object#notifyAll() 即多线程,生产者通知消费者。

        【讨论】:

        • 您确定这可以在 Java EE 应用程序中安全地完成吗?我的处理是从 JMS 队列中进行的,所以我担心我会通过在这里实现自己的同步机制来干扰整个过程。此外,如果第一个来源的信息不可用,我还需要超时。 (我将其添加到我的问题中。)
        • 好吧,wait() 可以超时(使用 Object#wait(long timeout))... 不确定同步。 JRE 中还有很多帮助类可以为你同步。
        • 好的,但同样,应用程序在 Java EE 容器中运行,所以我想知道我是否可以使用这些机制?
        • @Geziefer 理论上是的。无论如何,哪些组件彼此同步?对于 Beans 有同步机制...也许 this 适用?
        • @AlexR SessionSynchronization 仅适用于处理事务/两阶段提交。 JavaEE 规范禁止线程操作,因为容器的职责是管理线程/bean 实例池。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        相关资源
        最近更新 更多