2009-03-19 15 views
2

Tomcatアプリケーションを作成しています。その機能の一部として、特定のイベントが発生したときにUDPマルチキャストを送信する必要があります。今、私のコードは次のようなものを(ホストおよびグループは、偽の、例外処理は、スペースを節約するためにリッピングされている)行く:Tomcatのソケットにバインドする

import java.net.*; 
/* ..... */ 
DatagramSocket socket = new DatagramSocket(12345); 
InetAddress group = InetAddress.getByName("111.222.333.444"); 
DatagramPacket packet = new DatagramPacket(buf, buf.length, group, 12346); 
socket.send(packet); 

私はTomcatの中にそれをインストールすると、これが正常に動作します。しかし、新しいバージョンのアプリケーションをインストールしようとすると(「ant remove; ant install;」を使用して)、ソケットにバインドできず、java.net.BindException: Address already in useを取得します。唯一の方法は毎回Tomcatを再起動することですが、これは明らかに受け入れられません。 Tomcatにやさしい方法でソケットを使用するには?

ピートの答えあたりの明確化のカップル:私はソケットを閉じない

。それはシングルトンに住んでいます。 Singletonへのソケットを閉じてサーブレットの破壊を呼び出すメソッドを追加しました。ありがとうございました!それはちょっとハッキーですが、私は(公共の方法でそのような方法を世界に公開する)と思っていますが、それは仕事を完了させます。

+0

destroy()に追加したばかりの場合、サーブレットコンテナだけがそれを呼び出すことができます(webappのユーザーの場合のようにpublicではない)ので、ハッキーではありません。 – Peter

答えて

1

disconnect()/ close()で使用した後でソケットを閉じていますか?ソケットのライフサイクルは何ですか?要求ごとに、またはシングルトンでは何ですか?要求ごとにある場合は、ソケットを閉じると解放されます。シングルトンの場合、 "ant remove"で何とか閉じなければならない - Tomcatのシャットダウン/再起動が受け入れられない場合、おそらくあなたのantスクリプトはソケットを閉じる安全なページなどを呼び出すことができる。シャットダウン再起動が発生する可能性がある場合は、サーブレットのdestroy()メソッドでソケットを閉じます。

関連する問題