У меня есть постоянный пакет, содержащий сущность Product.Поскольку я хочу запускать обновления на моем сервере Solr по требованию, когда я сохраняю / изменяю / удаляю экземпляр, я ввел прослушиватель сущности:
@Entity
public class Product {
// id and fields
@PrePersist
public void onPersist () {
ProductAudit.onPersist( this );
}
// other lifecycle callbacks
}
public class ProductAudit {
private static final Set<ProductListener> listeners = new HashSet<>();
// static addListener/removeListener
public void onPersist (Product p) {
listeners.forEach(l -> {
l.onPersist(p);
}
}
}
Чтобы интегрировать мой модуль персистентности в мою среду OSGi,Я написал пакет адаптеров, использующий шаблон доски:
@Component(
name="com.acme.product.audit",
immediate=true)
public class OsgiProductListener implements ProductListener {
private ServiceTracker<ProductListener,ProductListener> tracker;
@Activate
public void activate (BundleContext context) {
tracker = new ServiceTracker<>(context, ProductListener.class, new ServiceTrackerCustomizer<ProductListener, ProductListener>() {
@Override
public ProductListener addingService(ServiceReference<ProductListener> reference) {
if (validProps(reference)) {
ProductListener l = reference.getBundle().getBundleContext().getService(reference); // null
ProductListener l = context.getService(reference); // null too
System.out.println("Adding " + l);
ProductAudit.addListener(l);
return l;
}
return null;
}
// modifiedService, removedService
private boolean validProps(ServiceReference<?> reference) {
// check for enabling flag
}
});
tracker.open();
}
Теперь у меня есть два пакета провайдеров - тестовый пакет и пакет индексатора.Когда я развертываю оба, на консоли выводится:
> Activating com.acme.persistence.audit component
...
> Adding com.acme.persistence.test.ProductListenerImpl@1337
> Adding null
Все три пакета используют одну и ту же версию API, иначе мой трекер не будет их отслеживать.
Так почему я получаю ноль, если япопытаться получить услугу ProductListener?