如何在 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。在做的时候,请记住以下几点。

确保输入正确的 JNDI 名称。为避免混淆,您可以在配置中明确提及 JNDI 名称 将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 服务器的 IP 地址

如何在 WildFly 上禁用 WELD

如何在 Wildfly 中将外部属性文件加载到 Spring Boot

如何在 Wildfly 10 中配置数据源?

如何在 Wildfly 21 上配置 Jakarta 持久性

如何在 Wildfly 中配置 Jackson?