如何在 Wildfly Standalone-full-ha 中使用复制的 Infinispan 缓存
Posted
技术标签:
【中文标题】如何在 Wildfly Standalone-full-ha 中使用复制的 Infinispan 缓存【英文标题】:How to use replicated Infinispan cache in Wildfly standalone-full-ha 【发布时间】:2016-07-01 08:50:16 【问题描述】:我想通过两个 Wildfly 独立实例使用复制的 Infinispan 缓存。我想在一个节点上插入一个值,我应该能够在另一个节点上读取它。
这是我尝试过的:
我使用两个不同的虚拟机解压了完整的 WF10 发行版 运行 Debian Jessie 的机器。 我使用standalone-full-ha.xml 配置运行两台机器。 我将绑定从 localhost 更改为 VM 的 IP 地址 - 所有端口都可以从外部到达。 我通过在配置中插入以下代码添加了另一个缓存:<subsystem xmlns="urn:jboss:domain:infinispan:4.0">
<cache-container name="monitor" default-cache="default">
<transport lock-timeout="60000"/>
<replicated-cache name="default" mode="SYNC">
<transaction mode="BATCH"/>
</replicated-cache>
</cache-container>
...
其余配置未修改。
在两个节点上,我得到以下日志条目(我的解释是 -
两个节点互相看到):
2016-03-13 11:19:43,160 INFO [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (MSC service thread 1-1) ISPN000094: Received new cluster view for channel monitor: [wf1|5] (2) [wf1, wf2]
我在一个节点上创建了一个缓存写入器。在另一个节点上缓存
阅读器已部署:
@Singleton
@Startup
public class CacheWriter
private final static Logger LOG = LoggerFactory.getLogger(CacheWriter.class);
@Resource(lookup = "java:jboss/infinispan/container/monitor")
private EmbeddedCacheManager cacheManager;
private Cache<String, String> cache;
@PostConstruct
public void init()
cache = cacheManager.getCache();
LOG.info("Cache name: " + cache.getName());
@Schedule(hour = "*", minute = "*", second = "0", persistent = false)
public void createDateString()
Long date = new Date().getTime();
updateCache("date", date.toString());
public void updateCache(String key, String value)
if (cache.containsKey("date"))
LOG.info("Update date value: " + value);
cache.put(key, value);
else
LOG.info("Create date value: " + value);
cache.put(key, value);
@Singleton
@Startup
public class CacheReader
private final static Logger LOG = LoggerFactory.getLogger(CacheReader.class);
@Resource(lookup = "java:jboss/infinispan/container/monitor")
private EmbeddedCacheManager cacheManager;
private Cache<String, String> cache;
@PostConstruct
public void init()
cache = cacheManager.getCache();
LOG.info("Cache name: " + cache.getName());
@Schedule(hour = "*", minute = "*", second = "10", persistent = false)
public void readDateString()
LOG.info("Cache size: " + cache.keySet().size());
if (cache.containsKey("date"))
LOG.info("The date value is: " + cache.get("date"));
else
LOG.warn("No date value found");
写入器上的值已插入,但读取器节点上没有缓存修改,缓存大小始终为 0。我尝试了 TCP 和 UDP 堆栈。我错过了什么?你能帮帮我吗?
提前致谢。
【问题讨论】:
getCacheName 是否返回相同的名称?当我使用缓存管理器时,我通常会要求一个明确命名的缓存 您也可以尝试使用现有的缓存管理器之一,例如 ejb 两个节点上的缓存名称相同,将注入的缓存更改为 ejb 也无济于事 - 所以没有成功。 您的 Wildfly 节点是否已集群?它只能在集群模式下工作。只是在这里进行健全性检查。 是的,我使用standalone-full-ha.xml 配置,我认为由于上面的日志消息,集群连接已建立。 【参考方案1】:您应该注入每个缓存实例,而不是注入 CacheManager
。在做的时候,请记住以下几点。
transport
标签添加到cache-container
。这是复制或分布式模式所必需的。
standalone-full-ha.xml
中的示例配置
<cache-container name="replicated_cache" default-cache="default" module="org.wildfly.clustering.server" jndi-name="infinispan/replicated_cache">
<transport lock-timeout="60000"/>
<replicated-cache name="customer" mode="SYNC" jndi-name="infinispan/replicated_cache/customer">
<transaction locking="OPTIMISTIC" mode="FULL_XA"/>
<eviction strategy="NONE"/>
</replicated-cache>
</cache-container>
如下注入资源
@Resource(lookup = "java:jboss/infinispan/replicated_cache/customer")
private Cache<String, Customer> customerCache;
【讨论】:
【参考方案2】:尝试直接注入缓存引用(而不是通过 CacheManager 填充)。据我了解,这是强制 infinispan 容器在新的 WildFly 10 中启动它的唯一方法。
@Resource(lookup = "java:jboss/infinispan/cache/monitor/default")
private Cache<String, String> cache;
谨慎使用 JNDI 名称(默认名称)或在配置中明确指定它
【讨论】:
以上是关于如何在 Wildfly Standalone-full-ha 中使用复制的 Infinispan 缓存的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Wildfly 中将外部属性文件加载到 Spring Boot