繁体   English   中英

使用Wildfly 11复制了infinispan缓存

[英]Replicated infinispan cache with Wildfly 11

我正在使用Wildfly-11.0.0.Final上的java 8和java ee7开发分布在多节点上的Web应用程序,并且我使用了infinispan缓存来共享数据。 这是缓存的配置:

<cache-container name="mycache-container" default-cache="my-cache" jndi-name="infinispan/mycache-container">
    <transport lock-timeout="60000"/>
    <replicated-cache name="my-cache" jndi-name="infinispan/mycache-container/my-cache" mode="ASYNC">
        <locking isolation="READ_COMMITTED"/>
        <transaction locking="OPTIMISTIC" mode="NON_XA"/>
        <eviction strategy="NONE"/>
    </replicated-cache>
</cache-container>

这是用于复制缓存的jgroups子系统的配置:

<subsystem xmlns="urn:jboss:domain:jgroups:5.0">
        <channels default="ee">
            <channel name="ee" stack="tcpping" cluster="ejb"/>
        </channels>
        <stacks>
            <stack name="tcpping">
                <transport type="TCP" socket-binding="jgroups-tcp"/>
                <protocol type="org.jgroups.protocols.TCPPING">
                    <property name="initial_hosts">
                        node1[7600], node2[7600]
                    </property>
                </protocol>
                <protocol type="MERGE3"/>
                <protocol type="FD_SOCK"/>
                <protocol type="FD_ALL"/>
                <protocol type="VERIFY_SUSPECT"/>
                <protocol type="pbcast.NAKACK2"/>
                <protocol type="UNICAST3"/>
                <protocol type="pbcast.STABLE"/>
                <protocol type="pbcast.GMS"/>
                <protocol type="MFC"/>
                <protocol type="FRAG2"/>
            </stack>
        </stacks>
    </subsystem>

在应用程序启动时,我从数据库加载所有实体,然后放入缓存中。 如果我以这种方式通过容器注入缓存:

@Resource(lookup="java:jboss/infinispan/mycache-container") 
EmbeddedCacheManager container;

@PostConstruct
public void init(){
    Cache mycache = container.getCache();
}

该应用程序启动并加载缓存中的所有对象都没有问题,但是在其他节点中,这些对象也不会被复制,即使创建jgroups群集也不会出错。 相反,如果我以这种方式直接注入缓存:

@Resource(lookup="java:jboss/infinispan/mycache-container/my-cache") 
Cache myCache;

该应用程序在启动时给我以下错误:“ WFLYCTL0348:等待[300]秒后超时,等待服务容器的稳定性。操作将回滚。首先更新该服务的步骤;服务器未启动”

如何使用缓存来防止启动时超时,并能够在所有节点上复制该对象?

谢谢。

第一种方法无法按预期工作的原因是,在调用EmbeddedCacheManager.getCache()之前,您没有做任何事情来确保已安装必需的缓存配置。

为确保已安装必需的缓存配置,您可以:

  1. 直接注入缓存(如您在第二种方法中所做的那样)
  2. 通过@Resource或resource-ref向您的应用程序添加对必需的缓存配置的依赖关系。

我总是建议#1,因为它更直观,更简洁,并且缓存生命周期由容器处理。

关于“等待容器稳定的超时”的原因,我不能肯定地说,除非看到将对象加载到缓存中的代码以及相关的堆栈跟踪。 只是一个猜测-您确定交易模式为NON_XA吗? 这意味着缓存操作是通过同步提交给活动的UserTransaction的。 这不是常见的要求。 如果您正在使用@PostConstruct方法加载缓存,并且未正确处理事务,则这可能会阻止您的组件启动(导致等待容器稳定的超时)。

与此无关的是,我建议使用不建议使用的TCPPING配置。 例如

<socket-discovery-protocol type="TCPPING" socket-bindings="node0 node1"/>

...其中套接字绑定参考配置了出站套接字绑定。 例如

<outbound-socket-binding name="node0">
    <remote-destination host="node0" port="7600"/>
</outbound-socket-binding>
<outbound-socket-binding name="node1">
    <remote-destination host="node1" port="7600"/>
</outbound-socket-binding>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM