如何在 Wildfly standalone-full-ha 中使用复制的 Infinispan 缓存

Die*_*olz 6 infinispan wildfly

我想使用两个 Wildfly 独立实例来使用复制的 Infinispan 缓存。我想在一个节点上插入一个值,我应该能够在另一个节点上读取它。

这是我尝试过的:

  • 我使用两个不同的运行 Debian Jessie 的虚拟机解压了完整的 WF10 发行版。
  • 我使用 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>  
...  
Run Code Online (Sandbox Code Playgroud)
  • 其余配置未修改。
  • 在两个节点上,我都得到以下日志条目(我的解释是 - 两个节点都能看到对方):
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]
Run Code Online (Sandbox Code Playgroud)
  • 在一个节点上,我创建了一个缓存编写器。在另一个节点上部署了缓存读取器:
@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);  
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)
@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");  
        }  
    }  
}  
Run Code Online (Sandbox Code Playgroud)

写入器上的值已插入,但读取器节点上没有缓存修改,缓存大小始终为 0。我尝试了 TCP 和 UDP 堆栈。我错过了什么?你能帮助我吗。

提前致谢。

Max*_*aev 3

尝试直接注入缓存引用(不通过 CacheManager 填充它)。据我了解,这是强制 infinispan 容器在新的 WildFly 10 中启动它的唯一方法。

@Resource(lookup = "java:jboss/infinispan/cache/monitor/default")
private Cache<String, String> cache; 
Run Code Online (Sandbox Code Playgroud)

小心使用 JNDI 名称(默认名称)或在配置中显式指定它