【问题标题】:Java EE "wait" conceptJava EE“等待”概念
【发布时间】:2013-04-23 20:01:33
【问题描述】:

对于需要“等待”数据的 ejb 来说,最好的解决方案是什么?我有一个 ejb 去检查数据库表中的一些数据,如果数据不存在,它需要等待 x 秒并再次检查。我知道在 Java EE 规范中不建议使用 Thread.sleep/Thread.wait 和此类操作。然而,这个问题必须有一个现实的解决方案。其他一些阅读建议您必须启动计时器或其他东西,但是我确实需要阻止请求调用,直到该数据可用,这消除了计划或计时器解决方案。还有其他想法吗?

【问题讨论】:

  • 你能在规范中链接报价吗?如果您需要阻止,那么睡觉可能就是您想要做的事情。使用 servlet 3,您可以通过启动异步上下文 startAsync 并在单独的线程中休眠来释放容器线程。
  • EJB容器的限制可以看这里。在这里它说你不应该管理 sleep() 和 wait() 正在做的“线程”。 oracle.com/technetwork/java/restrictions-142267.html
  • 我想有几个人会争辩说 sleep() 和 wait() 算作管理它。查看其他问题和回复。 stackoverflow.com/questions/8202492/thread-sleep-in-an-ejb
  • sleep()wait() 不应在 JEE 中使用。这是一个重大的禁忌,会导致生产问题!
  • 我很好奇这样做会产生什么样的问题?我看到很多人说不要这样做,这是不可以的。但实际上我还没有听说过它会产生什么问题。

标签: java multithreading jakarta-ee glassfish


【解决方案1】:

您可以使用 EJB Timer 来执行此操作,但老实说,“轮询”数据是一种资源浪费。更好的方法是使用 JMS。您是否让数据的生产者将数据放入数据库中,然后将消息放入队列中。消息和数据库写入都将在同一个事务中一起提交。之后您所做的就是在 JMS 队列上设置一个侦听器,该侦听器在消息到达时触发。就这样,不需要“轮询”。

如果您需要具体示例,请告诉我,我可以稍微扩展一下答案。

【讨论】:

  • 我同意 JMS 是理想的,但在我的情况下,请求来自 Web 服务请求,这破坏了 JMS 的想法。
  • 所以您希望在等待数据写入数据库时​​阻止 Web 服务请求???
  • 是的。我知道这看起来很奇怪,但这就是我所需要的。正常场景它不会等待超过 2 - 3 秒
  • EJB 计时器可能是您想要的。然而,这个设计带来的人需要找到不同的职业。
  • 所以让我再给你一点关于这个问题的背景知识。有几个 Web 服务调用都请求相同的数据,但不是多次调用第 3 方服务,而是第一个线程获取信号量并在其他线程等待结果返回时进行调用。所以他们可以只使用结果的“缓存”。
猜你喜欢
  • 2013-11-25
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 2012-09-05
  • 2016-08-30
  • 2013-11-01
  • 2014-02-25
  • 1970-01-01
相关资源
最近更新 更多