Java web应用程序上的线程ldap修改
我有一个web应用程序,它每天对ldap数据库进行搜索。这是通过SpringLDAP库在计划任务上完成的。此搜索将返回大约20000个结果。然后我希望修改所有这些用户的一个属性,这就是问题的开始。我真的希望有一个组修改函数,就像在关系数据库中一样,您可以这样做(设置a=x,其中b 因此,我尝试了两种方法: 对每个用户进行循环,并执行如下操作: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
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管理它。这个看起来好多了。谢谢。