请告诉我在哪里,我失去了一些东西。
我有CacheBuilder数据池内部的缓存版本。 数据池是一个单独的对象,其实例各种线程可以获取并采取行动。 现在我有它产生的数据,并添加到缓存中说这是一个单独的线程。
要显示代码的相关部分:
private InputDataPool(){
cache=CacheBuilder.newBuilder().expireAfterWrite(1000, TimeUnit.NANOSECONDS).removalListener(
new RemovalListener(){
{
logger.debug("Removal Listener created");
}
public void onRemoval(RemovalNotification notification) {
System.out.println("Going to remove data from InputDataPool");
logger.info("Following data is being removed:"+notification.getKey());
if(notification.getCause()==RemovalCause.EXPIRED)
{
logger.fatal("This data expired:"+notification.getKey());
}else
{
logger.fatal("This data didn't expired but evacuated intentionally"+notification.getKey());
}
}}
).build(new CacheLoader(){
@Override
public Object load(Object key) throws Exception {
logger.info("Following data being loaded"+(Integer)key);
Integer uniqueId=(Integer)key;
return InputDataPool.getInstance().getAndRemoveDataFromPool(uniqueId);
}
});
}
public static InputDataPool getInstance(){
if(clsInputDataPool==null){
synchronized(InputDataPool.class){
if(clsInputDataPool==null)
{
clsInputDataPool=new InputDataPool();
}
}
}
return clsInputDataPool;
}
从上述线程正在发出这一呼吁的就是这么简单
while(true){
inputDataPool.insertDataIntoPool(inputDataPacket);
//call some logic which comes with inputDataPacket and sleep for 2 seconds.
}
并在inputDataPool.insertDataIntoPool像
inputDataPool.insertDataIntoPool(InputDataPacket inputDataPacket){
cache.get(inputDataPacket.getId());
}
现在的问题是,在高速缓存中的元素应该当inputDataPool.insertDataIntoPool被称为第二次在1000 nanosec.So到期,已插入的第一时间将撤离,因为它肯定有我作为过期呼叫正在后的数据其insertion.And 2秒钟,然后相应地删除监听器应该被调用。 但是,这没有发生。 我看着高速缓存的统计信息和evictionCount始终为零,不管cache.get(ID)多少时间被调用。
但重要的是,如果我延长inputDataPool.insertDataIntoPool
inputDataPool.insertDataIntoPool(InputDataPacket inputDataPacket){
cache.get(inputDataPacket.getId());
try{
Thread.sleep(2000);
}catch(InterruptedException ex){ex.printStackTrace();
}
cache.get(inputDataPacket.getId())
}
那么驱逐发生与去除听众被称为预期。
现在我在这里,我失去了一些东西期待这类行为的当下非常无能。 请帮我看看,如果你看到的东西。
PS请忽略任何typos.Also没有检查正在进行,没有通用已被使用,所有因为这只是在测试CacheBuilder功能的阶段。
谢谢