Hibernate搜索:MassIndexer和缺少CDI-Scopes

时间:2018-06-13 11:05:17

标签: hibernate jpa cdi hibernate-search

我正在使用hibernate搜索并运行如下的MassIndexer:

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

MassIndexer线程中缺少cdi-scope的问题发生在两个地方:

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线程?

1 个答案:

答案 0 :(得分:0)

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

据我所知,没有办法自定义群发索引器启动线程的方式,或者围绕群发索引器执行包装自定义代码,所以我认为没有一种明显的方法可以做你想做的事情

如果从API的角度准确了解需要什么,可以在our JIRA instance上打开详细说明的故障单。如果您对某些编码感到满意,我们也热烈欢迎补丁;)

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

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

另外,您可能想问自己为什么在字段桥中需要非应用程序非单一作用域,考虑到字段桥应该行为相同,无论谁请求执行:您可能不想要每当不同的用户更改它时,要对其进行不同索引的实体......您可能有自己的理由,但最好还是检查这些是非常好的。