OSGI--动态创建服务

在很多时候,我们都需要搭建一个通用的动态的平台,就是说在以后的扩展当中不需要修改任何的代码就达到动态的扩展一个功能或者是一个服务,然而在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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值