java - 由于 SearchFactoryIntegrator 不在注册表中,无法在 JBoss 7 上查询 Infinispan

标签 java jboss jboss7.x hibernate-search infinispan

TL:DR 我收到以下错误,我看不出有什么原因,索引已启用,并且 SearchFactoryIntegrator 位于需要查看它的所有内容的类路径中。

Indexing was not enabled on this cache. interface org.hibernate.search.spi.SearchFactoryIntegrator not found in registry

长版:

  • JBoss 版本:7.1.1 最终版本
  • Infinispan 版本:5.16(从 JBoss 附带的 5.1.2 升级以尝试解决问题)
  • Java 版本:1.7

我正在尝试构建一个简单的测试应用程序来针对 Infinispan 缓存运行查询。

我已成功将对象添加到缓存中。缓存定义为 private org.infinispan.Cache<String, Agent> cache;代理是我自己的对象。

尝试查询缓存时,我从该行收到以下错误 SearchManager searchManager = Search.getSearchManager(cache);

17:35:43,873 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/SearchableCacheTest].[Faces Servlet]] (http-localhost-127.0.0.1-8080-1) Servlet.service() for servlet Faces Servlet threw exception: java.lang.IllegalArgumentException: Indexing was not enabled on this cache. interface org.hibernate.search.spi.SearchFactoryIntegrator not found in registry
    at org.infinispan.query.impl.ComponentRegistryUtils.getComponent(ComponentRegistryUtils.java:40) [infinispan-query-5.1.6.FINAL.jar:5.1.6.FINAL]
    at org.infinispan.query.SearchManagerImpl.<init>(SearchManagerImpl.java:56) [infinispan-query-5.1.6.FINAL.jar:5.1.6.FINAL]
    at org.infinispan.query.Search.getSearchManager(Search.java:39) [infinispan-query-5.1.6.FINAL.jar:5.1.6.FINAL]

重要的部分是

Indexing was not enabled on this cache. interface org.hibernate.search.spi.SearchFactoryIntegrator not found in registry

在此错误之前cache.getCacheConfiguration().indexing().enabled()解析为 true

缓存是已在standalone-ha.xml 中配置的默认“集群”缓存的修改版本。 JBoss 的。

<cache-container name="cluster" aliases="ha-partition" default-cache="default" start="EAGER">
    <transport lock-timeout="60000"/>
    <replicated-cache name="default" mode="SYNC" batching="true" indexing="LOCAL">
        <locking isolation="REPEATABLE_READ"/>
        <store class="org.infinispan.loaders.file.FileCacheStore" preload="true" passivation="false" fetch-state="true" purge="false">
            <property name="location">
                /tempCacheIndex
            </property>
        </store>
     </replicated-cache>
</cache-container>

我看到索引是在配置的文件位置创建的,因此启用的 boolean 值解析为 true 似乎是当前状态的事实表示。

我在 JBoss 中创建了一个 org.infinispan.query 模块,它包含以下内容

  • avro-1.5.1.jar
  • hibernate-commons-annotations-4.0.1.Final.jar
  • hibernate-search-engine-4.1.1.Final.jar
  • infinispan-query-5.1.6.FINAL.jar
  • jackson-core-asl-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • lucene-core-3.5.0.jar
  • paranamer-2.3.jar
  • slf4j-api-1.6.1.jar
  • snappy-java-1.0.4.1.jar

上述所有内容都在该模块的 module.xml 中定义为资源根。 我修改了模块的 module.xml org.infinispan依赖于模块 org.infinispan.query

我已经在我的 jboss-deployment-structure.xml 中声明了对这两个模块的依赖

有没有人知道为什么会发生这种情况并且可能有解决方案?

注意:有一个非常相似的问题here但他最终没有成功,选择了不同的路线。

最佳答案

注意:我从一个干净的 JBoss 7.1.1 实例开始,因此从 Infinispan 5.1.6 恢复到 5.1.2

根据我的需要,我修改了现有的集群缓存,使其看起来像这样

<cache-container name="cluster" aliases="ha-partition"
default-cache="default" start="EAGER">
<transport lock-timeout="60000" />
<replicated-cache name="default" mode="SYNC" batching="true"
    indexing="LOCAL">
    <locking isolation="REPEATABLE_READ" />
    <store class="org.infinispan.loaders.file.FileCacheStore"
        preload="true" passivation="false" fetch-state="true" purge="false">
        <property name="location">
            /tempCacheIndex
        </property>
    </store>
</replicated-cache>

然后为了真正能够查询缓存,创建包含以下 module.xml 中提到的 jar 的 org.infinispan.query 模块

<module xmlns="urn:jboss:module:1.1" name="org.infinispan.query">
<resources>
    <resource-root path="avro-1.5.1.jar"/>
    <resource-root path="hibernate-commons-annotations-4.0.1.Final.jar"/>
    <resource-root path="hibernate-search-4.1.0.Beta1.jar"/>
    <resource-root path="hibernate-search-analyzers-4.1.0.Beta1.jar"/>
    <resource-root path="hibernate-search-engine-4.1.0.Beta1.jar"/>
    <resource-root path="hibernate-search-orm-4.1.0.Beta1.jar"/>
    <resource-root path="infinispan-query.jar"/>
    <resource-root path="jackson-core-asl-1.9.2.jar"/>
    <resource-root path="jackson-mapper-asl-1.9.2.jar"/>
    <resource-root path="lucene-analyzers-3.5.0.jar"/>
    <resource-root path="lucene-core-3.5.0.jar"/>
    <resource-root path="lucene-grouping-3.5.0.jar"/>
    <resource-root path="lucene-highlighter-3.5.0.jar"/>
    <resource-root path="lucene-memory-3.5.0.jar"/>
    <resource-root path="lucene-misc-3.5.0.jar"/>
    <resource-root path="lucene-smartcn-3.5.0.jar"/>
    <resource-root path="lucene-spatial-3.5.0.jar"/>
    <resource-root path="lucene-spellchecker-3.5.0.jar"/>
    <resource-root path="lucene-stempel-3.5.0.jar"/>
    <resource-root path="paranamer-2.3.jar"/>
    <resource-root path="slf4j-api-1.6.1.jar"/>
    <resource-root path="snappy-java-1.0.4.1.jar"/>
    <resource-root path="solr-analysis-extras-3.5.0.jar"/>
    <resource-root path="solr-commons-csv-3.5.0.jar"/>
    <resource-root path="solr-core-3.5.0.jar"/>
    <resource-root path="solr-solrj-3.5.0.jar"/>
</resources>

<dependencies>
    <module name="javax.api"/>
    <module name="javax.transaction.api"/>
    <module name="org.hibernate"/>
    <module name="org.infinispan" services="import" export="true"/>
    <module name="org.apache.commons.codec"/>
    <module name="org.apache.commons.io"/>
    <module name="org.apache.commons.lang"/>
    <module name="com.google.guava"/>
    <module name="org.slf4j" export="true"/>
    <module name="org.jboss.logging"/>
</dependencies>

修改 org.jboss.as.clustering.infinspan 模块 xml 以包含对新查询模块的依赖性以及对已存在的 org.hibernate 模块的依赖性。因此,将以下内容添加到该文件。

<module name="org.hibernate" services="import"/>
<module name="org.infinispan.query" services="import"/>

您的应用程序的 jboss-deployment-structure.xml 需要添加以下依赖项

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
         <dependencies>
              <module export="true" name="org.hibernate" services="import"/>
              <module export="true" name="org.infinispan" services="import"/>
              <module export="true" name="org.infinispan.query" services="import"/>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

为了注释您的对象,以便它们可以被索引和搜索,我建议您查看样本 here

编辑: 进一步注意: 为了让索引对象真正共享缓存,我现在必须

  • 创建一个包含您计划放入缓存的所有类的 jar。
  • 确保这些实体不包含任何在导入方面过于复杂的内容,否则您会遇到类加载器问题。
  • 从这个 jar 创建一个模块,并赋予它对 Infinispan.query 模块的依赖。
  • 在 standalone.xml 或 domain.xml 中以适当的方式将此模块公开为全局模块(这实际上需要吗?)。
  • 找到文件 modules/org/jboss/as/clustering/infinispan/main/module.xml
  • 将包含可缓存实体的新模块添加到依赖项列表

关于java - 由于 SearchFactoryIntegrator 不在注册表中,无法在 JBoss 7 上查询 Infinispan,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18291687/

相关文章:

java - 构造函数中的缝焊注入(inject) : Unable to resolve any beans for Types

java - Java 6 中 if/or 与 try/catch 的复合成本

java - JUnit 5 @Tag 不能按预期与 @BeforeEach/@AfterEach 一起工作

java - 如何使用 JBoss 以编程方式获取当前 EAR 位置

spring - 如何在 JBoss 6 中分离耳朵类加载器和系统类加载器?

java - 如何将mysql并入Jboss快速入门教程

java - 在 Spring 中覆盖 beans 的最佳方法

java - jar 作为 jboss 模块 : dependencies

oracle11g - IJ000604 : Throwable while attempting to get a new connection: null: javax. 资源.ResourceException:无法创建连接

java - 将数据发送到队列并在同一函数中监听数据