我在使用ServerSocket
其中一个捆绑包时遇到了这个问题,我们称之为:FooBundle。
这个FooBundle有一个SocketListener.java
类。这个类是一个线程,为了对它做一个简单的概述,我将粘贴一些伪代码:
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){
//........
}
}
正如你所看到的,它是一个简单的线程,它等待连接,直到它从一个SocketClient接收到的消息是"bye"。
这是我现在面临的问题:当 Bundle停止时,我确实需要重新启动整个OSGi 框架:如果我尝试重新启动包,java.net.BindException
则会抛出一条消息:“地址已在使用中”。所以,我停止了捆绑,但套接字还没有关闭。
在 OSGi 中,您需要注意必须包含的stop()
方法中的内容Activator
,但我无法将匿名线程的任何引用传递给 Activator。
想象一下,这是我在包中的类图:
**FooBundle**
|__FooBundleActivator
|__FooImpl
|__SocketListener (thread)
该线程作为匿名线程SocketListener
从类中调用。FooImpl
我的问题是:在 OSGi 范式中,是否有任何适当的方法可以控制匿名线程,特别是在我的情况下,控制非关闭套接字端口?
提前致谢。