【问题标题】:Hibernate Search: MassIndexer and missing CDI-ScopesHibernate Search:MassIndexer 和缺少的 CDI 范围
【发布时间】:2018-06-13 11:05:17
【问题描述】:

我正在使用休眠搜索并像这样运行 MassIndexer:

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

MassIndexer 线程中缺少 cdi-scopes 的问题出现在两个地方:

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

【问题讨论】:

    标签: hibernate jpa cdi hibernate-search


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 1970-01-01
      • 2022-12-16
      • 2012-01-20
      相关资源
      最近更新 更多