InfinispanDirectoryProvider с Wildfly 10.1

Мы хотели бы запустить наш EAR, который использует поиск в спящем режиме, в кластере HA с 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 и может дать здесь краткое описание? Дополнительные сведения ниже:

моя настойчивость.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>

person sprockets    schedule 19.11.2016    source источник


Ответы (1)


Краткий ответ:

  • получить правильный zip-файл
  • соответствующим образом настроить вашу конфигурацию

Детальное объяснение:

Чтобы использовать Infinispan Lucene Directory в WildFly, вам необходимо загрузить дистрибутив Infinispan его пользовательских модулей для WildFly; вы можете найти их на странице загрузок Infinispan, это zip-архив под названием "WildFly/EAP Modules".

Распакуйте этот zip-файл в папку WildFly /modules. Это может помочь посмотреть, что это добавляет: среди прочего, вы обнаружите, что он содержит модуль с именем «org.infinispan.hibernate-search.directory-provider» и имеет слот «for-hibernatesearch-5.5».

Он также будет содержать новую копию Infinispan, но, поскольку он использует другой «слот» модуля, чем тот, который включен в WildFly, вы не перезаписываете его. Существующие приложения и собственное использование WidlFly Infinispan по-прежнему смогут использовать существующий модуль, поскольку изоляция загрузчика классов действительно работает.

В WildFly модуль Hibernate Search «org.hibernate.search.engine» имеет необязательную зависимость от этого модуля, который вы только что добавили, поэтому, если вы используете версию Hibernate Search, включенную в WildFly, все готово!

Однако ваша конфигурация не использует модуль Wildfly; удалите строку «wildfly.jpa.hibernate.search.module» и удалите файлы jar Hibernate Search из своего развертывания, если они у вас есть.

Имейте в виду, что вы не можете настроить кэши этого экземпляра Infinispan с помощью «standalone.xml» вашего WildFly: вы добавляете дополнительный другой модуль Infinispan. Например, это может быть более поздняя версия Infinispan, чем та, которая включена в Wildfly, если хотите. Поэтому убедитесь, что эти имена JNDI не относятся к экземпляру Infinispan, который связан с WildFly. Самым простым решением может быть не использование стратегии настройки JNDI, а просто включение файла конфигурации Infinispan в развертывание вашего приложения и поиск Hibernate со ссылкой на этот ресурс для запуска новой сетки данных.

Поскольку никто не любит вручную скачивать и распаковывать архивы, вы можете скачать zip-файл модулей через Maven из координат:

<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

person Sanne    schedule 19.11.2016
comment
Санне, спасибо за ответ, попробую завтра или на следующей неделе. Я уже скачал zip (даже с wfly 10.0), но думаю, что продолжаю сталкиваться с описанными вами проблемами с кешем в standalone.xml. попробуй, попробуй еще раз, наверное. Вернусь к этой теме с отзывами. - person sprockets; 20.11.2016
comment
Спасибо @Sanne, в основном это сработало, как описано. Моей первой проблемой была ссылка на кеш-контейнер JNDI в моем файле standalone.xml. Затем конфигурация infinispan находится в неправильном месте. Я добавил в папку конфигурации файл standalon.xml, но получил исключение: org.infinispan.configuration.parsing.ParserRegistry.parse(ParserRegistry.java:105) ... java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java :159 Можно ли экспортировать файл?После помещения его в EAR сервер запустился и развертывание прошло успешно. - person sprockets; 21.11.2016
comment
Кстати, для тех, кто обнаружит это позже и захочет попробовать, файл конфигурации infinispan должен быть расположен в корне нашего ejb.jar — я сначала пробовал в META-INF. - person sprockets; 21.11.2016
comment
Переместив файл конфигурации, все заработало? Я посмотрю, сможем ли мы улучшить сообщение об ошибке. Я обязательно подниму приоритет документации.. спасибо! - person Sanne; 22.11.2016
comment
хорошо, я запускаю сервер и формирую кластер, большое спасибо за это, но кажется, что модули infinispan включают HS в версии 5.6.0.Beta1, но эта версия удаляет метод org.hibernate.search.FullTextQuery.setMaxResults, который мы call в некоторых местах нашего кода. Однако интерфейс org.hibernate.search.jpa.FullTextQuery по-прежнему включает этот метод... Итак, у нас есть небольшой конфликт версий. Я попытался просто удалить этот код (он уже был прокомментирован // TODO: действительно ли это нужно?), и, похоже, он работает. - person sprockets; 24.11.2016