ExecutorService フレームワークを使用していくつかの DNS タスクを解決したいと考えています。私は DNS クエリに Java API を使用します: 1/ java.net.InetSocketAddress.InetSocketAddress(String, int) - 名前検索 2/ java.net.InetAddress.getByName(String) - 名前検索() - 名前の逆引き
典型的な DNS タスクは、次のように定義された Callable オブジェクトになります。
public class IpAddressResolver extends DnsCallable<String, InetAddress> {
public IpAddressResolver(String host) {
super(host);
}
public InetAddress call() throws Exception {
return InetAddress.getByName(target);
}
}
ご覧のとおり、これら 3 つの呼び出しはすべて中断できません。問題は、Future.get(long, TimeUnit)
タイムアウトしてから呼び出した場合Future.cancel(boolean)
、ワーカー スレッドが DNS タスクを解決しようとするのを止める機会がないことです ( 実行時間の長い DNS クエリをシミュレートするために、Linuxファイルtimeout:30
を使用してテストしました)。attempts:5
resolv.conf
この結果、現在実行中のワーカー スレッドを停止できない場合、別の DNS タスクを送信すると、2 番目のスレッドを作成する必要があり、3 番目のタスクには 3 番目のスレッドを作成する必要があります。DNS サーバーが応答しない場合、プール内に何もしないワーカー スレッドが多数存在します (つまり、タイムアウト * 試行 = 150 秒後に返される否定的な DNS 応答を待機します)。
多くのスレッドが作成され、スレッドプールでアクティブになっている場合(キャッシュされたスレッドプールを使用しています)、別の種類の問題に対処する必要があるのではないかと心配しています...
割り込み不可能なブロッキング ソケット読み取り呼び出しは、基になるソケットを閉じることで停止できることはわかっていますが、私の場合はそうではありません。
この種の問題に対処する方法を知っている人はいますか?