服务跟踪器的构造函数是例如:
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;
}
}
提前感谢您提供的任何澄清。 基督教
答案 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覆盖我的上述情况。