我开发了连接到LDAP并执行LDAP操作的REST Web服务。此服务部署在weblogic服务器上。部署应用程序时,正在初始化与LDAP的连接。
public class Initializer implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent arg0) {
// Set up environment for creating initial context
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY,Constants.INITIAL_CONTEXT_FACTORY);
env.put(Context.SECURITY_AUTHENTICATION,Constants.SECURITY_AUTHENTICATION);
env.put(Context.SECURITY_PRINCIPAL, userName);
env.put(Context.SECURITY_CREDENTIALS,password);
env.put(Context.PROVIDER_URL,LDAP_URL);
// Create initial context
ctx = new InitialLdapContext(env, null);
}
public static LdapContext getLDAPContext() {
return ctx;
}
}
所以我使用getLDAPContext()
来获取LDAP连接并调用JNDI操作来执行LDAP操作。这适用于单节点上的LDAP。
在更高的环境中,我们将LDAP部署在2个节点(不同的计算机)上,并在两个节点上启用了复制。我们在这两个节点上配置了VIP。
现在,当我提供LDAP VIP URL并进行LDAP连接时,我看到连接在一段时间后重置了我的Web服务调用中的异常。我认为这是由于我正在使用的VIP URL造成的。如果我指向单节点LDAP服务器,我没有看到这种行为。
我试图设置没有这样的超时。但它没有帮助。
env.put("com.sun.jndi.ldap.connect.timeout", "-1");
有什么建议吗?
答案 0 :(得分:1)
大多数负载均衡器在一定的配置时间间隔后关闭空闲连接。我看到你在init期间创建连接,并在其余的LDAP调用中使用此连接。一旦负载均衡器关闭了连接并且在客户端(在您的LDAP调用中),您尝试使用该连接,这就是为什么您正在获取这些异常,因为LDAP连接句柄已经过时。您需要捕获异常,并根据您需要再次在连接上执行init的异常类型。