首页 > 解决方案 > org.infinispan.lucene.FileCacheKey NotSerializableException 尝试在 Hibernate Search Cache 中复制数据时出现异常

问题描述

尝试使用 Wildfly infinispan 支持的现有工作休眠搜索实现从 10 升级到 17,每当第二个节点尝试加入集群时(如果启动没有完全超时),我会得到如下堆栈:

org.infinispan.commons.marshall.NotSerializableException: org.infinispan.lucene.FileCacheKey
    Suppressed: org.infinispan.util.logging.TraceException
        at org.infinispan.interceptors.impl.SimpleAsyncInvocationStage.get(SimpleAsyncInvocationStage.java:41)
        at org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invoke(AsyncInterceptorChainImpl.java:250)
        at org.infinispan.cache.impl.CacheImpl.executeCommandWithInjectedTx(CacheImpl.java:1939)
        at org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1917)
        at org.infinispan.cache.impl.CacheImpl.putIfAbsent(CacheImpl.java:1474)

调查问题, FileCacheKey 实际上是不可序列化的

标签: lucenewildflyhibernate-searchinfinispan

解决方案


环顾网络,我的问题似乎是您“不应该”直接在您的应用程序中使用包含的 infinispan 版本。您应该包含完整的其他 infinispan 实现以直接使用。现在,这似乎很愚蠢,因为您正在重新安装相同的版本,所以它应该只适用于内部提供的版本。(注意这样做可以解决问题,如果您按照此处的说明进行操作https://infinispan.org/docs/9.1.x/user_guide/user_guide.html#infinispan_modules_for_wildfly

然而,在开始走这条路之后,并且对必须在一个版本的 Wildfly 中设置两次 infinispan 感到恼火,我发现了这条评论,这给了我希望:https ://developer.jboss.org/message/977137# 977137

经过一堆挖掘,我找到了这个类,它是你所有问题的关键。生命周期回调

因此,如果LifecycleCallbacks在缓存管理器的类路径中,它将注册 lucene 在 infinispan 支持时需要工作的所有 Externalizer(序列化不可序列化的类),并且一切都会正常工作。但是,较新版本的 wildfly 以及它们提供的休眠搜索不包含此文件。它存在于 infinispan-lucene-directory中。因此,解决方案是创建您自己的模块,其中包含提供程序 jar,并确保缓存容器模块指向该模块。需要的关键部分是:

在standalone/domain.xml 中缓存容器

 <cache-container name="luceneContainer" default-cache="lucene-default" statistics-enabled="true" module="org.infinispan.hibernate-search.directory-provider">
            <transport channel="epicenter-localsite-cluster" lock-timeout="60000"/>
             <replicated-cache name="lucene-default">
                <locking isolation="READ_COMMITTED"/>
                <transaction locking="OPTIMISTIC" mode="NONE"/>
            </replicated-cache>
             <replicated-cache name="LuceneIndexesData">
                <locking isolation="READ_COMMITTED"/>
                <transaction locking="OPTIMISTIC" mode="NONE"/>
            </replicated-cache>
             <replicated-cache name="LuceneIndexesMetadata">
                <locking isolation="READ_COMMITTED"/>
                <transaction locking="OPTIMISTIC" mode="NONE"/>
            </replicated-cache>
             <replicated-cache name="LuceneIndexesLocking">
                <locking isolation="READ_COMMITTED"/>
                <transaction locking="OPTIMISTIC" mode="NONE"/>
            </replicated-cache>
        </cache-container>

模块 XML:

    <!-- This is derived from the infinispan-feature pack wf modules.  It exists to get the cache to register the correct externalizers for lucene -->
<module name="org.infinispan.hibernate-search.directory-provider" xmlns="urn:jboss:module:1.3">
    <resources>
        <resource-root path="infinispan-directory-provider-9.4.14.Final.jar"/>
        <resource-root path="infinispan-lucene-directory-9.4.14.Final.jar"/>
    </resources>

    <dependencies>
        <module name="org.apache.lucene"/>
        <module name="org.hibernate.search.engine"/>
        <module name="javax.api"/>
        <module name="org.infinispan.commons" export="true"/>
        <module name="org.infinispan" export="true" services="export"/>
        <module name="org.jboss.logging" />
    </dependencies>
</module>

创建此模块,将其添加到 Wildfly 并更新您的缓存容器后,一切都应该正常工作。最后,关键问题是内部的 infinispan 被“精简”到只有 Wildfly 需要的东西,事实上,它缺少


推荐阅读