2016-03-15 36 views
2

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

这里是我的尝试:

  • 我解压使用两个不同的虚拟 maschines运行Debian杰西全WF10分布。
  • 我使用standalone-full-ha.xml配置运行两台maschines。
  • 我将绑定从localhost更改为虚拟机的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堆栈。我错过了什么?你可以帮我吗。

在此先感谢。

+0

不getCacheName返回相同的名字吗?当我使用高速缓存管理器时,我通常会要求提供明确指定的高速缓存 –

+0

您也可以尝试使用其中一个现有高速缓存管理器,例如ejb –

+0

两个节点上的高速缓存名称相同,并且将注入的高速缓存更改为ejb也无济于事 - 所以没有成功。 –

回答

1

尝试直接注入缓存引用(而不是通过CacheManager填充它)。据我所知,这只是迫使Infinispan的容器在新WildFly 10

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

通过小心的JNDI名称(默认之一)来启动它或者配置显式地指定它

0

相反的方式注入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; 
相关问题