Jakarta ee InitialContext.lookup远程EJB在远程服务器重新启动后失败

Jakarta ee InitialContext.lookup远程EJB在远程服务器重新启动后失败,jakarta-ee,glassfish,ejb,iiop,Jakarta Ee,Glassfish,Ejb,Iiop,我们有一个设置,其中EJBA在服务器a上运行,另一个EJBB在服务器B上运行。EJBA通过IIOP连接到EJBB。此设置正常工作,但如果服务器B重新启动,EJBA将失败,直到服务器A也重新启动 问题是,如果服务器B重新启动,EJBA对InitialContext.lookup的所有调用都会失败,并出现“java.io.IOException:End of stream”异常,直到服务器A重新启动。我无法找到关于我们的应用服务器(GlassFish)是否对InitialContext.lookup

我们有一个设置,其中EJBA在服务器a上运行,另一个EJBB在服务器B上运行。EJBA通过IIOP连接到EJBB。此设置正常工作,但如果服务器B重新启动,EJBA将失败,直到服务器A也重新启动

问题是,如果服务器B重新启动,EJBA对InitialContext.lookup的所有调用都会失败,并出现“java.io.IOException:End of stream”异常,直到服务器A重新启动。我无法找到关于我们的应用服务器(GlassFish)是否对InitialContext.lookup进行任何缓存的信息。在服务器重新启动之前查找失败还有其他原因吗?如果InitialContext.lookup缓存连接,我将如何解决这个问题

我们的服务器运行Sun Application Server 9.1。查找实际上是通过org.springframework.jndi.jndemplate完成的,但堆栈跟踪表明jndemplate正在调用InitialContext.lookup()

谢谢你的洞察力

另外,我应该澄清一下,我正在试图弄清楚是否有可能避免每次服务器B重新启动时都必须重新启动服务器A

JNDeTemplate的定义(某些文本被“x”和“#”遮住)


通过堆栈跟踪,我可以得出结论,Spring框架本身并没有缓存——它实际上调用了
InitialContext.lookup()
。尽管如此,堆栈跟踪和错误代码仍然暗示存在连接中断

WebSphere过去也有一个类似的bug,从那时起就被修复了。结果证明是应用服务器本身造成的缓存问题。我怀疑SunAS在9.1中也有类似的错误


Isaac

通过堆栈跟踪,我可以得出结论,Spring框架本身并没有缓存—它实际上调用了
InitialContext.lookup()
。尽管如此,堆栈跟踪和错误代码仍然暗示存在连接中断

WebSphere过去也有一个类似的bug,从那时起就被修复了。结果证明是应用服务器本身造成的缓存问题。我怀疑SunAS在9.1中也有类似的错误

Isaac

方法syncChanges()定期运行以进行同步。其主要思想是在发生错误时(在为exsample重新启动服务器之后)关闭上下文并重新初始化它。使用方法context.close()关闭上下文后,应该将其值设为null

public class SyncOperationsService {
    private InitialContext context;
    private SyncOperationsRemote syncOperationsRemote = null; //RemoteBean

    public String syncChanges() {
        try {
            if (context == null) {
                context = new InitialContext(properties);
            }

            if (context != null) {
                syncOperationsRemote = (SyncOperationsRemote) context.lookup("PathToYourRemoteBean");
            }

            result = syncOperationsRemote.syncChanges(dbImportList);  //Try execute remote bean

        } catch (Exception e) {
            log.error(e.getMessage());

            try {
                context.close();
            } catch (Exception e2) {
                log.error(e2.getMessage());
            }
            context = null;
        }
    }
}
出于同步目的,方法syncChanges()定期运行。其主要思想是在发生错误时(在为exsample重新启动服务器之后)关闭上下文并重新初始化它。使用方法context.close()关闭上下文后,应该将其值设为null

public class SyncOperationsService {
    private InitialContext context;
    private SyncOperationsRemote syncOperationsRemote = null; //RemoteBean

    public String syncChanges() {
        try {
            if (context == null) {
                context = new InitialContext(properties);
            }

            if (context != null) {
                syncOperationsRemote = (SyncOperationsRemote) context.lookup("PathToYourRemoteBean");
            }

            result = syncOperationsRemote.syncChanges(dbImportList);  //Try execute remote bean

        } catch (Exception e) {
            log.error(e.getMessage());

            try {
                context.close();
            } catch (Exception e2) {
                log.error(e2.getMessage());
            }
            context = null;
        }
    }
}

我已经意识到,只有在服务器B重新启动时,服务器A尝试连接到EJBB时,才会出现问题。如果在服务器B重新启动时尝试调用,则服务器a将永远无法连接,直到服务器a重新启动。如果服务器A在服务器B重新启动之前一直在调用EJB B,则在服务器B重新启动时它不会调用EJB B,然后在服务器B备份后再次开始调用,一切正常。我遇到了相同的问题(停止访问后无法永远重新连接)-您解决了吗?否,我从来没有真正解决过这个问题。不过,我没有在这个问题上花太多时间。我们通过在服务器B重新启动时总是重新启动服务器A来“修复”它。我意识到,只有在服务器B重新启动时,服务器A尝试连接到EJB B时,才会出现问题。如果在服务器B重新启动时尝试调用,则服务器a将永远无法连接,直到服务器a重新启动。如果服务器A在服务器B重新启动之前一直在调用EJB B,则在服务器B重新启动时它不会调用EJB B,然后在服务器B备份后再次开始调用,一切正常。我遇到了相同的问题(停止访问后无法永远重新连接)-您解决了吗?否,我从来没有真正解决过这个问题。不过,我没有在这个问题上花太多时间。如果服务器B重新启动,我们总是通过重新启动服务器A来“修复”它。我肯定怀疑这是一个应用程序服务器错误。我还没有设法测试可能的代码变通方法。我肯定怀疑这是一个应用服务器错误。我还没有设法测试可能的代码变通方法。
public class SyncOperationsService {
    private InitialContext context;
    private SyncOperationsRemote syncOperationsRemote = null; //RemoteBean

    public String syncChanges() {
        try {
            if (context == null) {
                context = new InitialContext(properties);
            }

            if (context != null) {
                syncOperationsRemote = (SyncOperationsRemote) context.lookup("PathToYourRemoteBean");
            }

            result = syncOperationsRemote.syncChanges(dbImportList);  //Try execute remote bean

        } catch (Exception e) {
            log.error(e.getMessage());

            try {
                context.close();
            } catch (Exception e2) {
                log.error(e2.getMessage());
            }
            context = null;
        }
    }
}