2010年7月7日水曜日

eclipseでJBossを起動する際にportが使用済みでExceptionが発生した際の対応

eclipseで、JBossサービスを起動する際に、JBossが使用するportが既に、別のアプリケーションが使用している場合に、Exceptionが発生する。ひとまず、コマンドプロンプトからどのプロセスがportを使っているのかを調べて、該当のアプリケーションを終了させることで対処できた。その際の手順を記します。


1. コマンドプロンプトを使用して、portの使用状況を表示する。
> netstat -ano



Proto  Local Address          Foreign Address        State           PID
TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       2568
TCP    0.0.0.0:135            0.0.0.0:0              LISTENING       1108
TCP    0.0.0.0:443            0.0.0.0:0              LISTENING       2568
TCP    0.0.0.0:445            0.0.0.0:0              LISTENING       4
TCP    0.0.0.0:3389           0.0.0.0:0              LISTENING       1040
TCP    0.0.0.0:4352           0.0.0.0:0              LISTENING       4788
TCP    0.0.0.0:4353           0.0.0.0:0              LISTENING       4788
TCP    0.0.0.0:4355           0.0.0.0:0              LISTENING       4788
TCP    0.0.0.0:12345          0.0.0.0:0              LISTENING       224
TCP    0.0.0.0:64424          0.0.0.0:0              LISTENING       2568
TCP    127.0.0.1:1065         0.0.0.0:0              LISTENING       284
TCP    127.0.0.1:1098         0.0.0.0:0              LISTENING       4788
TCP    127.0.0.1:1098         127.0.0.1:1099         ESTABLISHED     2588
TCP    127.0.0.1:1099         127.0.0.1:1098         ESTABLISHED     2588
TCP    127.0.0.1:1112         127.0.0.1:1113         ESTABLISHED     2588
TCP    127.0.0.1:1113         127.0.0.1:1112         ESTABLISHED     2588


2. タスクマネージャの[プロセス]タブを表示させ、調べたポートのPIDと一致するイメージ名を調べる。そして、問題がなければ、プロセスを終了させる。
(今回の私のケースでは、Mozilla Thunderbirdがportを使用していたので、いったんメーラーを終了させました。)


3. JBossサービスを再起動する。

2010年7月6日火曜日

BigDecimalの計算について

JavaでBigDecimalのインスタンス生成時にコンストラクタに渡す引数によって、誤差が発生する場合がある。
  • BigDecimal value = new BigDecimal(0.0);
  • BigDecimal value = new BigDecimal("0.0");
このオブジェクトに0.1をfor文を使って10回加算する。

for (int i = 0; i < 10; i++)
value = value.add(mod);



この場合、変数modには、BigDecimalインスタンスを生成する際に、プリミティブか文字列かに応じて、0.1または、"0.1"を設定したBigDecimalのインスタンスを生成して設定する。そして、この処理を実行すると結果は以下の通りになる。また、ここでは記述していないが、double型で同様の加算処理を行った場合の結果も添えておく。
  • double : 0.9999999999999999
  • BigDecimal(プリミティブ) : 1.0000000000000000555111512312578270211815834045410156250
  • BigDecimal(String) : 1.0
doubleについては、明らかな計算誤差が出る。BigDecimalについては、四捨五入する桁数や、計算回数などに応じて誤差が出る可能性がある。Stringについては、理想の結果となっている。はっきりしたことは言えないが、BigDecimalを使うときにはStringに変換した方が良いということになるのかどうか。