名前解決

java.net.InetAddress のstaticメソッドを使う方法が手っ取り早い。しかしこの方法では、タイムアウト時間やリトライ回数、キャッシュや取ってくるレコード種別など、細かい制御をかけることができない。いやシステムプロパティである程度制御をかけられるなくもないけれど *1、コンテキストによって値を使い分けたい場合にはやっぱり困った事態になる。
こういうときにはJNDIのDNSサービスプロバイダの機能を使う。


ref http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/jndi/jndi-dns.html


なお、1.4.1あたりの時代は、反応の遅いDNSに立て続けに要求を投げると、正しい応答であるにも関わらず xid-mismatchをおこしていたり *2、また、XID用のshort型(16bit長)カウンタが回りに回って負数領域に突入すると、比較用のint型値にそのまま代入していたため、レスポンスのXIDと必ず不一致を起こしてやっぱり xid-mismatch になってたりした。そんなこんなで、なかなか面白いバグが満載で笑えたのだけれど、1.5の com.sun.jndi.dns.DnsClientのソースを見る限り、最近の版ではきちんと修正されているようだ。


*1:http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/net/properties.html

*2:UDPソケット一本で全部の要求・応答を捌いているにも関わらず、まだ応答が帰ってきてない要求の情報を保持していなかったため、Aの要求 -> Bの要求 -> Aの応答 といった状況になったとき、「なにこれなんか変な応答を受信したよ!」といって例外を吐いていた。おならぷぅ。