我想用同一个方法调用 3 个 Web 服务,每个结果都将设置在一个对象中,如下代码所示:
public Dossie procuraPorCPF(String cpf) {
Dossie dossie = new Dossie();
// first webservice call
dossie.setCnh(detectaClientCnh.verificaCNH(cpf));
// second webservice call
dossie.setFotoCnh(detectaClientCnhFoto.verificaFotoCNHPorCpf(cpf));
// third webservice call
dossie.setPm(consultaPMWService.getPMPorCPF(cpf).getProcuraPMPorCPFResult());
return dossie;
}
在上面的例子中,我调用了 3 个不同的 Web 服务,每个服务大约需要 5 秒,然后就不好继续这段代码了。我想知道同时调用 3 个网络服务的最佳方法是什么,以及如何使用此代码作为示例来做到这一点。我在这里搜索了一些文章甚至答案,但我不知道该怎么做。感谢您的耐心等待。
最佳答案
Java 中的并发性是通过 Thread
类处理的。 Thread
构造函数接受一个 Runnable
参数,其中包含要运行的 Thread
代码。当调用 start()
方法时,JVM 创建新线程并执行 Runnable
的 run()
方法中的代码。
由于 Runnable
仅具有单个抽象方法 run()
,因此您可以使用 lambda expression以获得更具可读性的代码。我在第一个调用中使用了传统语法,在另外两个调用中使用了 lambda 语法来演示这两种方法。
public Dossie procuraPorCPF(String cpf) {
Dossie dossie = new Dossie();
Thread[] threads = new Thread[3];
threads[0] = new Thread(new Runnable() {
@Override
public void run() {
dossie.setCnh(detectaClientCnh.verificaCNH(cpf));
}
};
threads[0].start();
threads[1] = new Thread(() ->
dossie.setFotoCnh(detectaClientCnhFoto.verificaFotoCNHPorCpf(cpf));
threads[1].start();
threads[2] = new Thread(() ->
dossie.setPm(consultaPMWService.getPMPorCPF(cpf).getProcuraPMPorCPFResult());
threads[2].start();
try {
threads[0].join();
threads[1].join();
threads[2].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
return dossie;
}
join()
方法会阻塞程序执行,直到调用的 Thread
完成运行。通过将 join()
放在方法的末尾,您可以保证在返回之前所有 3 个请求都已完成。如果这些请求在您返回之前是否完成并不重要,您只需删除 join()
即可,当应用程序的其余部分运行时,这些请求将在后台继续运行。
对于较大的应用程序,Java 还包括 thread pools它将为您管理Thread
的创建。由于您的应用程序仅在本地上下文中使用相同的 3 个 Runnable,因此我认为上面的解决方案更适合(并且对于此答案而言更具教育意义)。
关于java - 使用Java同时调用多个Web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51461491/