0

我已经使用 OSGi 中的套接字完成了客户端服务器模型。我在服务器端有一个包,我的激活器类调用一个线程,该线程创建一个套接字并从客户端获取字符串数据。现在我想从服务器端调用一个服务,以便我可以发送这个字符串进行一些处理。我该怎么做?

这是我在服务器端的 Activator 类

int serverport=5000;
    Thread t;
    public void start(BundleContext bundleContext) throws Exception {
        Activator.context = bundleContext;
        t = new StdServer(serverport,this);
        t.start();

StdServer 类扩展了一个处理套接字创建的线程。我想在激活器的启动函数中调用一个服务。任何帮助都深表感谢。

4

2 回答 2

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 开发来说非常方便。

于 2013-11-09T10:48:29.413 回答
0

您可以获取服务引用getService()并将其作为新线程的构造函数参数。

于 2013-11-09T09:45:16.260 回答