- PR -

webアプリケーションからのsocket

1
投稿者投稿内容
sa2sa2
会議室デビュー日: 2004/12/16
投稿数: 5
投稿日時: 2004-12-16 20:56
strutsを利用して、webサーバから別のサーバにsocketを用いて
通信を行うプログラムを作成したのですが、

動作としては、普通にアクセスすると別サーバからのメッセージが表示されます。

ただ、同時に複数のアクセスを実行すると、別サーバからのメッセージが表示されなくなってしまいます。

logを確認したところ、socket.close()が原因と思われる
socketExceptionが発生していた。
試しに、socket.close()を行わないように実施してみたところ
socketExceptionは発生しなくなったのですが
変なメッセージ(期待するメッセージの後の一部分)が表示されてしまいます。

socket.close()を実行すると、同サーバ上で実行中の他Javaアプリで使用している
socketまでクローズされてしまうものなのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-16 21:49
伺った現象から想像するに socket のインスタンスを共有しているのではないでしょうか?
インスタンスがスレッドセーフなスコープで生成されているか確認してみましょう。
sa2sa2
会議室デビュー日: 2004/12/16
投稿数: 5
投稿日時: 2004-12-16 22:21
私の知識不足なのかも知れませんが
StrutsのActionを使用しているので
スレッドセーフなインスタンスと思っていたのですが
違ったのでしょうか?

もしかして、<action-mapping>の<scope>の属性が
間違っているとのご指摘なのでしょうか?
<scope>属性は、requestになっています。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-17 01:30
>スレッドセーフなインスタンスと思っていたのですが
>違ったのでしょうか?
わからなければ質問する前に実験してみましょう!
コンストラクタにデバッグ文を入れればわかりますよね?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-17 01:36
別の切り分け方法としては、netstat を使う方法もあります。
セッションの数を数えることでもソケットのインスタンスがいくつあるか想像することができますね。
sa2sa2
会議室デビュー日: 2004/12/16
投稿数: 5
投稿日時: 2004-12-17 11:11
socketを開く際に、Localのportを確認(getLocalport())していたのですが
それぞれ違ったportを用いて接続していることは確認していました。

このような状態でしたので、要求分のインスタンスがあると思っていました。


netstatを用いて確認したところ、要求接続数分のセッションがあるのは確認できました。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-17 12:59
なるほど。すると Action のインスタンス変数にマルチスレッドで代入していたので race condition でおかしな挙動になったんでしょうね。
そのリクエストのスコープで利用するオブジェクトはメソッドローカルの変数で参照しましょう。
sa2sa2
会議室デビュー日: 2004/12/16
投稿数: 5
投稿日時: 2004-12-17 21:19
原因と思われるメソッドの場所にて、「synchronized」を用いてみたところ
Exceptionは発生しなくなりましたので、やはりご指摘の通り
マルチスレッドの問題の様でした。
1

スキルアップ/キャリアアップ(JOB@IT)