0

我正在使用休眠搜索并像这样运行 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 线程?

4

1 回答 1

0

不确定我理解正确,但我相信您在字段桥中使用 CDI bean,并且这些 CDI bean 的范围既不是“应用程序”也不是“单例”?

据我所知,没有办法自定义海量索引器如何启动线程,或者围绕海量索引器执行包装自定义代码,所以我认为没有明显的方法可以做你想做的事。

如果您从 API 的角度准确了解需要什么,您可以在我们的 JIRA 实例上打开一个工单,详细描述它。如果您愿意进行一些编码,我们也热烈欢迎补丁;)

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

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

此外,您可能想问自己为什么需要在字段桥中使用非应用程序、非单例范围,因为无论谁请求执行字段桥都应该执行相同的操作:您可能不希望实体每次不同的用户更改它时,索引都会有所不同...您可能有自己的理由,但您最好检查这些是否真的很好。

于 2018-06-13T12:38:31.703 回答