我应该在webservice(EJB 3.0)中等待一段时间(一两秒钟)。
我发现this question关于我的问题,这似乎是EJB世界中唯一合法的解决方案,但我仍然找不到如何等待的解决方案。我经常搜索,但似乎用meg 3.0的工具无法实现它。
这是真的吗?或者有解决方案吗?
答案 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)
创建一个计时器,您可以在其中传递可序列化对象,如果您必须维护状态或保留必要的信息以便进一步执行。您可以将逻辑拆分为两个部分/方法,第二个方法将在先前退出的特定时间间隔后执行。
因此,在定义的间隔之后,将调用超时方法&如果需要,你可以使用序列化对象继续执行。