- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我看来,JCache EntryListener 的回调机制有问题。我正在尝试设置几个 jcache 成员(hazelcast 实现),每个成员在我的本地计算机上作为单个 java 应用程序运行(目前在 Ecipse 中为每个节点手动启动 main)。
节点一开始只保存一个空缓存 <Long, SpecificDataType>
。使用默认的 hazelcast-default.xml,我自己以编程方式准备了一个最小的配置,主要是注册一个 CacheEntryListener,它为创建/更新/删除/过期的条目生成一个简单的系统输出。当我启动多个(三个或更多)成员时,我希望每个成员只打印一次修改后的键/值对,其中包含条目(作为操作条目或备份条目)。问题是,在某些情况下,系统输出会多次显示,在我看来,监听器被触发得太频繁(不止一次)。
例如,在简单客户端的帮助下创建某个条目(它只是获取缓存并将 key 为 123689 的条目放入缓存中),系统输出“CREATE EVENT RECEIVED”在第三个中出现 4 次成员,甚至更常见的是第四个,依此类推......
CREATE EVENT RECEIVED:
Key: 123689, Value:SpecificDataType[...]
CREATE EVENT RECEIVED:
Key: 123689, Value:SpecificDataType[...]
CREATE EVENT RECEIVED:
Key: 123689, Value:SpecificDataType[...]
听者似乎以某种方式求幂...我做错了什么?我错过了有关配置的任何内容吗?
代码:
public static void main(String[] args) {
Member member = Member.getInstance();
try {
Cache<Long, SpecificDataType> cache = member.getCache("SpecificDataTypeCache", SpecificDataType.class);
System.out.println(cache);
} catch (Exception e) {
e.printStackTrace();
}
// shutdown loop
boolean shutdown = false;
while (!shutdown) {
if (new Scanner(System.in).nextLine().equals("shutdown")) {
shutdown = true;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// cache.clear();
member.shutdown();
}
public <T> Cache<Long, T> getCache(String name, Class<T> clazz) {
// configure the cache
MutableConfiguration<Long, T> config = new MutableConfiguration<Long, T>();
config.setStoreByValue(true).setTypes(Long.class, clazz)
.setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(TEN_SEC))
.setStatisticsEnabled(false);
// create / get cache
Cache<Long, T> cache = cacheManager.getCache(name, Long.class, clazz);
if (cache == null) {
System.out.println("create cache");
cache = cacheManager.createCache(name, config);
// create the EntryListener
MyCacheEntryListener<Long, T> clientListener = new MyCacheEntryListener<Long, T>();
// using out listener, lets create a configuration
CacheEntryListenerConfiguration<Long, T> conf = new MutableCacheEntryListenerConfiguration<Long, T>(
FactoryBuilder.factoryOf(clientListener), null, false, true);
// register to cache
cache.registerCacheEntryListener(conf);
} else {
System.out.println("get cache");
}
return cache;
}
监听器非常简单:
public class MyCacheEntryListener<K, V> implements CacheEntryCreatedListener<K, V>,
CacheEntryUpdatedListener<K, V>, CacheEntryExpiredListener<K, V>,
CacheEntryRemovedListener<K, V>, Serializable {
@Override
public void onCreated(Iterable<CacheEntryEvent<? extends K, ? extends V>> cacheEntryEvents)
throws CacheEntryListenerException {
System.out.println("CREATE EVENT RECEIVED: ");
System.out.println(printEvent(cacheEntryEvents));
}
@Override
public void onExpired(Iterable<CacheEntryEvent<? extends K, ? extends V>> cacheEntryEvents)
throws CacheEntryListenerException {
System.out.println("EXPIRE EVENT RECEIVED: ");
System.out.println(printEvent(cacheEntryEvents));
}
@Override
public void onRemoved(Iterable<CacheEntryEvent<? extends K, ? extends V>> cacheEntryEvents)
throws CacheEntryListenerException {
System.out.println("REMOVE EVENT RECEIVED: ");
System.out.println(printEvent(cacheEntryEvents));
}
@Override
public void onUpdated(Iterable<CacheEntryEvent<? extends K, ? extends V>> cacheEntryEvents)
throws CacheEntryListenerException {
System.out.println("UPDATE EVENT RECEIVED: ");
System.out.println(printEvent(cacheEntryEvents));
}
private String printEvent(Iterable<CacheEntryEvent<? extends K, ? extends V>> cacheEntryEvents) {
StringBuilder sb = new StringBuilder();
final Iterator<CacheEntryEvent<? extends K, ? extends V>> iterator = cacheEntryEvents
.iterator();
while (iterator.hasNext()) {
final CacheEntryEvent<? extends K, ? extends V> next = iterator.next();
sb.append("Key: ");
sb.append(next.getKey());
sb.append(", Value:");
sb.append(next.getValue());
sb.append("\n");
}
return sb.toString();
}
}
如有任何帮助,我们将不胜感激!
最佳答案
我已尝试使用 4 个实例和 3 个备份计数的示例,并且监听器仅按预期收到一次通知。
CREATE EVENT RECEIVED
消息之后打印 MyCacheEntryListener
本身?问候。
关于java - Hazelcast JCache CacheEntryListener 触发过于频繁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34161359/
我将 JCache 与 Hibernate 一起使用,如下所示: org.hibernate hibernate-jcache
我正在使用 JCache 来缓存 Web 响应。缓存键包含以下字段: Controller :字符串 操作:字符串 参数:数组 我创建了 ResponseKey 类并将其用作缓存键类型: public
我正在使用jquery的jCache插件http://plugins.jquery.com/project/jCache缓存我在刷新之间计算的一些数据,问题是,页面刷新后,缓存的数据似乎丢失了。
我故意在我的类路径中有几个不同的缓存提供程序。我有用于分布式缓存的 Hazelcast 和用于本地缓存的 Caffeine。我正在尝试使用 JCache (JSR107) 注释来缓存我的值。 我已经创
我使用 JCache 和 Infinispan 作为其实现。 JCache没有提供任何与集群相关的API,因此我在XML配置文件中定义了简单的复制缓存配置:
我使用了 JCache 和 EhCache 作为提供者。使用 MBean,我能够获得缓存统计信息,但缺少诸如缓存大小之类的属性。我看到 LiveCacheStatistics 提供了它,但是如何从 J
集群失效键值缓存仅通过网络发送删除命令。当一个节点上的某个键的值被更改或删除时,删除命令会与该键一起发送到每个其他节点,因此他们需要在下次需要时从持久存储中获取该数据(或重新计算它)。 我的问题是:基
正如我的问题标题所说,Memcache 是否应该与 Google 云端点配合良好?在本地,我可以使用 JCache 存储键/值对在我的应用程序中,并从 Google Cloud Endpoints A
我想将内容缓存在 JavaEE 应用程序服务器的 Java 堆上的数据库表中,如下所示。 | group | key | value
我有一个使用 Spring 缓存注释的 Spring Boot 应用程序。现在我想迁移到 JSR-107 (JCache) 注释。 这是我的方法: @Cacheable(value = "result
我正在将 JCache 注释与 Spring 和 EhCache 一起使用。如果我在方法上使用 @CacheResult 而不指定缓存名称(或类上的 @CacheDefaults),则默认缓存名称将解
假设我想缓存昂贵方法调用的结果。这些缓存条目应该有不同的过期时间(又名 TTL)。如果将条目放入同一个缓存实例中,这对于 JCache 是否可行? 我知道我可以为每个缓存分配不同的 ExpiryPol
在我看来,JCache EntryListener 的回调机制有问题。我正在尝试设置几个 jcache 成员(hazelcast 实现),每个成员在我的本地计算机上作为单个 java 应用程序运行(目
我们正在尝试以这样的方式实现 JCache,以便我们可以轻松地交换任何符合 JSR-107 的缓存提供程序。我们使用 Spring,我们的 CachingProvider Bean 如下所示: @Be
我想要一个保存项目列表的缓存。这是我的 bean 定义: public Cache> getMyCacheManager(CacheManager manager) { Cache> cach
请注意:如果这个问题中提到的缓存系统的工作方式彼此完全不同,以至于几乎不可能回答这个问题,那么我会将这个问题简化为仅兼容 JCache (JSR107) 的任何问题。 分布式缓存游戏中的主要参与者(至
我正在尝试使小型 Hazelcast 集群与简单的 JCache 兼容客户端协作。不幸的是,我得到了异常:“java.lang.IllegalArgumentException:没有使用名称注册的服务
假设我编写了一个库并希望缓存一些长时间运行或脆弱任务的结果。为此,我使用 JCache我的代码中的 API。 所以我的pom.xml将包含一个依赖项,例如 javax.cache c
我正在使用 JCache API 在我的应用程序中配置缓存,该应用程序将 spring 缓存与 Ehcache 3 结合使用。 cacheManager.createCache("users", ne
在我的 Spring+JCache+ehcache 3.5 项目中,我有一个方法应该清除两个缓存。 我试过: @CacheRemoveAll(cacheName = "cache1") @CacheR
我是一名优秀的程序员,十分优秀!