怎样在网上做网站,网站开发免费课程,做调查的网站推荐,广告传媒公司黄页最近#xff0c;我们正在开发一个监控仪表板#xff0c;我们想要ping几个第三方服务器#xff0c;只是为了检查它们的可用性#xff0c;或者我们想要调用健康检查。我们正在对服务器进行一系列api调用#xff0c;这些服务器的IP#xff0c;用户名和密码被外部化为环境变量…最近我们正在开发一个监控仪表板我们想要ping几个第三方服务器只是为了检查它们的可用性或者我们想要调用健康检查。我们正在对服务器进行一系列api调用这些服务器的IP用户名和密码被外部化为环境变量。然后是我们的负载均衡器抛出HTTP 504(网关超时)的挑战因为这些请求花了很多时间来返回结果。因此我们继续使用Callable和Future同时进行这些调用以减少所需的时间。在开发多线程应用程序的传统方式中我们创建线程并为其提供Runnable任务。Callable与Runnable非常相似它有一个细微的区别它可以返回结果或抛出异常而Runnable的run方法的返回类型为void。Runnable runnable new Runnable() {Overridepublic void run() {// this can neither return the result nor throw an exception}}但是Callable可以返回任务的结果并且可以抛出异常。您也可以指定结果类型。为简单起见我把它作为String但只要call()方法返回它它就可以是任何复杂的对象。Callable callable new Callable() {Overridepublic String call() throws Exception {return this can return output OR can throw Exception;}};既然您有Callable或任务您需要能够运行该任务以获得输出。您可以使用ExecutorService使用它的submit()方法运行任务或使用invokeAll()运行多个任务 您可以在其中提交可调用任务的集合。现在是有趣的部分submit()的返回类型是Future 其中T是输出(String如上例所示)invokeAll()的返回类型是List Future表示异步计算的结果。Java提供了检查计算是否完成等待它完成或从中检索结果的方法。(它非常类似于javascript承诺如果这使它易于理解)。因此为了获得未来的结果我们只需要调用get()就可以了ExecutorService executorService Executors.newFixedThreadPool(10);// callable from above codeFuture future executorService.submit(callable);String output future.get();下面是完整代码public class HealthCheckService {private HttpHandler httpHandler;private Config config;private ExecutorService executor;public HealthCheckService(HttpHandler httpHandler,Config config) {this.httpHandler httpHandler;this.configuration configuration;int size config.servers.size();this.executor Executors.newFixedThreadPool(size);}public List getHealthCheck() throws Exception {List tasks prepareTasks(config.uri);List futures executor.invokeAll(tasks);List output new ArrayList();for (Future future: futures) {output.add(future.get());}return output;}private List prepareTasks(String api) {List tasks new ArrayList();for (String server: config.servers) {tasks.add(() - httpHandler.getStatus(api));}return tasks;}}