首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >infinispan编组错误

infinispan编组错误
EN

Stack Overflow用户
提问于 2020-07-30 17:28:55
回答 1查看 379关注 0票数 0

在dockerize spring boot应用程序中,我遇到了嵌入式infinispan编组的问题。此方法:

代码语言:javascript
复制
public  void incrementSmsSend( String key){

        AdvancedCache<String, DailySms> advancedCache=cacheManager.<String, DailySms>getCache("statistics-cache").getAdvancedCache() ;
        try {
            advancedCache.computeIfAbsentAsync("totalSms_"+key,s -> new DailySms(0L,null));

            advancedCache.getAdvancedCache().merge("totalSms_"+key,new DailySms(1L,null),(dailySmsInit, dailySms) -> {
                if(dailySms.isExpired()){
                    logger.debug("init numberDailySms: {}",dailySmsInit.getTotal());
                    return dailySmsInit;
                }else{
                    dailySms.increment();
                }
                logger.debug("numberDailySms: {}",dailySms.getTotal());
                return dailySms;
            });
        }catch (Exception e){
            logger.error("Error:",e);
        }
    }

使用此配置:

代码语言:javascript
复制
 @Bean
    public InfinispanCacheConfigurer cacheConfigurer() {
        return manager -> {
            final org.infinispan.configuration.cache.Configuration ispnConfig = new ConfigurationBuilder()
                    .clustering()
                    .cacheMode(CacheMode.REPL_SYNC).remoteTimeout(1,TimeUnit.SECONDS)
                    .statistics().enable()
                    .build();
            final org.infinispan.configuration.cache.Configuration ispnStatistics = new ConfigurationBuilder()
                    .clustering()
                    .cacheMode(CacheMode.REPL_SYNC).remoteTimeout(1,TimeUnit.SECONDS)
                    .statistics().enable()//.transaction().transactionMode(TransactionMode.TRANSACTIONAL)
                    .build();
            manager.defineConfiguration("vdc-cache", ispnConfig);
            manager.defineConfiguration("statistics-cache", ispnStatistics);

        };
    }

    @Bean
    public InfinispanGlobalConfigurationCustomizer globalCustomizer() {
        return builder -> builder.clusteredDefault().transport().clusterName("vdc-cache-cluster")
                .serialization().addContextInitializers(new Bucket4jProtobufContextInitializer(),new ManualSerializationContextInitializer())
                .whiteList().addClasses(Tps.class)
        ;
    }

生成此异常:

代码语言:javascript
复制
2020-07-30 09:19:09.981 - [vdc-ratelimiter-service] - [async-thread--p2-t5] - WARN  [o.i.PERSISTENCE] [] ISPN000559: Cannot marshall 'class org.infinispan.marshall.protostream.impl.MarshallableUserObject'
java.io.NotSerializableException: com.ericsson.vdc.ratelimiter.service.service.StatisticsService
    at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1193)
    at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:353)
    at org.infinispan.commons.marshall.JavaSerializationMarshaller.objectToBuffer(JavaSerializationMarshaller.java:44)
    at org.infinispan.commons.marshall.AbstractMarshaller.objectToByteBuffer(AbstractMarshaller.java:70)
...

我使用infinispan spring-boot-starter-embedded版本2.3.1。spring和infinispan10.1.8版本

EN

回答 1

Stack Overflow用户

发布于 2020-07-30 22:40:09

我发现了问题。在Spring bean的StatisticsService方法中,incrementSmsSend使用了lambda表达式,所以infinispan会尝试序列化所有的bean。我创建了一个BiFunction并以这种方式更改了方法:

代码语言:javascript
复制
advancedCache.getAdvancedCache().computeIfPresentAsync("totalSms_"+key,new VdcSerializableFunction())

VdcSerializableFunction包括:

代码语言:javascript
复制
public class VdcSerializableFunction implements Serializable, BiFunction<String,DailySms,DailySms> {


@Override
public DailySms apply(String s, DailySms dailySms) {
    if(dailySms.isExpired()){
        return new DailySms(1L,null);
    }else{
        dailySms.increment();
    }
    return dailySms;
}

}

谢谢

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63170193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档