我有一個環境,其中一個EJB從服務器啓動時開始,代碼在內部調用另一個無狀態bean,它通過Executor Service在內部啓動一個線程。在這個線程啓動通過Executor服務,每當我做一個jndi查找(java:全球/測試/ NetworkConnectionChecker!com.testing.common.NetworkConnectionChecker)裏面的運行方法,我得到javax.naming.NameNotFoundException,但如果我把一個thread.sleep在這個線程的run方法中大約60秒,jndi查找會給我這個對象,並且不會引發異常。 另一個有趣的一點是,當我在開始的Thread的構造函數中執行查找時,我立即通過jndi查找來獲取對象,而不需要任何Thread.sleep 我試圖通過jndi獲取的EJB查找被標註爲@Singleton和@Startup。 任何人都可以建議我,我做錯了什麼,我也可以看到服務器啓動時生成的日誌提及jndi綁定。該日誌如下JNDI名稱解析在新線程中失敗tomee
(name=global/testing/NetworkConnectionChecker!com.testing.common.NetworkConnectionChecker)
我看到下列異常時,JNDI查找失敗
javax.naming.NameNotFoundException: Name [global/testing/NetworkConnectionChecker!com.testing.common.NetworkConnectionChecker] is not bound in this Context. Unable to find [global].
at org.apache.naming.NamingContext.lookup(NamingContext.java:819)
at org.apache.naming.NamingContext.lookup(NamingContext.java:167)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:156)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at com.testing.main.AbstractServiceFactory.getNetworkConnectionChecker(AbstractServiceFactory.java:85)
我使用的Java 8和tomee版本1.7
請讓我知道,如果你們中的任何要求更多的信息。我花了整整一天的時間試圖找出答案。
嗨,我需要運行一個長時間運行的任務,每當我得到一個請求,因此我使用線程。如果你可以用其他方式建議我處理這個問題,我願意接受 – vishva