我在尝试连接Active Directory时偶尔会遇到此异常。
javax.naming.CommunicationException: <ServerIP>:<PORT>
[Root exception is java.net.ConnectException: Connection timed out: connect]
这是我的代码:
DirContext ctx = null;
Properties env = new Properties();
env.put(Context.SECURITY_PRINCIPAL, <Bind_USER>);
env.put(Context.SECURITY_CREDENTIALS, <Bind_USER_PWD>);
env.put(Context.PROVIDER_URL, "ldap://<ServerIP>:<PORT>");
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
ctx = new InitialDirContext(env);
获取此行ctx = new InitialDirContext(env);
中的连接超时异常。
它不会每次都发生,但经常发生。
请告诉我,如何摆脱这个问题?
答案 0 :(得分:3)
偶尔也会发生这种情况。因为它只发生了〜1%的时间,我怀疑这是Juned的答案中列出的任何原因,因为我的设置没有任何变化。
对我而言,它是随机发生的,并且在我没有采取任何具体行动的情况下修复。这让我相信提供的答案here是正确的:
很可能是连接泄漏。连接超时可能由许多事情引起,但大多数事情都会导致它每次都出现。很可能LDAP服务器具有它将同时处理的最大连接数,除此之外它不会调用accept(),因此新的传入连接保留在积压队列中,这会填满,这可能会导致进一步的传入连接超时。
@OP当发生这种情况时,你可以在服务器上运行netstat -anp来检查上面的假设吗?您还可以在LDAP服务器上设置连接空闲超时吗?这样可以解决连接泄漏问题,但会以蛮力的方式破坏其他事情。
答案 1 :(得分:0)
虽然配置指向域名(不是IP),但是有同样的间歇性问题。
通过使用NSLOOKUP,发现列出了不存在的DC,导致间歇性连接问题。
答案 2 :(得分:0)
当我将Timer的使用与ScheduledExecutorService的使用互换来启动Ldap Server时,我也开始注意到这一点。问题出在种族问题上。我将Ldap Server的启动时间从0延迟更改为5秒延迟,这似乎已经将java.net.ConnectException解析为我的Ldap Server。
这里存在种族条件:
最终ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay(ldapServer,0,5,TimeUnit.SECONDS);
种族状况在这里解决:
最终ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(); ses.scheduleWithFixedDelay(ldapServer,5,5,TimeUnit.SECONDS);
答案 3 :(得分:0)
移到LDAPS后,我一直遇到相同的错误,我现在正在使用端口636,但我发现连接到的域上的域控制器之一在端口636上被阻塞。
[根本异常是java.net.ConnectException:连接超时:connect]我