此问题适用于任何Hazelcast版本。 (试过3.2.x,3.3.x,3.4.x)我已经指定了需要发生的驱逐条件,以防止内存不足错误。但是虽然我已经提到了max-size,但当策略为PER_NODE时触发USED_HEAP_SIZE是策略时不会触发Eviction。
<hz:map name="aggregateCache" eviction-policy="LRU" in-memory-format="OBJECT"
statistics-enabled="true"
eviction-percentage="25"
max-size="120"
max-size-policy="USED_HEAP_SIZE">
<hz:entry-listeners>
<hz:entry-listener
include-value="true"
implementation="messageEventListener" />
</hz:entry-listeners>
</hz:map>
<bean id="messageEventListener"
class="com.manheim.webservices.ovcoutbound.cep.cache.MessageEventListener" />
我将Evict作为MessageEventListener类的一部分触发,如下所示。 公共类MessageEventListener实现EntryListener {
private static final String EVICTED_MESSAGES= "direct:evictedAggregateCacheMessages";
@Override
public void entryEvicted(EntryEvent<String, HubMessageAggregate> event) {
try{
HubMessageAggregate aggregate = event.getOldValue();
exchange.getIn().setBody(aggregate);
template.send(EVICTED_MESSAGES, exchange);
}
catch(Exception e){
String error = "Unable to process the Evicted message properly with the Key " +
event.getKey();
}
}
答案 0 :(得分:1)
您必须将in-memory-format="OBJECT"
更改为in-memory-format="BINARY"
目前此请求有一个PRD:https://hazelcast.atlassian.net/wiki/display/COM/HEP+3+-+Entry+Cost+Calculator+SPI
如果你想要,你可以为hazelcast做贡献:)