Trouble 19: その他の問題
<Q19-1>Sunが公開しているftpクラスで複数ファイルを転送しようとすると例外が発生します。
| <発生環境> |
| OS |
Linux |
| JDK |
JDK1.3 |
| Vender |
Sun |
- <A19-1>
- Sunの公開しているftpクラスが、ファイル転送後にsocketをクローズしていないのが原因です。logoff(bye)をすればsocketはクローズされるため、不具合ではなく、仕様である可能性もあります。
なお、このftpクラスはSunが参考のために公開していたクラスのため、Sunのサポート対象外となっています。
現在、この不具合(?)が直っているかどうかは不明です。
<Q19-2>JUnitを利用する際、テストケースコンパイル時にメソッドassert()において警告が発生します。
テストケースコンパイル時に警告が発生します。以下はその例。
警告: リリース 1.4 では assert はキーワードなので識別子として使うことはできません。
assert(true);
^
注: JunitAssert.java は推奨されない API を使用またはオーバーライドしています。
注: 詳細については、-deprecation オプションを指定して再コンパイルしてください。
警告 1 個
| <発生環境> |
| OS |
any |
| JDK |
JDK1.4.0 |
| Vender |
any |
- <A19-2>
- JDK1.4から「assert」が予約語になりました。したがって、「assert」という文字列は識別子として利用する事ができません。
assert()ではなく、assertTrue()を利用してください。(JUnit3.7APIのjunit.framework.Assertクラスを参照)
<Q19-3>Tomcat5上でcommons-loggingを使ったウェブアプリケーションのデプロイが例外発生して失敗してしまいます。
Tomcat5上でcommons-loggingを使ったウェブアプリケーションを読み込むとNullPointerExceptionが発生してデプロイ終了してしまう場合があります。
| <発生環境> |
| JDK |
1.5.0 |
| Tomcat |
5.5 |
- <A19-3>
- これはcommons-loggingのVersion 1.1を利用している場合に発生する問題です。
commons-loggingのClass Loaderの問題で発生します。
これを回避するためには、commons.loggingのVersionを1.0.4に変更する必要があります。
参考URL:
https://issues.apache.org/bugzilla/show_bug.cgi?id=39631
参考)
以下のエラーメッセージは、commons.loggingとLog4jをTomcatで利用した場合の
スタックトーレスの出力例です。
java.lang.NullPointerException
at org.apache.log4j.Category.isEnabledFor(Category.java:746)
at org.apache.commons.logging.impl.Log4JLogger.isTraceEnabled
(Log4JLogger.java:327)
at org.apache.catalina.startup.TldConfig.tldScanResourcePaths
(TldConfig.java:581)
==== 以下省略 ====
<Q19-4>Jakarta Commons HttpClientをマルチスレッド環境で利用時に想定よりもパフォーマンスが向上しません。
Jakarta Commons HttpClientをマルチスレッド環境で利用時に想定よりもパフォーマンスが向上しません。
※Java SE 5 で動作確認を行いました。
| <発生環境> |
| OS |
Windows XP |
| JDK |
any |
- <A19-4>
- HttpClientをマルチスレッドで効率よく利用するには、実は、
一般に知られている実装方法とはことなる実装に切り替える必要があります。
Webや雑誌などのチュートリアル記事などで広く紹介されているHttpClientの利用方法
(以下、デフォルト版) は、シングルスレッド環境を想定した利用方法になっています。
マルチスレッド環境に適した方法でHttpClientを利用をするためには、
次のような実装 (以下、マルチスレッド版) にする必要があります。
1.接続マネージャをデフォルト版からマルチスレッド版のMultiThreadedHttpConnectionManagerに変更する。
2.クライアントインスタンスを複数スレッドで共有する。
3.同一ホストへの同時接続数をデフォルト値(2)から変更する。
当社の検証環境では、マルチスレッド版では、デフォルト版の2倍以上のスループットが計測されました。
参考)
・HTTPClientのコネクションプーリングは、接続するHTTPサーバがkeep-aliveに
対応していることが前提となっています。
・デフォルト版のコネクションプーリングでは、直前の1コネクションのみを
プーリングする実装になっています。
このため、複数のホストに交互に接続する利用方法では、
コネクションプーリングが有効に働きません。
(例)
1.ホストAへリクエスト送信
2.ホストBへリクエスト送信
3.ホストAへリクエスト送信 ...
そこで、複数のホストへの接続を行うアプリケーションにおいて、
コネクションプーリングを有効活用するためには、シングルスレッドであっても
マルチスレッド版と同じ実装をする必要があります。
この記事の詳細な情報をJTSメールマガジンにて配信しています。
情報を取得したい方は、メールマガジンのバックナンバーを参照して下さい。
注意:本文書の内容に誤りがあり、またこの文書によって不利益を被っても、
Acroquest Technology 株式会社は一切関知いたしません。