java - 并行迭代for循环中的所有机器并检查它们是向上还是向下?
问题描述
我有一个机器列表ArrayList
。我正在检查所有这些机器是否都已启动,因此我正在对它们进行 http 调用,如果它们响应则它们已启动,但如果它们没有响应则它们已关闭。如果他们重试 10 次没有响应,我认为他们死了,这意味着如果他们没有响应,我会重试每台机器 10 次。
现在我需要hostnames
在 for 循环中并行迭代该列表,所以我想出了下面的代码。是否有任何多线程问题或任何可以改进的地方?我在这里正确使用执行者服务吗?
private static final ExecutorService executorService = Executors.newFixedThreadPool(20);
public static void main(String[] args) throws Exception {
List<String> hostnames = new ArrayList<>();
//.. populating hostnames
List<Future<Void>> futures = new ArrayList<Future<Void>>();
for (final String machine : hostnames) {
Callable<Void> callable = new Callable<Void>() {
public Void call() throws Exception {
String url = "http://" + machine + ":8080/ruok";
if (!checkServer(url)) {
System.out.println("server down: " + machine);
}
return null;
}
};
futures.add(executorService.submit(callable));
}
executorService.shutdown();
for (Future<Void> future : futures) {
future.get();
}
System.out.println("All done!");
}
private static boolean checkServer(final String url) {
boolean isUp = false;
int retry = 10;
for (int i = 1; i <= retry; i++) {
try {
RestClient.getInstance().getClient().getForObject(url, String.class);
isUp = true;
break;
} catch (Exception ex) {
// log exception
}
}
return isUp;
}
解决方案
推荐阅读
- r - 错误:连接到互联网时,如果没有互联网,天桥查询不可用
- php - 如何防止 Laravel 应用程序文件夹被搜索引擎索引
- slack - slack huddle 没有突然出现
- flutter - Flutter 中的 SearchDelegate:在 null 上调用了“where”方法
- html - 如何在引导手风琴的标题上添加按钮,以便单击它不会折叠或展开它?
- html - 反应性 R 闪亮与 HTML:NA 值保存问题
- ruby-on-rails - Rails 按键分组哈希数组
- nginx - ECS Nginx 网络设置
- java - 如果某个函数参数接收到 List
- > nums ,那么 nums 是用 LinkedList 还是 ArrayList 实例化的?
- reactjs - 如何导航到新页面/组件?反应聊天机器人