Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在可停靠的应用程序中使用osgi服务?_Java_Osgi_Drombler Fx - Fatal编程技术网

Java 如何在可停靠的应用程序中使用osgi服务?

Java 如何在可停靠的应用程序中使用osgi服务?,java,osgi,drombler-fx,Java,Osgi,Drombler Fx,例如,如果我有一个通过注释作为可停靠窗口的类,我应该如何在该类中使用osgi服务?最好将其作为私有成员字段 例如,您可以使用ServiceTracker: import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; i

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

例如,您可以使用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);
        }
    }
}
import org.osgi.framework.BundleContext;
导入org.osgi.FrameworkUtil;
导入org.osgi.framework.ServiceReference;
导入org.osgi.util.tracker.ServiceTracker;
导入org.osgi.util.tracker.ServiceTrackerCustomizer;
...
@ViewDocking(…)
公共类MyView扩展了SomeNode{
私人最终服务追踪者myServiceTracker;
私人MyService-MyService;
公共MyView(){
BundleContext BundleContext=FrameworkUtil.getBundle(MyView.class).getBundleContext();
myServiceTracker=新的ServiceTracker(bundleContext、MyService.class、,
新的MyServiceTrackerUserMizer(bundleContext));
myServiceTracker.open(false);
}
...
public void setMyService(MyService MyService){
if(this.myService!=null){
...
}
this.myService=myService;
if(this.myService!=null){
...
}
}
...
私有类myServiceTrackerUserMizer实现
ServiceTrackerCustomizer{
文本语境中的私密性;
公共MyServiceTrackerUserMizer(BundleContext上下文){
this.context=上下文;
}
@凌驾
公共MyService添加服务(ServiceReference){
MyService MyService=context.getService(参考);
setMyService(myService);
返回myService;
}
@凌驾
public void modifiedService(ServiceReference引用,MyService服务){
添加服务(参考);
removedService(参考、服务);
}
@凌驾
public void removedService(ServiceReference引用,MyService服务){
setMyService(null);
ungetService(参考);
}
}
}
还有一个开放的条件是如何使用CDI