Infinispan - 无法为远程缓存指定编码

Infinispan - Unable to specify encoding for remote cache

我从 Infinispan website and Red hat 中看到了很多关于为缓存的键和值添加编码的示例,但我无法使用当前配置执行此操作。

@Configuration
public class InfinispanConfiguration {

    @Bean
    public InfinispanRemoteConfigurer infinispanRemoteConfigurer() {
        return () -> new ConfigurationBuilder()
                .clientIntelligence(ClientIntelligence.TOPOLOGY_AWARE)
                .addContextInitializers(new ProductInitializerImpl())
                .statistics().enable()
                .addServers("localhost:11222; localhost:11322")
                .connectionPool().maxActive(10).exhaustedAction(ExhaustedAction.WAIT)
                .security()
                .authentication()
                .username("user")
                .password("1")
                .realm("default")
                .build();
    }

    @Bean
    public InfinispanRemoteCacheCustomizer customizer() {
        return builder -> builder.tcpKeepAlive(true);
    }
}

我在不同的 class 中使用缓存,如下所示:

@Slf4j
@Component
@RequiredArgsConstructor
public class ProductCache {

    private final RemoteCacheManager cacheManager;

    public void cacheProducts(Feed feed){
        cacheManager.administration().getOrCreateCache("prodCache", DefaultTemplate.INVALIDATION_ASYNC);
        RemoteCache<String, Product> cacheProducts = cacheManager.getCache("productsCache");

        feed.getProducts()
            .getProduct()
            .forEach(product -> cacheProducts.putIfAbsent(product.getPid(), product));

        log.info("Number of Products are " + feed.getProducts().getProduct().size());
    log.info("Number of cached Products are " + cacheProducts.size());
    }
}

我已经在我的 classes 中使用并添加了 Protostream 注释。

@AutoProtoSchemaBuilder(
        includeClasses = {
                Product.class, Facet.class
        },
        schemaFileName = "product.proto",
        schemaFilePath = "build/proto/",
        schemaPackageName = "products"
)
public interface ProductInitializer extends SerializationContextInitializer {
}

我也收到此终端警告消息:

WARN  (blocking-thread--p3-t2) [org.infinispan.encoding.impl.StorageConfigurationManager] ISPN000599: Configuration for cache 'productsCache' does not define the encoding for keys or values. If you use operations that require data conversion or queries, you should configure the cache with a specific MediaType for keys or values.

我还注意到无论列表中有多少产品,我的缓存只存储 1 个元素! 我还可以从仪表板中看到缓存未命中。 我只是不确定这些问题是否有任何关联。

任何帮助将不胜感激。谢谢!
更新:终于发现为什么我的缓存只有一条数据了!仅仅因为这个设置,DefaultTemplate.INVALIDATION_ASYNC。当对缓存进行修改时,它会驱逐“陈旧”数据。找到此信息 here

我唯一剩下的问题是整理我现在看到的不同的编码因此,现在我唯一的问题似乎我提出了两个问题!

Update2:编码是根据我在下面的回答中提供的 link 设置的。我现在才收到以下错误:

与此抗争几天后,我完全改变了配置方式并删除了 lambda 样式配置,因为很难包含编码配置。 我按照这个 tutorial 只是将两个配置方法声明为 Spring beans!它现在很容易设置编码!
Update2 的回答:将这些行添加到构建器配置后:

.marshaller(new ProtoStreamMarshaller())
.addContextInitializers(new ProductInitializerImpl())
.addJavaSerialAllowList("com.person.model.*")

记得将从 ProtoStream 注释处理器插件生成的 Proto 文件添加到其他仪表板,您会收到与我在更新的问题中收到的错误消息相同的错误消息!