【问题标题】:How do I use an osgi service in a dockable?如何在可停靠中使用 osgi 服务?
【发布时间】:2016-03-11 11:41:12
【问题描述】:

例如,如果我有一个通过注释用作可停靠窗口的类,我应该如何在该类中使用 osgi 服务?最好将其作为私有成员字段。

【问题讨论】:

    标签: java osgi drombler-fx


    【解决方案1】:

    你可以例如。使用 ServiceTracker:

    import org.osgi.framework.BundleContext;
    import org.osgi.framework.FrameworkUtil;
    import org.osgi.framework.ServiceReference;
    import org.osgi.util.tracker.ServiceTracker;
    import org.osgi.util.tracker.ServiceTrackerCustomizer;
    ...
    
    @ViewDocking(...)
    public class MyView extends SomeNode{
        private final ServiceTracker<MyService, MyService> myServiceTracker;
        private MyService myService;
    
        public MyView(){
            BundleContext bundleContext = FrameworkUtil.getBundle(MyView.class).getBundleContext();
            myServiceTracker = new ServiceTracker<>(bundleContext, MyService.class,
                    new MyServiceTrackerCustomizer(bundleContext));
            myServiceTracker.open(false);
        }
    
        ...
    
        public void setMyService(MyService myService) {
            if (this.myService != null){
               ...
            }
            this.myService = myService;
            if (this.myService != null){
               ...
            }
        }
    
        ...
    
        private class MyServiceTrackerCustomizer implements
                ServiceTrackerCustomizer<MyService, MyService> {
    
            private final BundleContext context;
    
            public MyServiceTrackerCustomizer(BundleContext context) {
                this.context = context;
            }
    
            @Override
            public MyService addingService(ServiceReference<MyService> reference) {
                MyService myService = context.getService(reference);
                setMyService(myService);
                return myService;
            }
    
            @Override
            public void modifiedService(ServiceReference<MyService> reference, MyService service) {
                addingService(reference);
                removedService(reference, service);
            }
    
            @Override
            public void removedService(ServiceReference<MyService> reference, MyService service) {
                setMyService(null);
                context.ungetService(reference);
            }
        }
    }
    

    还有一个开放的issue 是否可以使用以及如何使用 CDI。

    【讨论】:

      猜你喜欢
      • 2013-06-14
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2016-06-26
      • 1970-01-01
      • 2010-10-26
      • 2010-10-02
      相关资源
      最近更新 更多