Java 来自ExecutorService的未来返回值
各位程序员好 我目前正在从一位为我们公司工作的用户那里检索信息Java 来自ExecutorService的未来返回值,java,multithreading,ldap,Java,Multithreading,Ldap,各位程序员好 我目前正在从一位为我们公司工作的用户那里检索信息 public class SCD_Checker { private final ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); private String mail = ""; private String stat; private Conn
public class SCD_Checker {
private final ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private String mail = "";
private String stat;
private Connection conn = new Connection();
SCD_Checker() {
conn.setProvider("ADsDSOObject");
conn.Open("Active Directory Provider", "", "", 0);
}
private void ldap_call(String email) {
this.mail = email;
Command objCmd = new Command();
Recordset RS = new Recordset();
objCmd.setActiveConnection(conn);
String searchKeyword = "contractstatus";
objCmd.setCommandText("XXX:LDAP_CONN)(mail=" + email + "));" + searchKeyword + ";subTree");
RS = objCmd.Execute();
if (RS.getBOF()) this.stat = "Not in SCD";
else {
RS.MoveFirst();
Variant value = RS.getFields().getItem(0).getValue();
if (value.getString().equals("R")) this.stat = "Retired";
else if (value.getString().equals("A")) this.stat = "Active";
else if (value.getString().equals("null")) this.stat = "Not in SCD";
}
}
public void submit_task(String email) {
this.service.submit(() -> ldap_call(email));
}
public String getMail() {
return this.mail;
}
public String getStat() {
return this.stat;
}
public void shutdown_and_close() throws InterruptedException {
this.service.shutdown();
this.service.awaitTermination(1, TimeUnit.MINUTES);
this.conn.Close();
}
}
这是我到目前为止一直在使用的代码,问题是我似乎构建了错误的代码,因为如果我试图从stat变量中创建未来,我无法保存Variant value=RS.getFields.getItem0.getValue返回的值;在stat变量中。将其作为字符串变量保留时,我可以轻松地将结果写入csv文件。但是我需要返回一个带有Email+状态的字符串
在我的架构中似乎有一些错误,但我似乎不知道如何修复当前程序以正确返回值,因为没有函数返回值
有人知道我需要如何改变架构吗
就我所看到的类似问题而言,我可能会使用可调用函数,但无法让它从ldap_call函数中获取值,我认为您需要调整您的体系结构 如果希望从Java函数返回多个值,可以 创建一个Assembly类,在这里您可以创建一个WorkerData 包含统计数据和电子邮件:
public class WorkerDTO {
private String email;
private String stat;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getStat() {
return stat;
}
public void setStat(String stat) {
this.stat = stat;
}
}
您应该提取一个可调用的类,该类接受电子邮件并
返回工作地点:
public class CheckStatusCallable implements Callable<WorkerDTO> {
private Connection connection;
private String email;
public CheckStatusCallable(Connection connection, String email) {
this.connection = connection;
this.email = email;
}
@Override
public WorkerDTO call() throws Exception {
Command objCmd = new Command();
Recordset RS = new Recordset();
objCmd.setActiveConnection(conn);
String searchKeyword = "contractstatus";
objCmd.setCommandText("XXX:LDAP_CONN)(mail=" + this.email + "));" + searchKeyword + ";subTree");
RS = objCmd.Execute();
WorkerDTO workerDTO = new WorkerDTO();
workerDTO.setEmail(this.email);
workerDTO.setEmail(e);
if (RS.getBOF()) workerDTO.setStat("Not in SCD");
else {
RS.MoveFirst();
Variant value = RS.getFields().getItem(0).getValue();
if (value.getString().equals("R")) workerDTO.setStat("Retired");
else if (value.getString().equals("A")) workerDTO.setStat("Active");
else if (value.getString().equals("null")) workerDTO.setStat("Not in SCD");
}
return workerDTO;
}
}
测试它是否与以下设备一起工作:
public class Test {
public static void main(String[] args) {
SCD_Checker checker = new SCD_Checker();
Future<WorkerDTO> workerDTOFuture = checker.submit_task("test@test.com");
WorkerDTO workerDTO = workerDTOFuture.get();
String email = workerDTO.getEmail();
String stat = workerDTO.getStat();
}
}
为什么要使用mail和stat作为全班的共享字段?到目前为止真的有效吗?
public class Test {
public static void main(String[] args) {
SCD_Checker checker = new SCD_Checker();
Future<WorkerDTO> workerDTOFuture = checker.submit_task("test@test.com");
WorkerDTO workerDTO = workerDTOFuture.get();
String email = workerDTO.getEmail();
String stat = workerDTO.getStat();
}
}