我有一个环境,其中一个EJB在服务器启动时启动,代码在内部调用另一个无状态bean,它通过Executor Service在内部启动一个线程。在通过Executor Service启动的这个线程中,每当我在run方法中执行jndi查找(java:global / testing / NetworkConnectionChecker!com.testing.common.NetworkConnectionChecker)时,我得到javax.naming.NameNotFoundException但是如果我放了一个thread.sleep在这个线程的run方法中大约60秒,jndi查找给了我对象,并且没有抛出异常。 另一个有趣的一点是,当我在我开始的Thread的构造函数中进行查找时,我立即通过jndi查找获取对象,而不放置任何Thread.sleep 我试图通过jndi查找获取的EJB注释为@Singleton和@Startup。 任何人都可以建议我,我做错了什么,我也可以看到服务器启动时生成的日志提到jndi绑定。日志如下
(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版
如果您有任何需要更多信息,请与我们联系。我花了整整一天时间试图解决这个问题。
答案 0 :(得分:0)
为EJB使用线程不是一个好主意。 请看这个例子: http://examples.javacodegeeks.com/enterprise-java/ejb3/timer/ejb-timer-service-example/