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();
}
}