使用 Infinispan 和 Wildfly 配置 Hibernate 搜索

Configuring Hibernate Search with Infinispan and Wildfly

我正在配置 Hibernate Search 5.5.5 以在 Wildfly 10 上使用 Infinispan 8.2.2。 我在 Wildfly 中只配置了 Infinispan 模块,没有配置 Hibernate Search 模块。

里面的persistence.xml我是这样配置的:

<property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernateSearch" />
<property name="wildfly.jpa.hibernate.search.module" value="none" />

这是因为似乎使用了 Infinispan,但并未保留索引。

所有缓存在domain.xml中配置如下:

<cache-container name="hibernateSearch" default-cache="LuceneIndexesData" jndi-name="java:jboss/infinispan/hibernateSearch" statistics-enabled="false">
      <replicated-cache name="LuceneIndexesMetadata" mode="ASYNC">
          <file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
      </replicated-cache>
      <replicated-cache name="LuceneIndexesLocking" mode="SYNC">
           <file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
      </replicated-cache>
      <replicated-cache name="LuceneIndexesData" mode="ASYNC">
           <file-store fetch-state="false" passivation="false" preload="false" purge="false" shared="false" singleton="false"/>
      </replicated-cache>
 </cache-container>

在jboss-部署-structure.xml:

<module name="org.infinispan" slot="ispn-8.2"/>
<module name="org.hibernate.search.orm" services="export" />

当我尝试索引所有内容时收到此错误:

UNHANDLED_EXCEPTION: java.lang.IllegalArgumentException: java.lang.Object is not an indexed entity or a subclass of an indexed entity

但是如果我删除这一行:

<property name="wildfly.jpa.hibernate.search.module" value="none" />

我得到了

org.hibernate.search.exception.SearchException: Wrong configuration of directory provider: class org.infinispan.hibernate.search.spi.InfinispanDirectoryProvider does not implement interface org.hibernate.search.store.DirectoryProvider

问题似乎与此处描述的相同:

https://developer.jboss.org/thread/271789

但我没有找到任何可行的解决方案,而且我确定我的类路径中没有一个或多个 Infinispan 或 Hibernate 版本。

怎么了? :(

TLDR; You are having 2 Infinispan versions in your classpath: one in your jboss-deployment-structure.xml and one coming with org.jboss.as.clustering subsystem.

自定义休眠搜索

<property name="wildfly.jpa.hibernate.search.module" value="none" /> 只是意味着 不会自动 使用和导出 应用程序服务器 "search" 模块用于我的应用程序

因此,<module name="org.hibernate.search.orm" services="export" /> 是多余的,只要您为 wildfly.jpa.hibernate.search.module 输入正确的模块 ID 而不是 none 或只是删除 属性 使用默认搜索模块。

none 选项适用于以下情况:您不想使用默认或自定义搜索模块,而是将其捆绑在您的应用程序中。

更多详情WildFly 10 Docs - Using Hibernate Search

自定义 WildFly Infinispan 子系统

<module name="org.infinispan" slot="ispn-8.2"/> 不升级 WildFly Infinispan 子系统。它只允许您的应用程序直接使用 Infinispan 作为库。正确的方法是:

  • 简单:升级到 Wildfly 10.1(它默认带有 Infinispan 8.2 和 Hibernate Search 5.5)
  • 困难:升级或修改 org.jboss.as.clustering.infinispan 模块以使用自定义 Infinispan 版本
  • 荒谬:转储 WildFly 提供的缓存基础结构并使用您自己的捆绑并在应用程序中配置