バンドルの内部でこの問題に直面しています。それをFooBundleServerSocket
と呼びましょう。
このFooBundleには、特にSocketListener.java
クラスがあります。このクラスは Thread です。その概要を少し説明するために、いくつかの擬似コードを貼り付けます。
public class SocketListener implements Runnable{
ServerSocket providerSocket;
Socket connection = null;
private boolean closeIt = false;
public void run() {
try {
//Create the server socket
providerSocket = new ServerSocket(41000, 10);
} catch (IOException e1) {
//catching the exception....
}
while(!closeIt){
try{
connection = providerSocket.accept();
in = new Scanner(new InputStreamReader(onnection.getInputStream()));
while(in.hasNext() !=false)
message = message + " "+in.next();
// bla bla bla...
} catch (IOException e) {
//bla bla...
}
finally{
try{
if (message.equalsIgnoreCase("bye"))
providerSocket.close();
closeIt = true;
}
catch(IOException ioException){
//........
}
}
ご覧のとおり、これはSocketClientsの 1 つから受信したメッセージが"bye"になるまで接続を待機する単純なスレッドです。
これは私が今直面している問題です: バンドルが停止した場合、 OSGi フレームワーク全体を再起動する必要があります: バンドルを再起動しようとすると、 「アドレスは既に使用されています」というメッセージがスローされます。そのため、バンドルを停止しましたが、ソケットは閉じられていません。java.net.BindException
stop()
OSGi では、メソッド内のメソッドに何をActivator
含める必要があるかを考慮する必要がありますが、匿名スレッドの参照をアクティベーターに渡すことはできません。
これがバンドル内の私のクラス図であると想像してください:
**FooBundle**
|__FooBundleActivator
|__FooImpl
|__SocketListener (thread)
スレッドはクラスから匿名スレッドSocketListener
として呼び出されます。FooImpl
私の質問は次のとおりです。OSGiパラダイム内で、匿名スレッド、特に私の場合、閉じていないソケットポートをそのように制御する適切な方法はありますか?
前もって感謝します。