天天看點

GUAVA緩存失效清理

GUAVA緩存雖然有expireAfterWrite/expireAfterAccess方法和expire的監聽器,但是guava自身并不會定時去判斷緩存是否失效,觸發判斷失效邏輯是調用get方法。這自然很難滿足需要對失效緩存進行監控的場景。解決方案如下:

@ConditionalOnProperty(value = "spring.application.heartBeatWeb", havingValue = "1")
@Component
public class HeartBeatInitializer extends BaseController implements ApplicationRunner {

    private static final Logger LOG = LoggerFactory.getLogger(HeartBeatInitializer.class);

    @Value("${spring.application.heartBeatWeb}")
    private int heartBeatWeb;

    @Resource
    private HeartBeatConfig heartBeatConfig;
    @Resource
    private HeartBeatServiceImpl heartBeatService;
    @Resource
    private IRedisService redisService;
    @Resource
    private KafkaTemplate kafkaTemplate;
    @Resource
    private ThreadPoolTaskScheduler threadPoolTaskScheduler;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {

            try {
                Thread.sleep(2000);
                  heartBeatService.setHeartBeatCache(CacheBuilder.newBuilder().expireAfterAccess(baseResponse.getData().getStopRequestTime(), TimeUnit.SECONDS).removalListener(new RemovalListener<String, Object>() {
                        @Override
                        public void onRemoval(RemovalNotification<String, Object> removalNotification) {
                            LOG.info("被移除了:" + removalNotification.getCause());
                        }
                    }).build());
                    threadPoolTaskScheduler.scheduleAtFixedRate(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                schedule();
                            } catch (ExecutionException e) {
                                e.printStackTrace();
                            }
                        }
                    },baseResponse.getData().getStopRequestTime()*500);
                }
            } catch (Exception e) {
                LOG.error(e.getMessage(), e);
            }
        
    }


    public void schedule() throws ExecutionException {
        LOG.info("定時器");
        heartBeatService.getHeartBeatCache().cleanUp();
    }
}