- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个通过 infinispan 缓存 .addListener() 方法添加的 CacheEntryExpired 监听器的 n 实现。
监听器事件在条目到期时触发。问题是,每次事件都会被触发两次。
我验证(使用调试器和cache.getListeners())缓存不包含我的同一监听器的两个实例。 getListeners的结果是:
(java.util.Collections$UnmodifiableSet<E>) [org.infinispan.iteration.impl.LocalEntryRetriever$PartitionListener@666SAT, my.supercool.package.MyExpirationEventListenerImpl@666TAN]
所以只有一个听众。监听器实现接口(interface):
@Listener
public interface TokenExpirationEventListener<T> {
@CacheEntryExpired
public void entryExpired(CacheEntryExpiredEvent<String, T> event);
}
实现如下所示:
@Override
@CacheEntryExpired
public void entryExpired(CacheEntryExpiredEvent<String, T> event) {
CODE
}
但是从接口(interface)中删除 @CacheEntryExpired 和 @Listener 注释(只是尝试)并不会导致事件仅发生一次。
我做错了什么,我在每个条目到期事件上收到两个事件吗?
infinispan 版本是 8.2.0.final。
编辑2:我能够追踪到所有导致问题的配置。允许重现错误的代码是:
import java.util.concurrent.TimeUnit;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.ClusteringConfigurationBuilder;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.configuration.global.TransportConfigurationBuilder;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryExpired;
import org.infinispan.notifications.cachelistener.event.CacheEntryExpiredEvent;
@Listener
public class TestMain {
private Cache<String, String> cache;
public static void main(String[] args) throws Exception {
new TestMain().test();
}
private void test() throws Exception{
configureInfinispan();
cache.put("test", "test", 10, TimeUnit.SECONDS);
cache.put("test2", "test", 10, TimeUnit.SECONDS);
while(true){
Thread.sleep(100);
}
}
public void configureInfinispan(){
DefaultCacheManager defaultCacheManager = configureCachaManager();//globalConfigurationBuilder.build(), defaultConfigurationBuilder.build(), /*startNow*/ true)
Configuration conf = defaultCacheManager.getDefaultCacheConfiguration();
ConfigurationBuilder cacheConfigBuilder = new ConfigurationBuilder().read(conf);
cacheConfigBuilder.expiration().enableReaper().wakeUpInterval(5, TimeUnit.SECONDS); //to speed test results
duplicationReason2(cacheConfigBuilder);
defaultCacheManager.defineConfiguration("testCache", cacheConfigBuilder.build());
cache = defaultCacheManager.getCache("testCache");
cache.addListener(new TestMain());
System.out.println("conf");
}
public DefaultCacheManager configureCachaManager(){
GlobalConfigurationBuilder globalConfigurationBuilder = new GlobalConfigurationBuilder();
ConfigurationBuilder defaultConfigurationBuilder = new ConfigurationBuilder();
duplicationReason1(defaultConfigurationBuilder, globalConfigurationBuilder);
return new DefaultCacheManager(globalConfigurationBuilder.build(), defaultConfigurationBuilder.build(), true);
}
@CacheEntryExpired
public void entryExpired(CacheEntryExpiredEvent<String, String> event) {
System.out.println("Expired:" + event.getKey());
}
private void duplicationReason2(ConfigurationBuilder configurationBuilder) {
configurationBuilder.persistence() //enable persistence
.passivation(false)
.addSingleFileStore()
.location("C:/test/infinispan")
// Disable writing anything to the file except when we do shutdown
.maxEntries(0)
.shared(false)
.fetchPersistentState(true)
.async() //write-behind
.enable() //write-behind
.threadPoolSize(Runtime.getRuntime().availableProcessors()) //writing threads
.preload(true); //load data from file on startup
}
private void duplicationReason1(ConfigurationBuilder configurationBuilder, GlobalConfigurationBuilder globalConfigurationBuilder){
configureCacheOperationalMode(configurationBuilder);
configureTransport(globalConfigurationBuilder);
}
private void configureCacheOperationalMode(ConfigurationBuilder configurationBuilder) {
ClusteringConfigurationBuilder clusteringConfigurationBuilder = configurationBuilder.clustering();
clusteringConfigurationBuilder.cacheMode(CacheMode.REPL_ASYNC);
}
private void configureTransport(GlobalConfigurationBuilder globalConfigurationBuilder) {
TransportConfigurationBuilder transportConfigurationBuilder = globalConfigurationBuilder.transport().defaultTransport();
transportConfigurationBuilder.addProperty("configurationFile", "default-configs/default-jgroups-udp.xml");
}
}
运行此命令(不幸的是,您需要自己终止主线程)导致事件被打印两次。
有两种方法共同导致这种情况。评论其中一个并保留第二个会导致事件触发一次。
这些方法被命名为 duplicationReason1 和 duplicationReason2。
也许配置中有一些我不明白的地方?
最佳答案
好的,我能够看到您添加的测试用例发生了什么,谢谢!
这是集群缓存 atm 中的一个错误。我登录了 [1] 进行调查,如果您需要更新,请关注。
虽然我们可以解决重复问题,但您仍然可能会出现其他可能的重复问题,因此您仍然应该能够处理它们。何时生成重复项的示例可以在“并发过期访问”下的 [2] 中找到。因此,您通常应该忽略具有空值的过期事件。
[1] https://issues.jboss.org/browse/ISPN-6405[2]http://blog.infinispan.org/2015/10/expiration-enhancements.html
关于java - Infinispan @CacheEntryExpired 监听器 - 事件触发两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36014879/
我不想使用 Infinispan 作为我的数据源。提供什么样的数据库支持?是否需要 Hibernate 二级缓存? 最佳答案 Infinispan 可以配置持久缓存加载器,并且在支持的选项中,支持基于
我刚刚尝试将我的应用程序更新到 Infinspan 10.1.8.Final。我通过 build.gradle 中的此依赖项将 Infinispan 用作 2 级休眠 (5.4.18.Final) 缓
我正在使用 Infinispan 缓存。有没有办法在运行时获取条目的 TTL(或 lifepsan)?我看到界面CacheEntry作为 getLifespan() API,但我看不到如何获取 Cac
我们有三个服务必须位于集群中。因此,我们使用 Infinispan 来集群节点并在这些服务之间共享数据。成功重新启动后,有时我会遇到异常,并收到另一节点中左侧节点的“ View 已更改”事件。实际上所
我有以下 infinispan xml 并得到解析异常。javax.xml.stream.XMLStreamException:[行,列] 处的 ParseError:[3,36]消息:遇到意外元素“
我已将我的应用程序部署为 tomcat 6 服务上的 myApp1。由于一些要求,我复制了myApp1并粘贴到webapp下作为myApp2。现在我重新启动了tomcat并点击 myApp1 的网址。
我使用 infinispan-5.1.6.FINAL 作为远程缓存服务器和热棒协议(protocol)来访问它。但发现它没有按预期工作,即按照下面的配置,在 1ms 后不会驱逐键的缓存值
交叉张贴在 https://developer.jboss.org/thread/279735 假设我们有多个 docker 容器(每个都有 java webapps,所以本质上是多个 JVM),每个
我有一个使用 Infinispan 6.0.1.Final 的 Spring Boot 应用程序。我有两个类 A 和 B。B 扩展了 A。并且我有一个存储 B 类型对象的缓存。现在,我做了一个小更改,
在 jgroups 自动选择集群中对大约 180,000,000 条记录进行索引,一切正常(我索引和查询数据,结果似乎有效),但在每次启动和关闭时我都会遇到此类错误。这是我必须担心的实验模式造成的吗?
我们需要一个重新启动的持久缓存。主要目标是在启动时预加载尽可能多的数据。 因此要求是: 从磁盘存储预加载 从已使用热缓存运行的邻居节点预加载 看起来 Infinispan 可能是一个合适的选择,但
我编写了一个小型 infinispan 缓存 PoC(代码如下)来尝试评估 infinispan 性能。在运行它时,我发现对于我的配置 infinispan 显然不会从磁盘中清除缓存条目的旧副本,导致
我们使用 Infinispan 4.0 作为我们的缓存提供程序(我知道它有点过时,因为版本 9 是最新的)。话虽如此,我在阅读文档时有点困惑: Infinispan, by default, acqu
根据 infinispan 的文档:http://docs.jboss.org/infinispan/5.0/apidocs/ evict() API 不会从调用它的缓存存储上的集群中的任何其他缓存存
尝试在 thorntail project-defaults.yaml 上配置缓存,但是在尝试在 wildfly 上启动或部署时遇到以下问题。 错误必须在全局配置中设置传输才能定义集群缓存。 不确定我
环境 嵌入 Infinispan 9.4.18 3 个节点以复制模式缓存 RocksDB 存储(或其他,无关紧要) 重现步骤 创建基于 TCP 的集群 创建缓存 将实体添加到缓存 检查实体是否存储在每
如何将数据预加载到infinispan本地缓存?我有一个预先存在的应用程序表,其中包含键值对。我希望 infinispan 缓存表中的数据,当我读/写数据到缓存时,我希望基础表保持同步。 infini
我使用 JBoss 6.4 EAP 和 Infinispan 6。 org.infinispan infinispan-core 6.0.2.G1.Final 我有
我们使用具有 6 个实例的 JBoss 集群 (EAP 6.4.10),并大量使用捆绑的 Infinispan 5.2.11 来处理不同的内存网格用例。然而,它们中的大多数是分布式缓存(实际上是复制的
我们计划在客户端服务器模式下使用 Infinispan。该架构有许多客户端(客户端 1、客户端 2 等)和分布式 infinispan 网络。 我们需要定期更新缓存中的数据,比如每5小时更新一次。所有
我是一名优秀的程序员,十分优秀!