Java 在EJB3.0中等待一小段时间

Java 在EJB3.0中等待一小段时间,java,ejb-3.0,Java,Ejb 3.0,我应该在webservice(EJB3.0)中等待一小段时间(一秒或两秒) 我发现关于我的问题,这似乎是EJB世界中唯一合法的解决方案,但我仍然找不到一个如何等待的解决方案。我搜索了很多,但在meg看来,使用EJB3.0工具是无法实现的 这是真的吗?或者有解决方案吗?我觉得线程。睡眠(2000)应该是一个简单的解决方案。为什么您觉得这样做行不通?如果您想在EJB方法中等待,可以使用著名的线程.sleep暂停当前执行线程 注意:您不应该在EJB中进行线程管理,睡眠是一种管理,因此暂停EJB不被认为

我应该在webservice(EJB3.0)中等待一小段时间(一秒或两秒)

我发现关于我的问题,这似乎是EJB世界中唯一合法的解决方案,但我仍然找不到一个如何等待的解决方案。我搜索了很多,但在meg看来,使用EJB3.0工具是无法实现的


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

我觉得
线程。睡眠(2000)
应该是一个简单的解决方案。为什么您觉得这样做行不通?

如果您想在EJB方法中等待,可以使用著名的
线程.sleep
暂停当前执行线程

注意:您不应该在EJB中进行
线程管理,睡眠是一种管理,因此暂停EJB不被认为是一种好的做法

也许,你的需求是一种气味,所以它建议你看看你的设计,如果有什么问题

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

在EJB/应用程序容器中,不推荐生成自己的线程,尤其是由容器管理的线程。一种方法是使用framework/WorKManager实现任何与线程相关的操作

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


另外,我认为EJB中的停止在设计上是不好的,相反,您可以通过将功能划分为两个操作来控制客户机/服务层的延迟。

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

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


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

通过
线程在线程中等待1或2秒。睡眠
很好,不会伤害应用服务器。这和花1秒或2秒做实际工作没有什么区别。如果我们讨论1或2分钟,这将是一个更值得关注的问题,值得研究更好的通信协调选项,因为事实上,CPU有比等待更好的事情要做

EJB规范中关于线程的限制的主要动机实际上是为了防止人们启动线程或破坏线程(
start()
join()
stop()
suspend()
,等等)或更改线程的状态(
setName(String))
setContextClassLoader(ClassLoader)
setDaemon(布尔值)
setPriority(int)
,等等)。要理解的关键是,为了提高效率,线程被容器池化和重用。因此,任何会影响池的状态(通过更改线程对象本身弄脏线程)或与池竞争(启动/停止线程)的事情都是一个非常大的禁忌。容器还将使用
ThreadLocal
对象间接地在线程中设置状态,例如提供JNDI、事务、,安全和连接管理。这使得启动/停止自己的线程成为一个双重的禁忌

睡在线程中只会浪费您自己的服务器时间和资源。数量很少并不可怕——你该浪费时间了。更长的时间是值得关注的


然而,我会说,在事务中从不调用
Thread.sleep()
。持有锁并调用
sleep
是一个很大的禁忌。因此,请确保将此方法标记为
@TransactionAttribute(不受支持)
或类似方法。

嗨,Deepak,感谢您的回复!我不喜欢使用Thread.sleep()的原因是,如果我开始管理线程,我完全不知道容器中会出现什么问题。也许我并没有足够的勇气去尝试:)Thread.sleep()位于JVM的核心。相信我,这会让事情变得简单。简单的事情可以无缝地工作:)。在这里,您不必管理线程;您不必使用wait()或notify()或yield(),这涉及死锁内容。您只需添加一行代码,即Thread.sleep(2000);CPU停止当前线程2秒;在这2秒钟内做一些其他的工作;然后在2秒后再次返回到该线程。时期没有更多的并发症。好的,谢谢迪帕克,你说得绝对正确!David还确认,在一两秒钟内使用Thread.sleep()不会有什么大问题。再次感谢,V.Thread.sleep()甚至不涉及创建任何其他线程,而这些线程会变得很难管理。感谢Burne的回复!我的场景是,我有一个同步Web服务,当我遇到超时错误时,我应该重试调用第三方Web服务。这就是为什么我需要在无状态会话bean中使用这种等待机制的原因。嗨,scuba驱动程序,我同意,我不想使用任何线程管理,但我仍然需要在EJB中等待…如果否决投票,请发表评论:-),这将帮助人们更好地回答Hanks David,这是一个非常详细的描述!现在我有足够的勇气使用Thread.sleep()1或2秒(使用您提到的事务属性!)。再次感谢你,V。