使用 Infinispan 和 Wildfly 配置 Hibernate Search

Posted

技术标签:

【中文标题】使用 Infinispan 和 Wildfly 配置 Hibernate Search【英文标题】:Configuring Hibernate Search with Infinispan and Wildfly 【发布时间】:2018-06-04 23:50:30 【问题描述】:

我正在将 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-deployment-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 版本。

怎么了? :(

【问题讨论】:

【参考方案1】:

TLDR;您的类路径中有 2 个 Infinispan 版本:一个在您的 jboss-deployment-structure.xml 中,一个在 org.jboss.as.clustering 子系统中。

自定义休眠搜索

&lt;property name="wildfly.jpa.hibernate.search.module" value="none" /&gt; 只是表示不要自动使用并导出应用服务器“搜索”模块为我的应用程序

因此,&lt;module name="org.hibernate.search.orm" services="export" /&gt; 是多余的,只要您为 wildfly.jpa.hibernate.search.module 而不是 none 输入正确的模块 ID 或删除属性以使用默认搜索模块,它就会自动完成。

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

更多详情WildFly 10 Docs - Using Hibernate Search

自定义 WildFly Infinispan 子系统

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

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

【讨论】:

以上是关于使用 Infinispan 和 Wildfly 配置 Hibernate Search的主要内容,如果未能解决你的问题,请参考以下文章

Spring 和 WildFly Infinispan 缓存查找

未使用 Wildfly 15+ 使用 invalidation-cache 和 jdbc-store 自动创建 Infinispan 缓存表

Infinispan/JDBC 作为 Wildfly/JBoss 上 Hibernate Search 的后端

J2EE之wildfly 实践9 -- 使用infinispan 过期缓存

在 Wildfly 10.1 中禁用 Infinispan 集群

Wildfly 12 infinispan 缓存查找不起作用