3

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

未在此缓存上启用索引。在注册表中找不到接口 org.hibernate.search.spi.SearchFactoryIntegrator

长版:

  • 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]

重要的部分是

未在此缓存上启用索引。在注册表中找不到接口 org.hibernate.search.spi.SearchFactoryIntegrator

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

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

<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>

我看到在配置的文件位置中创建了索引,因此启用布尔解析为 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
  • 杰克逊核心asl-1.9.2.jar
  • jackson-mapper-asl-1.9.2.jar
  • lucene-core-3.5.0.jar
  • 参数-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 中声明了对这两个模块的依赖关系

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

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

4

1 回答 1

4

注意:我从一个干净的 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>

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

<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>

为了注释您的对象以便可以对它们进行索引和搜索,我建议您查看此处的示例

编辑:进一步说明:为了让索引对象在缓存中实际共享,我现在必须

  • 创建一个 jar,其中包含您计划放入缓存中的所有类。
  • 确保这些实体不包含任何过于复杂的导入条款,否则您将遇到类加载器问题。
  • 从这个 jar 中创建一个模块,并赋予它对 Infinispan.query 模块的依赖关系。
  • 在standalone.xml 或domain.xml 中将这个模块公开为一个全局模块(这真的需要吗?),无论哪个合适。
  • 找到文件 modules/org/jboss/as/clustering/infinispan/main/module.xml
  • 将包含可缓存实体的新模块添加到依赖项列表中
于 2013-08-19T15:30:35.850 回答