休眠搜索:MassIndexer 和缺少的 CDI 范围



我正在使用休眠搜索并运行如下所示的MassIndexer:

FullTextEntityManager ftem = Search.getFullTextEntityManager(entityManager);
ftem.createIndexer().startAndWait();

有关 MassIndexer 线程中缺少 cdi 作用域的问题发生在两个地方:

javax.persistence.PostLoad

@PostLoad
void onPostLoad(Object o) {
// cdi-scope aware code
}

org.hibernate.search.bridge.FieldBridge

class MyFieldBridge implements FieldBridge {
public void set(...) {
// cdi-scope aware code
}
}

是否可以使用定义的CDI范围(例如通过Apache Deltaspike(来丰富MassIndexer线程?

不确定我理解正确,但我相信您在现场桥中使用 CDI 豆,并且这些 CDI 豆的范围既不是"应用程序"也不是"单例"?

据我所知,没有办法自定义质量索引器启动线程的方式,也没有办法围绕质量索引器执行包装自定义代码,所以我认为没有明显的方法来做你想要的。

如果您从 API 的角度对需要什么有确切的想法,您可以在我们的 JIRA 实例上打开一个票证,详细描述它。我们也热烈欢迎补丁,如果你觉得一些编码;)

关于非显而易见的解决方案:

  • Hibernate Search 5.9+ 提供了 JSR-352(Batch for Java 应用程序(集成,允许您运行批量索引 JSR-352 作业。该集成特别适用于 JBeret,它在 Weld 内部运行,并在自定义 CDI 作用域中执行批量索引代码。您也许可以自定义它以执行所需的操作。
  • CDI实现中可能有一些事务范围,当Hibernate ORM打开事务时会自动激活。如果是这种情况(我真的不知道是不是这样(,只要事务范围被激活并且您的范围尚未激活,您就可以自动激活所需的范围。真的是黑暗中的一枪,但谁知道呢...

此外,您可能想问自己为什么在字段桥中需要一个非应用程序、非单例作用域,考虑到无论谁请求执行,字段桥都应该执行相同的行为:您可能不希望每次不同的用户更改实体时都以不同的方式对实体进行索引......你可能有你的理由,但你最好检查这些是真的好的理由。

最新更新