在很多时候,我们都需要搭建一个通用的动态的平台,就是说在以后的扩展当中不需要修改任何的代码就达到动态的扩展一个功能或者是一个服务,然而在OSGI环境下很容易做到这一点,下面来说说怎么实现:
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi</artifactId>
<version>3.0.0</version>
</dependency>
1、首先我们创建一个服务注册的类,这个类继承org.osgi.service.cm的ManagedServiceFactory接口,ManagedServiceFactory这个接口里面有两个方法,
updated:这就是当在容器中监听到有变化,那么马上进行改变,比如,当我们添加一个bundle,更新一个bundle,增加一个配置文件cfg,更新配置文件里面的内容,都会执行改方法,然而,我们可以重写这个方法来实现我们自己所希望的功能,就好像上面说的动态服务都可以在此实现。
deleted:这方法刚好跟update方法相反。
public class RegisterService implements ManagedServiceFactory{
private static final Logger LOG = LoggerFactory.getLogger(RegisterService.class);
private static Map<String, ServiceRegistration> existingServices = new HashMap<>();
private static Map<String, ServiceRegistration> updateStatusServices = new HashMap<>();
private static Map<String, String> PidNameMap = new HashMap<>();
private static Map<String, String> PidGWNameMap = new HashMap<>();
private BundleContext context;
private IPaymentOrdersDALService paymentOrderDALService;
public BundleContext getContext() {
return context;
}
@Override
public String getName() {
return "PaymentGateWay";
}
@Override
public void updated(String pid, Dictionary dictionary) throws ConfigurationException {
String name = null;
if (dictionary == null) {
LOG.warn("文件中属性为空,无法创建服务");
return;
}
//注册网关服务
registerGWService(pid, dictionary);
//注册回调服务
registerCallBackService(pid, dictionary);
}
/**
* 注册网关服务
* @param pid
* @param dctnr
*/
private void registerGWService(String pid, Dictionary dctnr){
Object gwNameObj = dctnr.get("gwName");
Object gwServiceNameObj = dctnr.get("gwServiceName");//网关服务实例
String gwName;//网关名称,用于创建实例,如:com.payment.lklk.paygw.abc.AbcProcessor
String gwServiceName;//服务名称,用于发布服务,如:jmust/abc,"/"后面是网关名称
if (null == gwNameObj || null == gwServiceNameObj) {
LOG.warn("文件中gwName参数或gwServiceName参数没有配置,无法创建服务!");
return;
} else if ("".equals(gwNameObj.toString()) || "".equals(gwServiceNameObj.toString())) {
LOG.warn("文件中gwName参数或gwServiceName为空,无法创建服务!");
return;
} else {
gwName = gwNameObj.toString();
gwServiceName = gwServiceNameObj.toString();
}
//是否已经注册过同名服务
if (existingServices.containsKey(gwServiceName)) {
if (gwServiceName.equals(PidNameMap.get(pid))) {
//同一配置文件修改的情况
LOG.info("更新已有的服务实例\"" + gwServiceName + "\"");
ServiceRegistration ppcService;
ppcService = existingServices.get(g