在EJB 3.0中等待一小段时间

时间:2013-01-07 12:22:00

标签: java ejb-3.0

我应该在webservice(EJB 3.0)中等待一段时间(一两秒钟)。

我发现this question关于我的问题,这似乎是EJB世界中唯一合法的解决方案,但我仍然找不到如何等待的解决方案。我经常搜索,但似乎用meg 3.0的工具无法实现它。

这是真的吗?或者有解决方案吗?

5 个答案:

答案 0 :(得分:5)

通过Thread.sleep在一个帖子中等待1或2秒就可以了,不会伤害应用服务器。这与实际工作1或2秒之间没有什么区别。如果我们谈论1或2分钟,这将更加令人担忧,并且值得研究更好的协调通信选项,因为有更好的事情与你的CPU相比而不是等待。

围绕Threads的EJB规范中限制的主要动机是防止人们启动线程或破坏线程(start()join()stop(),{{1}等等)或更改线程的状态(suspend()setName(String)setContextClassLoader(ClassLoader)setDaemon(boolean)等)。要理解的关键是线程被容器合并并重新使用以提高效率。因此,任何会影响池状态的东西(通过更改线程对象本身弄脏线程)或与该池竞争(启动/停止线程)都是一个非常大的禁忌。容器还将使用setPriority(int)对象间接设置线程中的状态,例如提供JNDI,事务,安全性和连接管理。这使得开始/停止你自己的线程成为一个双重大禁忌。

在一个线程中睡觉只是浪费你自己的服务器时间和资源。非常小的数量并不可怕 - 浪费时间。更长的时间会受到关注。

但是,我会在交易中说从不致电ThreadLocal。持有锁并呼叫Thread.sleep()是一个很大的禁忌。因此,请确保将此方法标记为sleep或类似。

答案 1 :(得分:2)

我认为Thread.sleep(2000)应该是一个简单的解决方案。为什么你觉得那不起作用?

答案 2 :(得分:0)

如果要在EJB方法中等待,可以使用着名的Thread.sleep暂停当前的执行线程。

注意:您不应该在EJB中进行Thread管理,睡眠是一种管理方式,因此暂停EJB并不是一种好的做法。

可能是,您的要求是一种气味,因此如果出现问题,建议您查看您的设计。

答案 3 :(得分:0)

  

EJB不应该(...)创建或管理线程。

在EJB / Application容器中不首选产生自己的线程,尤其是它们由容器管理。一种方法是使用framework / WorKManager来实现与线程相关的操作。

  

WorkManager是来自commonj.work(commonj-twm.jar)的API

另外我认为EJB中的停止设计很糟糕,而是可以通过将功能划分为两个操作来控制客户端/服务层的延迟。

答案 4 :(得分:0)

不建议EJB与线程交互,这是容器的责任。

作为一种解决方法,您可以尝试使用createTimer(duration, info)创建一个计时器,您可以在其中传递可序列化对象,如果您必须维护状态或保留必要的信息以便进一步执行。您可以将逻辑拆分为两个部分/方法,第二个方法将在先前退出的特定时间间隔后执行。

因此,在定义的间隔之后,将调用超时方法&如果需要,你可以使用序列化对象继续执行。