我在OSGi中使用套接字完成了客户端服务器模型。我在服务器端有一个bundle,我的激活器类调用一个线程,它创建一个套接字并从客户端获取String数据。现在我想从服务器端调用服务,以便我可以发送此字符串进行一些处理。我该怎么做?
这是我在服务器端的Activator类
int serverport=5000;
Thread t;
public void start(BundleContext bundleContext) throws Exception {
Activator.context = bundleContext;
t = new StdServer(serverport,this);
t.start();
StdServer类扩展了一个处理套接字创建的线程。我想在激活器的启动功能中调用服务。非常感谢任何帮助。
答案 0 :(得分:1)
如果我正在读你,那么你仍然在服务器端的OSGi环境中以及如何使用在同一容器中运行的服务(如Karaf)。使用您的激活器,您可以通过上下文获取它,您尝试过吗?
使用Bnd Annotations的另一种方法是要求在容器中安装声明性服务。然后使用Bnd Annotations,您可以注释类似这样的类,其中'@Reference'将从容器中获得您需要的服务:
import java.util.Map;
import org.osgi.framework.BundleContext;
import aQute.bnd.annotation.component.Activate;
import aQute.bnd.annotation.component.Component;
import aQute.bnd.annotation.component.Deactivate;
import aQute.bnd.annotation.component.Reference;
//Doesn't have to be called Activator
@Component
public class Activator {
private BundleContext context;
private TheServiceINeed theServiceINeed;
@Activate
public void Activate(BundleContext context, Map<String, Object> props) {
this.context = context;
}
@Deactivate
public void Deactivate() {
this.context = null;
}
public TheServiceINeed getTheServiceINeed() {
return theServiceINeed;
}
//The Service to process my String
@Reference
public void setTheServiceINeed(TheServiceINeed theServiceINeed) {
this.theServiceINeed = theServiceINeed;
}
}
您是否正在使用BndTools来完成工作?如果你问我,OSGi开发非常方便。
答案 1 :(得分:0)
您可以使用getService()
获取服务引用,并将其作为新线程的构造函数参数。