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