【问题标题】:InfinispanDirectoryProvider with Wildfly 10.1带有 Wildfly 10.1 的 InfinispanDirectoryProvider
【发布时间】:2016-11-19 01:01:36
【问题描述】:

我们想在一个 HA 集群中运行使用休眠搜索的 EAR,该集群具有 wildfly 10.1 和 jgroups,使用 infinispan 作为休眠和休眠搜索的缓存。当我们使用时,基于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$1$1.run(PersistenceUnitServiceImpl.java:179)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1$1.run(PersistenceUnitServiceImpl.java:121)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:667)
    at org.jboss.as.jpa.service.PersistenceUnitServiceImpl$1.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

我知道 infinispan 目录提供程序不再随 WildFly 分发(当前使用 10.1.0-Final),但我不知道如何将其添加为模块并在我的 jboss-deployment-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>

【问题讨论】:

    标签: hibernate jboss hibernate-search infinispan wildfly-10


    【解决方案1】:

    简短的回答是:

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

    详细解释:

    要在 WildFly 中使用 Infinispan Lucene 目录,您需要下载其用于 WildFly 的自定义模块的 Infinispan 发行版;您可以在 Infinispan downloads page 上找到它们,它是名为“WildFly/EAP 模块”的 zip。

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

    它还将包含 Infinispan 的新副本,但由于它使用的模块“插槽”与 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

    【讨论】:

    • 感谢 Sanne 的回复,我明天或下周去试试。我已经下载了 zip(即使使用 wfly 10.0),但我认为我一直遇到您在standalone.xml 中的缓存描述的问题。试试,再试试,我猜。将返回此线程并提供反馈。
    • 感谢@Sanne,它基本上按描述工作。我的第一个问题是我的standalone.xml 中对JNDI 缓存容器的引用。然后infinispan配置在错误的位置。我将带有standalon.xml的配置文件夹放入,但出现异常:org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:105) ... java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java :159 是否可以将文件外部化?将其放入 EAR 后,服务器启动,部署成功。
    • 顺便说一句,对于以后发现并需要尝试它的任何人,infinispan 配置文件需要位于我们的 ejb.jar 的根目录中 - 我最初在 META-INF 中尝试过。
    • 移动配置文件是否可以正常工作?我会看看我们是否可以改进错误消息。我肯定会提高文档的优先级..谢谢!
    • 好吧,我让服务器运行并形成了集群,非常感谢,但似乎 infinispan 模块在 5.6.0.Beta1 版本中包含 HS 但此版本删除了方法 org.hibernate .search.FullTextQuery.setMaxResults 我们在代码中的某些位置调用。 org.hibernate.search.jpa.FullTextQuery 接口仍然包含该方法,但是......所以我们有点版本冲突。我已经尝试删除该代码(它已经用 // TODO: 这真的需要吗?)并且它似乎正在工作。
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 2016-12-13
    • 2018-06-20
    • 2017-09-07
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多