osgi - ServiceTrackerCustomizer 服务引用返回 null
问题描述
我有一个包含 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 服务,为什么我会得到 null 呢?
解决方案
推荐阅读
- sql - 在 SQL Server 中将字符串日期转换为 GETDATE() 格式
- asp.net-core - ASP.NET Core 3.1 第三方身份验证
- apache-kafka - Kafka消费者未连接到远程主机
- javascript - 是否有可能对来自第一个 ajax 帖子的目标站点的 ajax 帖子做出反应?
- python - __init__() 添加统计信息时缺少 1 个必需的位置参数
- javascript - Elasticsearch 返回的结果大于指定的范围
- react-native - ScrollView 不会一直向下滚动 - React Native
- javascript - 在这种情况下,延迟如何在 rxjs 中工作?
- c# - 错误 CS1955:成员 'System.Collections.Generic.List
.Count' 不能用作方法或委托 - git - 克隆分支并从第一个分支创建一个新分支