使用并行流和 LdapTemplate 的 LdapTemplate 搜索捕获异常
LdapTemplate search catch exception with parallel stream and LdapTemplate
我有问题尝试使用 spring-ldap 并行搜索在 LDAP 上搜索组。
我正在进行批处理以将数据从 SQL 数据库加载到 LDAP。我使用 spring-boot 和 spring-ldap.
我的算法尝试使用其 gidNumber 在 ldap 上搜索一个组。当 运行 没有并行性 (stream.parallelStream) 时它工作正常。但是当我用 parallelStream 迭代一个列表时,我有时会发现这个异常:
java.lang.ClassCastException: class com.sun.jndi.ldap.LdapCtx cannot be cast to class org.springframework.ldap.core.DirContextAdapter (com.sun.jndi.ldap.LdapCtx is in module java.naming of loader 'bootstrap'; org.springframework.ldap.core.DirContextAdapter is in unnamed module of loader java.net.URLClassLoader @4f0f76b4)
我已将对象从 ContextMapper#mapFromContext 转换为 DirContextAdapter。 Spring-ldap 参考资料说如果我不更改 DirObjectFactory LdapContextSource,此方法应该 return DirContextAdapter 的一个实例。
我的代码类似于:
ldapTemplate.search(
query().base(groupName()).where("gidNumber").is(Long.toString(gid)),
(ContextMapper<GroupLdap>) ctx -> {
DirContextAdapter context = (DirContextAdapter) ctx;
return new GroupLdap(context, true);
})
我的应用程序是一个批处理,用于将数据从 SQL 数据库加载到 LDAP。我使用 spring-boot 和 spring-ldap.
我正在使用 spring-boot 2.1.4、OpenLdap 和 ORACLE 到 SQL-DB。并打开-jdk-zulu 11.
我的算法尝试使用其 gidNumber 在 ldap 上搜索一个组。当 运行 没有并行性 (stream.parallelStream) 时它工作正常。但是当我用 parallelStream() 迭代一个列表时,我有时会遇到一个 ClassCastException:
我设置了一个 ldap 池连接,但它不起作用。
我的代码类似于:
ldapTemplate.search(
query().base(groupName()).where("gidNumber").is(Long.toString(gid)),
(ContextMapper<GroupLdap>) ctx -> {
DirContextAdapter context = (DirContextAdapter) ctx;
return new GroupLdap(context, true);
})
groupName 是引用 "ou=groups,dc=fff,dc=br";
的名称
gid是搜索到的组的gitNumber。
GroupLdap 是组在 LDAP 上的内部表示。
对于并行性,我有时会收到异常:
java.lang.ClassCastException: class com.sun.jndi.ldap.LdapCtx cannot be cast to class org.springframework.ldap.core.DirContextAdapter (com.sun.jndi.ldap.LdapCtx is in module java.naming of loader 'bootstrap'; org.springframework.ldap.core.DirContextAdapter is in unnamed module of loader java.net.URLClassLoader @4f0f76b4)
我已将对象从 ContextMapper#mapFromContext 转换为 DirContextAdapter。 Spring-ldap 参考资料说如果我不更改 DirObjectFactory LdapContextSource,此方法应该 return DirContextAdapter 的一个实例。
我们与团队确认,从 parallelStream()
更改为 stream()
解决了 ClassCastException
的问题。这绝对是一些 openJdk 缺陷。找不到任何相关内容:https://bugs.openjdk.java.net。一旦我重现孤立的问题,我将报告它。目前 parallelStream 并不总是有效(在少数设置上它在少数情况下不起作用)
我使用并且可以使用parallelStream:
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T09:58:13+02:00)
Maven home: C:\Program Files\apache-maven-3.5.2\bin..
Java version: 11.0.5, vendor: Oracle Corporation
Java home: C:\Program Files\Java\jdk-11.0.5
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Colleague has, and experiencing issue:
Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T21:00:29+02:00)
Maven home: C:\tools\ideaIU-2019.2.3.win\plugins\maven\lib\maven3
Java version: 13.0.2, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-13.0.2
Default locale: en_US, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
我有问题尝试使用 spring-ldap 并行搜索在 LDAP 上搜索组。
我正在进行批处理以将数据从 SQL 数据库加载到 LDAP。我使用 spring-boot 和 spring-ldap.
我的算法尝试使用其 gidNumber 在 ldap 上搜索一个组。当 运行 没有并行性 (stream.parallelStream) 时它工作正常。但是当我用 parallelStream 迭代一个列表时,我有时会发现这个异常:
java.lang.ClassCastException: class com.sun.jndi.ldap.LdapCtx cannot be cast to class org.springframework.ldap.core.DirContextAdapter (com.sun.jndi.ldap.LdapCtx is in module java.naming of loader 'bootstrap'; org.springframework.ldap.core.DirContextAdapter is in unnamed module of loader java.net.URLClassLoader @4f0f76b4)
我已将对象从 ContextMapper#mapFromContext 转换为 DirContextAdapter。 Spring-ldap 参考资料说如果我不更改 DirObjectFactory LdapContextSource,此方法应该 return DirContextAdapter 的一个实例。
我的代码类似于:
ldapTemplate.search(
query().base(groupName()).where("gidNumber").is(Long.toString(gid)),
(ContextMapper<GroupLdap>) ctx -> {
DirContextAdapter context = (DirContextAdapter) ctx;
return new GroupLdap(context, true);
})
我的应用程序是一个批处理,用于将数据从 SQL 数据库加载到 LDAP。我使用 spring-boot 和 spring-ldap.
我正在使用 spring-boot 2.1.4、OpenLdap 和 ORACLE 到 SQL-DB。并打开-jdk-zulu 11.
我的算法尝试使用其 gidNumber 在 ldap 上搜索一个组。当 运行 没有并行性 (stream.parallelStream) 时它工作正常。但是当我用 parallelStream() 迭代一个列表时,我有时会遇到一个 ClassCastException:
我设置了一个 ldap 池连接,但它不起作用。
我的代码类似于:
ldapTemplate.search(
query().base(groupName()).where("gidNumber").is(Long.toString(gid)),
(ContextMapper<GroupLdap>) ctx -> {
DirContextAdapter context = (DirContextAdapter) ctx;
return new GroupLdap(context, true);
})
groupName 是引用 "ou=groups,dc=fff,dc=br";
的名称gid是搜索到的组的gitNumber。
GroupLdap 是组在 LDAP 上的内部表示。
对于并行性,我有时会收到异常:
java.lang.ClassCastException: class com.sun.jndi.ldap.LdapCtx cannot be cast to class org.springframework.ldap.core.DirContextAdapter (com.sun.jndi.ldap.LdapCtx is in module java.naming of loader 'bootstrap'; org.springframework.ldap.core.DirContextAdapter is in unnamed module of loader java.net.URLClassLoader @4f0f76b4)
我已将对象从 ContextMapper#mapFromContext 转换为 DirContextAdapter。 Spring-ldap 参考资料说如果我不更改 DirObjectFactory LdapContextSource,此方法应该 return DirContextAdapter 的一个实例。
我们与团队确认,从 parallelStream()
更改为 stream()
解决了 ClassCastException
的问题。这绝对是一些 openJdk 缺陷。找不到任何相关内容:https://bugs.openjdk.java.net。一旦我重现孤立的问题,我将报告它。目前 parallelStream 并不总是有效(在少数设置上它在少数情况下不起作用)
我使用并且可以使用parallelStream:
Apache Maven 3.5.2 (138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T09:58:13+02:00) Maven home: C:\Program Files\apache-maven-3.5.2\bin.. Java version: 11.0.5, vendor: Oracle Corporation Java home: C:\Program Files\Java\jdk-11.0.5 Default locale: en_US, platform encoding: Cp1252 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Colleague has, and experiencing issue: Apache Maven 3.6.1 (d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T21:00:29+02:00) Maven home: C:\tools\ideaIU-2019.2.3.win\plugins\maven\lib\maven3 Java version: 13.0.2, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-13.0.2 Default locale: en_US, platform encoding: UTF-8 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"