org.infinispan.lucene.filecachekey notserializable Exception



试图将现有工作的Hibernate搜索实现升级到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实际上不是序列化

围绕网络查看,我的问题似乎不是"假定"直接在应用程序中使用Infinispan的版本。您应该包括直接使用的Infinispan的其他全部实现。现在,这似乎很愚蠢,因为您正在重新安装相同的版本,因此它应该与内部提供的版本一起使用。(请注意这样做将解决问题,如果您按照此处的指示https://infinispan.org/docs/9.1.x/user_guide/user_guide.html#infinispan_modules_modules_for_for_wildfly(

然而,在开始走这条路后,我很生气地在单个版本的Wildfly中两次设置Infinispan,我发现了这一评论,这给了我希望:https://developer.jboss.org/message/977137#977137

一堆挖掘后,我找到了这个课程,这是您所有问题的关键。LifecyClecallbacks

因此,如果 LifeCyClecallbacks 在缓存管理器的类中将工作。但是,Wildfly的较新版本以及它们提供的Hibernate搜索,不包括此文件。它存在 Infinispan-Lucene-Directory 。因此,解决此问题的方法是创建自己的模块,其中包含提供商的罐子,并确保Cache容器模块指向其中。所需的关键部分是:

独立/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需要的东西,实际上,缺少

最新更新