首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Wildfly 11复制无穷大缓存

用Wildfly 11复制无穷大缓存
EN

Stack Overflow用户
提问于 2018-01-02 16:22:57
回答 1查看 2.1K关注 0票数 3

我正在开发一个web应用程序,它分布在多个节点上,带有java 8,在通配符上使用java ee7 -11.0.Final,我使用无限缓存来共享数据。这是缓存的配置:

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
<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>

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

代码语言:javascript
复制
@Resource(lookup="java:jboss/infinispan/mycache-container") 
EmbeddedCacheManager container;

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

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

代码语言:javascript
复制
@Resource(lookup="java:jboss/infinispan/mycache-container/my-cache") 
Cache myCache;

启动时的应用程序会给我以下错误:"WFLYCTL0348: 300秒后超时,等待服务容器稳定。操作将回滚。第一次更新服务的步骤;服务器不启动。“

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

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-01-04 15:54:46

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

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

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

我总是推荐#1,因为它更直观,更少冗长,缓存生命周期由容器处理。

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

在一个无关的注意事项上,我建议使用非反对的TCPPING配置。例如:

代码语言:javascript
复制
<socket-discovery-protocol type="TCPPING" socket-bindings="node0 node1"/>

..。套接字绑定引用配置的出站套接字绑定。例如:

代码语言:javascript
复制
<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>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48064403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档