我正在尝试追逐导致引发以下异常的CAS问题:
javax.naming.TimeLimitExceededException: [LDAP: error code 3 - Timelimit Exceeded]; remaining name ''
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3097)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987)
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2794)
at com.sun.jndi.ldap.LdapNamingEnumeration.getNextBatch(LdapNamingEnumeration.java:129)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMoreImpl(LdapNamingEnumeration.java:198)
at com.sun.jndi.ldap.LdapNamingEnumeration.hasMore(LdapNamingEnumeration.java:171)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:295)
at org.springframework.ldap.core.LdapTemplate.search(LdapTemplate.java:361)...
几乎立即返回错误。客户端超时设置为10秒,但这不会发生,因为基于查看com.sun.jndi.ldap代码,似乎域控制器返回状态为3的响应,表示超出时限。
我们正在访问Active Directory全局目录,我们的过滤器和基础非常广泛:base ='',filter =(proxyAddresses = *:someone@somewhere.com) 但是,查询有时会成功,但会返回立即状态代码3。
有谁知道可能导致这种行为的原因是什么?或者也许如何确定究竟发生了什么?
答案 0 :(得分:1)
原来我们的搜索过滤器过于宽泛。
正如您所看到的,我们在过滤器中使用了通配符,查询花了不到2秒钟。
但是,2秒远远短于Active Directory配置的时间限制,因此我无法确定错误发生的原因(即使失败时也不会花费2秒)。
我认为AD必须累计来自同一帐户的多个请求所花费的时间,并且在某些时候开始返回超出时间限制的错误。
要解决此问题,我们修改了搜索过滤器,使其不再包含通配符。然后搜索几乎立即运行,超出时间限制不再发生。