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();
    }
}