Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 重新启动后失去与EJB的连接_Jakarta Ee_Delegates_Ejb_Lookup_Service Locator - Fatal编程技术网

Jakarta ee 重新启动后失去与EJB的连接

Jakarta ee 重新启动后失去与EJB的连接,jakarta-ee,delegates,ejb,lookup,service-locator,Jakarta Ee,Delegates,Ejb,Lookup,Service Locator,我有一个连接到EJB的应用程序来检索一些数据。EJB位于单独的EAR中。 应用程序正在使用委托单例模式来获得到EJB的连接。问题是,EJB经常被重新部署,因为它仍在开发中,每次这种情况发生时,当EJB重新联机时,我的应用程序都会断开连接,无法重新连接,因为singleton的getInstance方法不断返回空的远程对象引用,并且无法重新建立连接,所以我必须重新部署我的客户端应用程序才能重新连接。 有没有什么方法可以防止这种情况发生,而不是对每个请求都进行查找 public class Dele

我有一个连接到EJB的应用程序来检索一些数据。EJB位于单独的EAR中。 应用程序正在使用委托单例模式来获得到EJB的连接。问题是,EJB经常被重新部署,因为它仍在开发中,每次这种情况发生时,当EJB重新联机时,我的应用程序都会断开连接,无法重新连接,因为singleton的getInstance方法不断返回空的远程对象引用,并且无法重新建立连接,所以我必须重新部署我的客户端应用程序才能重新连接。 有没有什么方法可以防止这种情况发生,而不是对每个请求都进行查找

public class Delegate 
{

...

private DataStoreService getDataStoreServiceInterface {

        ServiceLocator serviceLocator = ServiceLocator.getInstance();            
        return serviceLocator.getDataStoreService();
    }

   public Data getData(){
   DataStoreService dataStoreService = getDataStoreServiceInterface();
   return dataStoreService.getData();
    }

}



public class ServiceLocator{

private static ServiceLocator instance = null;

private DataStoreService dataStoreService = null;

protected Context context;

private ServiceLocator(){

context = new InitialContext();
dataStoreService = (DataStoreService)context.lookup(DataStoreService.class.getName());
}

 static public ServiceLocator getInstance(){

    if (instance == null) {
        instance = new ServiceLocator();
    }
    return instance;
  }
}

当项目处于开发模式时,不要使用单例模式,因此每次调用getInstance时都会返回一个新实例。此外,在编写获取EJB实例的类的方式中,您将遇到一个问题,因为应用程序中只有一个线程可以调用该EJB,因为虽然EJB正在使用,但没有人可以使用该实例,并且在所有应用程序中只使用一个相同的EJB实例


另一种方法是使用单例会话bean(EJB),而不是使用单例模式。

显然这是Weblogic 10.3.6中的一个容器错误,我必须删除单例逻辑以避免这个问题。

捕获远程EJB引用是一种很好的常见做法,您应该检查您的服务器版本是否存在与此问题相关的错误。“您将遇到问题,因为您的应用程序中只有一个线程可以调用该EJB,因为尽管EJB正在使用,但没有人可以使用该实例。”这完全错了,EJB不是这样工作的。我建议您阅读有关远程代理概念和EJB生命周期的内容。是否提供引用或更多信息?这是一个非常低质量的答案。