带有 Wildfly 10.1 的 InfinispanDirectoryProvider

InfinispanDirectoryProvider with Wildfly 10.1

我们想 运行 我们的 EAR,它使用 hibernate 搜索,在 HA 集群中,wildfly 10.1 和 jgroups 使用 infinispan 作为 hibernate 和 hibernate 搜索的缓存。基于 standalone-full-ha.xml(下面的附加详细信息)的基本集群配置在我们使用时有效:

<property name="hibernate.search.default.directory_provider" value="ram"/>

用于 Hibernate Search 的目录提供程序。但是当我们将其更改为:

<property name="hibernate.search.default.directory_provider" value="infinispan"/>

我们收到错误:

01:48:21,857 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 80) MSC000001: Failed to start service jboss.persistenceunit."mc.ear/web.war#mc": org.jboss.msc.service.StartException in service jboss.persistenceunit."mc.ear/web.war#mc": javax.persistence.PersistenceException: [PersistenceUnit: mc] Unable to build Hibernate SessionFactory
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:179)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:121)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl.run(PersistenceUnitServiceImpl.java:193)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: mc] Unable to build Hibernate SessionFactory
     /* SNIP */
Caused by: org.hibernate.search.exception.SearchException: Unable to find directory provider implementation class: org.infinispan.hibernate.search.spi.InfinispanDirectoryProvider

我知道 WildFly 不再分发 infinispan 目录提供程序(目前使用 10.1.0-Final),但我不知道如何将它添加为模块并在我的 jboss- 中引用它部署-structure.xml。看起来应该没有那么难。

我试过这里的建议来禁用版本检测,但我认为这不是问题所在:https://developer.jboss.org/thread/267716

事实上,我在 WildFly 10.0 上尝试过一段时间,但也 运行 遇到了同样的问题:https://developer.jboss.org/thread/271789

我想我不知道如何将 infinispan 目录提供程序包含为自定义模块 - 我需要完全替换 infinispan 吗?这对 WildFly 中的其他缓存没有影响吗?我想尽量减少对标准的更改,但我真的遇到了麻烦。有没有人成功地将 InfinispanDirectoryProvider 与 Wildfly 10.1 集成并可以在此处提供简要说明?其他详细信息如下:

我的persistence.xml

<persistence
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
        http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
    version="2.1">
  <persistence-unit name="mc">
    <jta-data-source>java:/mcDS</jta-data-source>
    <properties>
      <property name="hibernate.show_sql"                       value="false"/>
      <property name="hibernate.id.new_generator_mappings"      value="false"/>
      <property name="hibernate.cache.use_second_level_cache"   value="true"/>
      <property name="hibernate.cache.use_query_cache"          value="true"/>
      <property name="jboss.entity.manager.jndi.name"           value="java:jboss/EntityManagers/mc"/> 
      <property name="jboss.entity.manager.factory.jndi.name"   value="java:jboss/EntityManagerFactories/mc"/>
      <property name="wildfly.jpa.hibernate.search.module" value="none" />
    </properties>
  </persistence-unit>
</persistence>

我一直在standalone.xml中直接配置其他相关设置:

<system-properties>
    <property name="hibernate.search.default.worker.backend" value="jgroups"/>
    <property name="hibernate.search.default.directory_provider" value="infinispan"/>
    <property name="hibernate.search.default.exclusive_index_use" value="false"/>
    <property name="hibernate.search.infinispan.chunk_size" value="300000000"/>
    <property name="hibernate.search.reader.strategy" value="shared"/>
    <property name="hibernate.search.lucene_version" value="LUCENE_CURRENT"/>
    <property name="hibernate.search.worker.execution" value="async"/>
    <property name="hibernate.search.infinispan.cachemanager_jndiname" value="java:jboss/infinispan/container/hibernateSearch"/>
</system-properties>

简短的回答是:

  • 获取正确的 zip 文件
  • 相应地调整您的配置

详细解释:

要在 WildFly 中使用 Infinispan Lucene Directory,您需要下载 WildFly 自定义模块的 Infinispan 发行版;你可以在 Infinispan downloads page 上找到它们,它是名为 "WildFly/EAP Modules".

的 zip

在您的 WildFly /modules 目录中解压缩此 zip 文件。查看它添加的内容可能会有所帮助:除其他外,您会发现它包含一个名为 "org.infinispan.hibernate-search.directory-provider" 的模块并具有插槽 "for-hibernatesearch-5.5".

它还将包含 Infinispan 的新副本,但由于它使用的模块 "slot" 与 WildFly 中包含的模块不同,因此您不会覆盖它。现有的应用程序和 WidlFly 自己对 Infinispan 的使用仍然能够使用现有的模块,因为类加载器隔离确实有效。

在 WildFly 中,Hibernate Search 模块 "org.hibernate.search.engine" 对您刚刚添加的这个模块有一个可选的依赖项,所以如果您使用 WildFly 中包含的 Hibernate Search 版本,您就完成了!

虽然您的配置没有使用 Wildfly 模块;删除行 "wildfly.jpa.hibernate.search.module" 并从部署中删除 Hibernate Search jar(如果有的话)。

请记住,您无法使用 WildFly 的 "standalone.xml" 配置此 Infinispan 实例的缓存:您正在添加 Infinispan 的 额外的不同模块 .例如,如果您愿意,这可以是比 Wildfly 包含的版本更新的 Infinispan 版本。因此,请确保这些 JNDI 名称不引用与 WildFly 捆绑在一起的 Infinispan 实例。最简单的解决方案可能是不使用 JNDI 配置策略,而是简单地将 Infinispan 配置文件包含在您的应用程序部署中,并让 Hibernate Search 引用该资源以启动新的数据网格。

由于没有人喜欢手动下载和解压缩档案,您可以通过 Maven 从坐标下载模块 zip 文件:

<groupId>org.infinispan</groupId>
<artifactId>infinispan-as-embedded-modules</artifactId>
<version>${infinispan.version}</version>
<type>zip</type>

例如,在这里您可以找到 Infinispan 测试套件如何自动运行此模块本身的集成测试: https://github.com/infinispan/infinispan/blob/8.2.5.Final/integrationtests/as-lucene-directory/pom.xml#L157-L204