尝试使用由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实际上是不可序列化的
答案 0 :(得分:2)
环顾网络,看来我的问题是您没有“应该”直接在应用程序中使用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
因此,如果 LifecycleCallbacks 在缓存管理器的类路径中,它将注册在infinispan支持下lucene需要工作的所有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只能“简化”到只需要野生的东西,而实际上却缺少