使用并行流和 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"