Java web应用程序上的线程ldap修改

Java web应用程序上的线程ldap修改,java,spring,web-applications,ldap,spring-batch,Java,Spring,Web Applications,Ldap,Spring Batch,我有一个web应用程序,它每天对ldap数据库进行搜索。这是通过SpringLDAP库在计划任务上完成的。此搜索将返回大约20000个结果。然后我希望修改所有这些用户的一个属性,这就是问题的开始。我真的希望有一个组修改函数,就像在关系数据库中一样,您可以这样做(设置a=x,其中b 因此,我尝试了两种方法: 对每个用户进行循环,并执行如下操作: DistinguishedName userDn = buildDn(user); DirContextOperations dtCtx = ldap

我有一个web应用程序,它每天对ldap数据库进行搜索。这是通过SpringLDAP库在计划任务上完成的。此搜索将返回大约20000个结果。然后我希望修改所有这些用户的一个属性,这就是问题的开始。我真的希望有一个组修改函数,就像在关系数据库中一样,您可以这样做(设置a=x,其中b 因此,我尝试了两种方法:

对每个用户进行循环,并执行如下操作:

DistinguishedName userDn = buildDn(user);
  DirContextOperations dtCtx = ldapTemplate.lookupContext(userDn);

  for(int i = 0; i < attributes.length; i++){
      dtCtx.setAttributeValue(attributes[i], values[i]);
  }
  ldapTemplate.modifyAttributes(dtCtx);
distrignedname userDn=buildDn(用户);
DirContextOperations dtCtx=ldapTemplate.lookupContext(userDn);
for(int i=0;i
这是可行的,但非常耗时

第二种方法与第一种方法相同,但是切掉用户列表并多线程修改。这种方法工作得更快,但仍然不能很好地扩展。ldap是一个opends数据存储


是否有更好的方法从web应用程序对ldap进行批修改?

您可以查看一个
Spring批处理
模式,其中建立了所有用户的单个列表,然后使用线程池将每个用户传递、修改并提交到ldap服务器

配置可能如下所示

<batch:job id="ldapJob">
    <batch:step id="ldapJob.step1">
        <batch:tasklet task-executor="taskExecutor">
            <batch:chunk reader="ldapReader" processor="ldapModifier" writer="ldapWriter" commit-interval="1"/>
        </batch:tasklet>
    </batch:step>
</batch:job>

<task:executor id="taskExecutor"/>

像这样的读者

package de.incompleteco.spring.batch.item.reader;

import java.util.Queue;

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.ldap.core.DirContextOperations;

public class LdapItemReader implements ItemReader<DirContextOperations> {

    private Queue<DirContextOperations> dirContextOperations;

    public DirContextOperations read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        if (dirContextOperations == null) {
            synchronized (this) {
                //load up the dirContextOperations into the queue
            }//end synch
        }//end if
        //retrieve
        return dirContextOperations.poll();
    }

}
package de.incompleteco.spring.batch.item.reader;
导入java.util.Queue;
导入org.springframework.batch.item.ItemReader;
导入org.springframework.batch.item.NonTransientResourceException;
导入org.springframework.batch.item.ParseException;
导入org.springframework.batch.item.UnexpectedInputException;
导入org.springframework.ldap.core.DirContextOperations;
公共类LdapItemReader实现ItemReader{
私有队列dirContextOperations;
public DirContextOperations read()引发异常、UnexpectedInputException、ParseException、NontTransientResourceException{
if(dirContextOperations==null){
已同步(此){
//将dirContextOperations加载到队列中
}//结束同步
}//如果结束
//取回
返回dirContextOperations.poll();
}
}
处理器

package de.incompleteco.spring.batch.item.processor;

import org.springframework.batch.item.ItemProcessor;
import org.springframework.ldap.core.DirContextOperations;

public class LdapItemProcessor implements ItemProcessor<DirContextOperations, DirContextOperations> {

    public DirContextOperations process(DirContextOperations item) throws Exception {
        //do some update
        item.setAttributeValue(null, null);
        //return
        return item;
    }

}
package de.incompleteco.spring.batch.item.processor;
导入org.springframework.batch.item.ItemProcessor;
导入org.springframework.ldap.core.DirContextOperations;
公共类LdapiTempProcessor实现ItemProcessor{
公共DirContextOperations进程(DirContextOperations项)引发异常{
//做一些更新
item.setAttributeValue(null,null);
//返回
退货项目;
}
}
最后是ldap服务器的写入程序

package de.incompleteco.spring.batch.item.writer;

import java.util.List;

import org.springframework.batch.item.ItemWriter;
import org.springframework.ldap.core.DirContextOperations;
import org.springframework.ldap.core.LdapTemplate;

public class LdapItemWriter implements ItemWriter<DirContextOperations> {

    private LdapTemplate ldapTemplate;

    public void write(List<? extends DirContextOperations> items) throws Exception {
        for (DirContextOperations operation : items) {
            ldapTemplate.modifyAttributes(operation);
        }
    }

    public void setLdapTemplate(LdapTemplate ldapTemplate) {
        this.ldapTemplate = ldapTemplate;
    }

}
package de.incompleteco.spring.batch.item.writer;
导入java.util.List;
导入org.springframework.batch.item.ItemWriter;
导入org.springframework.ldap.core.DirContextOperations;
导入org.springframework.ldap.core.LdapTemplate;
公共类LdapItemWriter实现ItemWriter{
私有LdapTemplate LdapTemplate;

public void write(list)非常感谢!我要试试这个。我不知道spring批处理库。目前我正在用java executor管理它。这个看起来好多了。谢谢。