我正在面对此问题,在我的一个套件中使用ServerSocket
,我们只需将其称为:FooBundle。OSGi套接字:套件已停止,套接字仍然打开
This 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){
//........
}
}
正如你可以看到,这是一个简单的线程等待,直到它从一个接收消息的连接SocketClients是“再见”。
这是我面对现在的问题:当捆绑为停止,我确实需要重启整个OSGi框架:如果我试图重新启动包,一个java.net.BindException
消息抛出:“地址已在使用”。所以,我停止了捆绑,但套接字尚未关闭。
在OSGi中,您需要注意Activator
中的stop()
方法必须包含的内容,但我无法将任何匿名线程的引用传递给激活器。
试想一下,这是捆绑在我的类图:
**FooBundle**
|__FooBundleActivator
|__FooImpl
|__SocketListener (thread)
的SocketListener
线程从FooImpl
类称为一个匿名线程。
我的问题是:是否有任何适当的方法来控制匿名线程,特别是在我的情况下,非闭合套接字端口,在OSGi范例内?
在此先感谢。
只接收一个客户端的问题是由于伪代码,我的真实代码接受多个连接。非常感谢您的回答。不仅对于代码,而且对于建议。从彼得·克里恩斯那里得到答案真的很荣幸。谢谢! –