Java CommunicationException[根异常为ConnectException:连接超时]
我在尝试连接Active Directory时偶尔会遇到此异常Java CommunicationException[根异常为ConnectException:连接超时],java,ldap,runtime-error,communicationexception,connectexception,Java,Ldap,Runtime Error,Communicationexception,Connectexception,我在尝试连接Active Directory时偶尔会遇到此异常 javax.naming.CommunicationException: <ServerIP>:<PORT> [Root exception is java.net.ConnectException: Connection timed out: connect] javax.naming.CommunicationException:: [根异常为java.net.ConnectException:连
javax.naming.CommunicationException: <ServerIP>:<PORT>
[Root exception is java.net.ConnectException: Connection timed out: connect]
javax.naming.CommunicationException::
[根异常为java.net.ConnectException:连接超时:连接]
这是我的密码:
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);
DirContext ctx=null;
Properties env=新属性();
环境保护(Context.SECURITY_PRINCIPAL,);
环境保护(Context.SECURITY_凭证,);
env.put(Context.PROVIDER_URL,“ldap://:”;
put(Context.INITIAL\u Context\u工厂,“com.sun.jndi.ldap.LdapCtxFactory”);
ctx=新的初始目录上下文(env);
获取此行中的连接超时异常ctx=new InitialDirContext(env)代码>。
它不是每次都发生,但经常发生
请告诉我,如何解决这个问题?我偶尔也会遇到这种情况。由于这种情况只发生了约1%,我怀疑这是朱纳德回答中列出的任何原因,因为我的环境没有任何变化
对我来说,它是随机发生的,并且是固定的,我没有采取任何具体行动。这使我相信所提供的答案是正确的:
很可能是连接泄漏。连接超时可能由许多因素引起,但大多数因素每次都会导致连接超时。很可能LDAP服务器同时处理的连接数已达到最大值,超过该值时,它将不会调用accept(),因此新的传入连接将保留在积压队列中,这将导致更多传入连接超时
@OP发生这种情况时,您可以在服务器上运行netstat-anp来检查上述假设吗?还可以在LDAP服务器上设置连接空闲超时吗?这将修复连接泄漏,但以暴力的方式,可能会破坏其他东西
有同样的间歇性问题,尽管配置指向域名(不是IP)
通过使用NSLOOKUP,发现列出了一个不存在的DC,这导致了间歇性的连接问题。当我用ScheduledExecutorService替换计时器来启动Ldap服务器时,我也开始注意到这一点。这个问题原来是一个竞赛条件。我将Ldap服务器的启动时间从0延迟更改为5秒延迟,这似乎解决了Ldap服务器的java.net.ConnectException问题
此处存在种族条件:
final ScheduledExecutorService ses=Executors.newSingleThreadScheduledExecutor();
ses.scheduleWithFixedDelay(ldapServer,0,5,时间单位为秒)
此处解决了竞赛条件:
final ScheduledExecutorService ses=Executors.newSingleThreadScheduledExecutor();
ses.scheduleWithFixedDelay(ldapServer,5,5,时间单位秒) 切换到LDAPS后,我收到了相同的错误,我现在使用端口636,我发现我连接的域上的一个域控制器在端口636上被阻塞
[Root exception is java.net.ConnectException:Connection timed out:connect]I这是我为克服上述随机问题而采取的一种变通方法:捕获CommunicationException,然后重试至少3次。希望这篇文章对@FutureBay这样的人有用(这篇文章似乎没有为这个问题提供答案。请编辑你的答案并加以改进,或者只是作为对这个问题的评论发表)。