[英]Waiting for a short period of time in EJB 3.0
我應該在Web服務(EJB 3.0)中等待一小段時間(一到兩秒)。
我發現了關於我的問題的這個問題 ,這似乎是EJB世界中唯一的合法解決方案,但是我仍然找不到如何等待的解決方案。 我進行了很多搜索,但似乎很難用EJB 3.0的工具來實現。
真的嗎? 還是有解決方案?
通過Thread.sleep
在線程中等待1或2秒很好,並且不會傷害應用服務器。 這與實際工作1或2秒之間沒有什么區別。 如果我們正在談論1或2分鍾,那將是更多的關注點,值得研究更好的選項來協調通信,這僅僅是因為與CPU相比,要做的事勝於等待。
限制EJB規范中關於線程的主要動機實際上是為了防止人們啟動線程或破壞線程( start()
, join()
, stop()
, suspend()
等)或更改線程的狀態( setName(String)
, setContextClassLoader(ClassLoader)
, setDaemon(boolean)
, setPriority(int)
等。 要理解的關鍵是線程由容器池化並重新使用以提高效率。 因此,任何會影響池狀態(通過更改線程對象本身使線程變臟)或與該池競爭(啟動/停止線程)的事物都是很大的禁止。 容器還將使用ThreadLocal
對象間接設置線程中的狀態,以提供諸如JNDI,事務,安全性和連接管理之類的功能。 這使得啟動/停止您自己的線程變得非常重要。
線程休眠只是浪費您自己的服務器時間和資源。 數量不算太恐怖-這是您的浪費時間。 更長的時間會令人擔憂。
但是,我說永遠不要在事務中調用Thread.sleep()
。 持鎖並呼吁sleep
是一個很大的禁忌。 因此,請確保將此方法標記為@TransactionAttribute(NOT_SUPPORTED)
或類似方法。
我覺得Thread.sleep(2000)
應該是一個簡單的解決方案。 為什么您覺得這行不通?
如果要在EJB方法中等待,可以使用著名的Thread.sleep
暫停當前執行線程。
當心:您不應該在EJB中執行Thread
管理,睡眠是一種管理,因此暫停EJB不被視為一種好習慣。
可能是您的要求是有氣味的,因此如果出現問題,建議您查看設計。
EJB不應(...)創建或管理線程。
在EJB / Application容器中不希望生成自己的線程,尤其是它們由容器管理。 一種方法是使用framework / WorKManager進行與線程相關的操作。
WorkManager是來自commonj.work(commonj-twm.jar)的API
另外,我認為停止EJB在設計上是不好的,而是可以通過將功能分為兩個操作來控制客戶端/服務層的延遲。
EJB不建議與線程進行交互,這是容器的責任。
解決方法是,如果必須維護狀態或保存必要的信息以進一步執行,則可以嘗試使用createTimer(duration, info)
創建計時器,可以在其中傳遞可序列化的對象。 您可以將邏輯分為兩個部分/方法,第二種方法將在先前退出時的特定間隔后執行。
因此,在定義間隔之后,將調用timeout方法,並且如果需要,可以將執行與序列化對象一起進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.