java - 使用 Wildfly 11 复制 infinispan 缓存

标签 java caching wildfly infinispan

我正在使用 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>

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

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

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

应用程序启动并毫无问题地加载缓存中的所有对象,但在其他节点中,这些对象不会被复制,而且 jgroups 集群的创建没有错误。 相反,如果我以这种方式直接注入(inject)缓存:

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

启动时的应用程序给我这个错误: “WFLYCTL0348:WAITING服务容器稳定 [300] 秒后超时。操作将回滚。首先更新服务的步骤;并且服务器未启动”

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

谢谢。

最佳答案

第一种方法没有按预期工作的原因是因为在调用 EmbeddedCacheManager.getCache() 之前您没有采取任何措施来确保安装必要的缓存配置。

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

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

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

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

在一个不相关的说明中,我建议使用未弃用的 TCPPING 配置。例如

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

... 其中套接字绑定(bind)引用配置的出站套接字绑定(bind)。 例如

<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>

关于java - 使用 Wildfly 11 复制 infinispan 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48064403/

相关文章:

caching - Nginx 虚拟主机缓存符号链接(symbolic link)

javascript - 无法向服务 worker 发布消息,因为 Controller 值为空

java - Infinispan + WildFly + Spring

java - wildfly 10 - javax.servlet.ServletContainerInitializer : Provider org. springframework.web.SpringServletContainerInitializer 不是子类型

wildfly - Infinispan 初始状态传输超时

java - JFrame 中的游戏逻辑

java - 当某人实体日期字段与当前日期相比是过去时,如何自动更新实体字段?

java - 黑屏和清理代码(LibGDX)

java JList 大小

AsyncTask 中的 Android getCacheDir