OSGi - ServiceTracker - ServiceTrackerCustomizer

时间:2015-02-26 16:47:00

标签: osgi

服务跟踪器的构造函数是例如: ServiceTracker(BundleContext,Filter,ServiceTrackerCustomizer)

ServiceTrackerCustomizer实现以下接口:

   public interface ServiceTrackerCustomizer {
 public Object addingService(ServiceReference reference);
 public void modifiedService(ServiceReference reference, Object service);
 public void removedService(ServiceReference reference, Object service); 

}

如果您希望在注册正在跟踪的服务时添加自定义操作等,我理解自定义程序会有很大帮助。

但是我很难理解传入的引用是什么"添加服务"是,以及如何定义返回的对象。

假设您要跟踪哪个引用为REF的服务,并且您希望在添加服务时打印消息。定制器将类似于:

public class MyServiceTrackerCustomizer implements ServiceTrackerCustomizer {
    // Is REF the ref provided "behind the scene"?
    public Object addingService(ServiceReference reference) {
        // TODO Auto-generated method stub
        System.out.println("In tracker customizer -> service added");

        // What is the object returned?
        return Object;
    }
}

提前感谢您提供的任何澄清。 基督教

2 个答案:

答案 0 :(得分:2)

您是否查看过ServiceTracker类中addingService的默认实现?

    public T addingService(ServiceReference<S> reference) {
        @SuppressWarnings("unchecked")
        T result = (T) context.getService(reference);
        return result;
    }

当然,您可能希望返回另一个要跟踪的对象。例如,您可以将实际服务对象包装在某个包装器中,您现在无法获取服务对象并只返回引用,或者您可以检查该引用并确定您不必通过返回{{来跟踪它1}}。

答案 1 :(得分:2)

ServiceTracker允许您在addsService方法中创建和存储您喜欢的任何对象,然后在modifiedService和removedService中重用此对象。

默认行为是在addsService中获取服务对象,并在removedService中取消它。因此,虽然你可以做你喜欢的事情,但你应该确保如果你得到服务对象,你也应该在以后取消它。

使用默认行为,您可以使用服务跟踪器getService()方法来处理当前找到的服务,但这意味着您的代码依赖于OSGi API,这是不理想的。

另外一个用例是创建你的pojo并在addService中将它注入服务。然后你可以通过返回来存储你的pojo。然后在modifiedService和removedService中,您可以使用您的pojo。例如,您可以在删除时调用destroy方法。

一个高级用例,用于创建和存储另一个ServiceTracker。因此,使用外部ServiceTracker,您可以跟踪ServiceA和内部ServiceB。在内部的内部,你可以创建你的pojo并注入两个服务。因此,这允许您解决在两个服务都可用时您的pojo应该只处于活动状态的情况。有关示例,请参阅TransactionManagerTracker。它跟踪TransactionManager服务。如果找到它,则会创建另一个跟踪器,然后跟踪DataSourceFactory服务。如果两者都可用,则使用两者创建pojo PooledDataSourceFactory。如果其中一项服务消失,那么它将再次被销毁。

Neil写了一篇很棒的文章,其中也包含了一些额外的案例。见When ServiceTracker Trumps Declarative Services。事实上,这篇文章让我意识到我可以使用ServiceTracker覆盖我的上述情况。