gpt4 book ai didi

java - 通过服务器线程调用OSGi服务

转载 作者:行者123 更新时间:2023-12-01 13:52:20 26 4
gpt4 key购买 nike

我已经在 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 类扩展了一个处理套接字创建的线程。我想在激活器的启动函数中调用一个服务。非常感谢任何帮助。

最佳答案

如果我没看错的话,那么您仍然处于服务器端的 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 开发来说非常方便。

关于java - 通过服务器线程调用OSGi服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19874095/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com