可以在“受管客户端”中使用@EJB注释来访问EJB。
可以将此注释放在servlet类中,声明成员变量。
public class MyServlet extends HttpServlet {
@EJB
private MyWorkerInterface theWorker;
}
@EJB注释扩展为JNDI查找(我假设)在servlet初始化时执行。那些JNDI查找可能会失败:EJB提供程序可以选择修改其注释以指定特定的JNDI名称,然后我的@EJB引用需要指定非默认的JNDI名称,否则查找将失败。
我想,由于EJB可以是远程的,因此存在瞬态,网络故障和服务器跳出错误的可能性。
我的想法:当使用 theWorker 时,我应检查其有效性。
if ( theWorker == null ) {
// ... etc.
我的问题:
1。)是否需要进行这种空检查?
2.如果是,和空值可能是由瞬态错误引起的,例如远程服务器的临时故障,是否可以恢复? servlet现在是初始化的。我真的需要重新启动我的servlet才能恢复吗?当然不是吗?
3。)暂定思考:可能需要明确的,懒惰的JNDI查找代码,而不是使用@EJB。评论
答案 0 :(得分:3)
很抱歉没有提供任何参考规范,我只是说以前的JBoss经验。
1)不,除非容器出错
2)不相关,您的实例将是远程服务的代理,实现远程接口。因此注射将始终成功。当您调用代理的方法时会出现错误,因此您需要准备好在使用远程接口时处理这些错误。这就是RemoteException的用途,所有错误都应该包含在RemoteException中,以便在出现问题时捕获。如果你让它传播,tx将被回滚,如果你只操纵启用tx的资源,这是一个理智的默认值。
3)这通常只在您需要JNDI查找的不同初始上下文属性时才需要,但对于这些情况,我个人会使用DI引擎和另一个注释(例如@ EJBFromHost2)。使用显式JNDI查找变得非常复杂,特别是如果您以后想要更改为另一个JNDI实现或设置(例如,如果您想要集群应用程序)。