具有并行流和LdapTemplate

时间:2019-05-10 18:48:45

标签: java spring-boot spring-ldap pooling

我遇到问题,尝试使用具有并行性的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,则此方法应返回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,则此方法应返回DirContextAdapter的实例。

1 个答案:

答案 0 :(得分:0)

我们与团队确认,将stream()更改为parallelStream()可解决ClassCastException的问题。肯定是一些openJdk缺陷。找不到与https://bugs.openjdk.java.net相关的任何内容。重现孤立的问题后,我将进行报告。目前,parallelStream并不总是能正常工作(在少数几个设置上它不能正常工作)

我使用并可以使用parallelStream:

Apache Maven 3.5.2(138edd61fd100ec658bfa2d307c43b76940a5d7d; 2017-10-18T09:58:13 + 02:00) Maven主页:C:\ Program Files \ apache-maven-3.5.2 \ bin .. Java版本:11.0.5,供应商:Oracle Corporation Java主页:C:\ Program Files \ Java \ jdk-11.0.5 默认语言环境:en_US,平台编码:Cp1252 操作系统名称:“ windows 10”,版本:“ 10.0”,拱门:“ amd64”,家族:“ windows”

同事有并且遇到问题: Apache Maven 3.6.1(d66c9c0b3152b2e69ee9bac180bb8fcc8e6af555; 2019-04-04T21:00:29 + 02:00) Maven主页:C:\ tools \ ideaIU-2019.2.3.win \ plugins \ maven \ lib \ maven3 Java版本:13.0.2,供应商:Oracle Corporation,运行时:C:\ Program Files \ Java \ jdk-13.0.2 默认语言环境:en_US,平台编码:UTF-8 操作系统名称:“ windows 10”,版本:“ 10.0”,拱门:“ amd64”,家族:“ windows”