- - PR -
webアプリケーションからのsocket
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2004-12-16 20:56
strutsを利用して、webサーバから別のサーバにsocketを用いて
通信を行うプログラムを作成したのですが、 動作としては、普通にアクセスすると別サーバからのメッセージが表示されます。 ただ、同時に複数のアクセスを実行すると、別サーバからのメッセージが表示されなくなってしまいます。 logを確認したところ、socket.close()が原因と思われる socketExceptionが発生していた。 試しに、socket.close()を行わないように実施してみたところ socketExceptionは発生しなくなったのですが 変なメッセージ(期待するメッセージの後の一部分)が表示されてしまいます。 socket.close()を実行すると、同サーバ上で実行中の他Javaアプリで使用している socketまでクローズされてしまうものなのでしょうか? |
|
投稿日時: 2004-12-16 21:49
伺った現象から想像するに socket のインスタンスを共有しているのではないでしょうか?
インスタンスがスレッドセーフなスコープで生成されているか確認してみましょう。 |
|
投稿日時: 2004-12-16 22:21
私の知識不足なのかも知れませんが
StrutsのActionを使用しているので スレッドセーフなインスタンスと思っていたのですが 違ったのでしょうか? もしかして、<action-mapping>の<scope>の属性が 間違っているとのご指摘なのでしょうか? <scope>属性は、requestになっています。 |
|
投稿日時: 2004-12-17 01:30
>スレッドセーフなインスタンスと思っていたのですが
>違ったのでしょうか? わからなければ質問する前に実験してみましょう! コンストラクタにデバッグ文を入れればわかりますよね? |
|
投稿日時: 2004-12-17 01:36
別の切り分け方法としては、netstat を使う方法もあります。
セッションの数を数えることでもソケットのインスタンスがいくつあるか想像することができますね。 |
|
投稿日時: 2004-12-17 11:11
socketを開く際に、Localのportを確認(getLocalport())していたのですが
それぞれ違ったportを用いて接続していることは確認していました。 このような状態でしたので、要求分のインスタンスがあると思っていました。 netstatを用いて確認したところ、要求接続数分のセッションがあるのは確認できました。 |
|
投稿日時: 2004-12-17 12:59
なるほど。すると Action のインスタンス変数にマルチスレッドで代入していたので race condition でおかしな挙動になったんでしょうね。
そのリクエストのスコープで利用するオブジェクトはメソッドローカルの変数で参照しましょう。 |
|
投稿日時: 2004-12-17 21:19
原因と思われるメソッドの場所にて、「synchronized」を用いてみたところ
Exceptionは発生しなくなりましたので、やはりご指摘の通り マルチスレッドの問題の様でした。 |
1