InfinispanDirectoryProvider与Wildfly 10.1

时间:2016-11-19 01:01:37

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

我们希望运行我们的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$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>

1 个答案:

答案 0 :(得分:3)

简短的回答是:

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

详细说明:

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

在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 jars(如果有的话)。

请记住,您无法使用WildFly的“standalone.xml”配置此Infinispan实例的缓存:您正在添加 Infinispan的其他不同模块。例如,如果您愿意,这可能是Infinispan的最新版本,而不是Wildfly附带的版本。因此,请确保这些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 testsuite如何自动运行此模块本身的集成测试:  https://github.com/infinispan/infinispan/blob/8.2.5.Final/integrationtests/as-lucene-directory/pom.xml#L157-L204