Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有过期项的Java集合_Java_Collections_Guava - Fatal编程技术网

具有过期项的Java集合

具有过期项的Java集合,java,collections,guava,Java,Collections,Guava,我需要在指定的时间范围内跟踪某些事件,并在事件数量达到一定数量时采取行动。更详细地说,我连接到一个外部服务并提交状态为CONF或FAIL的请求。我需要能够监控响应,以检测在给定的时间范围内是否出现异常数量的故障,例如,在过去5秒内超过3次故障,以便我可以检查错误并采取相应的行动。我也可以连续检查3次失败,但我更喜欢基于时间的方法 读了这篇文章后,我一直在测试Guava的CacheLoader,但是当缓存中的条目(我只存储失败事件)看起来像预期的那样过期时,调用size()(以确定失败的数量)也包

我需要在指定的时间范围内跟踪某些事件,并在事件数量达到一定数量时采取行动。更详细地说,我连接到一个外部服务并提交状态为CONF或FAIL的请求。我需要能够监控响应,以检测在给定的时间范围内是否出现异常数量的故障,例如,在过去5秒内超过3次故障,以便我可以检查错误并采取相应的行动。我也可以连续检查3次失败,但我更喜欢基于时间的方法

读了这篇文章后,我一直在测试Guava的
CacheLoader
,但是当缓存中的条目(我只存储失败事件)看起来像预期的那样过期时,调用
size()
(以确定失败的数量)也包括过期的条目。如果我没有误解的话,这似乎是它应该如何工作的??有没有办法从缓存中获取“活动”事件的数量


我想另一种解决方案是使用像Esper这样的CEP框架,但对于我的简单需求来说,这似乎有些过火和麻烦。有没有人提出完全不同的方法来满足我的要求?谢谢

我没有使用它,但它看起来可能满足您的需要

缓存中获取活动元素的确切数量需要锁定整个缓存,这非常昂贵。不过,您可以使用
cleanUp()
方法来确保
size
不会意外地计算已被悄悄逐出的条目


我不指望它能给你提供准确的结果,但它会显著提高结果的准确性。

我认为,功能最接近你想要的番石榴系列的最大尺寸是有限的。您必须将失败事件按时间顺序排列,并定期检查第一个和最后一个元素之间的差异,以及它是否已满


但你真正想要的是一米。您可以从Coda Hale的度量库中进行尝试。

您可以装饰一个集合实现来实现这一点。大概是这样的:

public类ExpirableArrayList扩展了ArrayList{
私有最终日期创建=新日期();
私人最终长期居住;
public ExpirableArrayList(long-timeToLiveInMs,int-initialCapacity){
超级(初始容量);
this.timeToLiveInMs=timeToLiveInMs;
}
公共过期阵列列表(长时间到毫秒){
this.timeToLiveInMs=timeToLiveInMs;
}
公共过期ArrayList(长时间保存,集合c){
过期();
返回super.contains(c);
}
@凌驾
公共布尔addAll(集合c){
过期();
返回super.removeAll(c);
}
@凌驾
公共布尔保留(集合c){
过期();
返回超级保留(c);
}
@凌驾
公共E-get(int索引){
过期();
返回super.get(索引);
}
@凌驾
公共E集(整数索引,E元素){
过期();
返回super.set(索引、元素);
}
@凌驾
公共E删除(int索引){
过期();
返回super.remove(索引);
}
@凌驾
public int indexOf(对象o){
过期();
返回指数f(o);
}
@凌驾
公共int lastIndexOf(对象o){
过期();
返回lastIndexOf(o);
}
@凌驾
公共ListIterator ListIterator(){
过期();
返回listIterator();
}
@凌驾
公共ListIterator ListIterator(int索引){
过期();
返回listIterator();
}
@凌驾
公共列表子列表(int fromIndex、int toIndex){
过期();
返回子列表(从索引到索引);
}
}

自guava 10.0(2011年9月28日发布)起,许多MapMaker方法已被弃用,取而代之的是新的CacheBuilder,这是我一直在测试但没有成功的方法。您看到了什么
EhCache
cache框架?我建议你去看看。我想这可以解决你的要求。我想我不明白这个问题。发送到外部服务。如果出现错误响应,则添加到带有时间戳的队列中。删除太旧的项目。如果列表长度>阈值,请执行某些操作。如果这种方法被证明太慢,那么(并且只有到那时)优化。一旦优化可以使用整数映射,其中映射的关键是以秒为单位的时间。当您添加错误时(使用秒作为键,增加计数),您确切地知道要对哪些键求和。@TonyEnnis我不知道常规队列如何解决我的问题。我需要某种迭代过程来监视和删除不是理想解决方案的条目。@MJM谢谢
ehCache
可能工作得很好,但我现在不想阅读(对我来说)新框架,但我会记住未来。
cleanUp()
before
size()!非常感谢。我已经搞乱了一个基于Esper的解决方案,我还在测试它。我会接受这一点作为答案,或者根据什么解决方案似乎更容易/更好提供我自己的答案。谢谢,但我认为使用路易斯提供的解决方案的番石榴
缓存
更合适,因为我不需要自己处理监控。