2016-07-27 117 views
0

我正在使用Infinispan 7.2.3處理Wildfly 9。Infinispan Jgroups在部署戰爭後崩潰

我正視與分佈式緩存一個奇怪的問題:

  1. 在應用服務器,我有N個部署戰爭暴露REST服務
  2. 每個服務代碼有共同的責任來檢查CacheManager si已經存在於JNDI中,如果是的話,它使用它,否則我創建一個新的並將其綁定到JNDI。所以每場戰爭都會使用獨特的CacheManager實例。
  3. Infinispan CacheManager配置爲分佈式模式。

infinispan和jgroups從應用程序服務器提供。 重新部署操作後,所有的戰爭(undploy和部署),如果我突然開始發送REST請求,這些服務我得到這個錯誤:

18:23:42,366 WARN [org.infinispan.topology.ClusterTopologyManagerImpl] (transport-thread--p2-t12) ISPN000197: Error updating cluster member list: org.infinispan.util.concurrent.Timeout 
Exception: Replication timeout for ws-7-aor-58034 
    at org.infinispan.remoting.transport.AbstractTransport.parseResponseAndAddToResponseList(AbstractTransport.java:87) 
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:586) 
    at org.infinispan.topology.ClusterTopologyManagerImpl.confirmMembersAvailable(ClusterTopologyManagerImpl.java:402) 
    at org.infinispan.topology.ClusterTopologyManagerImpl.updateCacheMembers(ClusterTopologyManagerImpl.java:393) 
    at org.infinispan.topology.ClusterTopologyManagerImpl.handleClusterView(ClusterTopologyManagerImpl.java:309) 
    at org.infinispan.topology.ClusterTopologyManagerImpl$ClusterViewListener$1.run(ClusterTopologyManagerImpl.java:590) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

18:23:42,539 WARN [org.infinispan.topology.ClusterTopologyManagerImpl] (remote-thread--p11-t2) ISPN000329: Unable to read rebalancing status from coordinator ws-7-aor-19211: org.infinispan.util.concurrent.TimeoutException: Node ws-7-aor-19211 timed out 
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:248) 
    at org.infinispan.remoting.transport.jgroups.JGroupsTransport.invokeRemotely(JGroupsTransport.java:561) 
    at org.infinispan.topology.ClusterTopologyManagerImpl.fetchRebalancingStatusFromCoordinator(ClusterTopologyManagerImpl.java:129) 
    at org.infinispan.topology.ClusterTopologyManagerImpl.start(ClusterTopologyManagerImpl.java:118) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.infinispan.commons.util.ReflectionUtil.invokeAccessibly(ReflectionUtil.java:168) 
    at org.infinispan.factories.AbstractComponentRegistry$PrioritizedMethod.invoke(AbstractComponentRegistry.java:869) 
    at org.infinispan.factories.AbstractComponentRegistry.invokeStartMethods(AbstractComponentRegistry.java:638) 
    at org.infinispan.factories.AbstractComponentRegistry.registerComponentInternal(AbstractComponentRegistry.java:207) 
    at org.infinispan.factories.AbstractComponentRegistry.registerComponent(AbstractComponentRegistry.java:156) 
    at org.infinispan.factories.AbstractComponentRegistry.getOrCreateComponent(AbstractComponentRegistry.java:277) 
    at org.infinispan.factories.AbstractComponentRegistry.invokeInjectionMethod(AbstractComponentRegistry.java:227) 
    at org.infinispan.factories.AbstractComponentRegistry.wireDependencies(AbstractComponentRegistry.java:132) 
    at org.infinispan.remoting.inboundhandler.GlobalInboundInvocationHandler$2.run(GlobalInboundInvocationHandler.java:156) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: org.jgroups.TimeoutException: timeout waiting for response from ws-7-aor-19211, request: [email protected], req_id=6, mode=GET_ALL, target=ws-7-aor-19211 
    at org.jgroups.blocks.MessageDispatcher.sendMessage(MessageDispatcher.java:427) 
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.processSingleCall(CommandAwareRpcDispatcher.java:433) 
    at org.infinispan.remoting.transport.jgroups.CommandAwareRpcDispatcher.invokeRemoteCommand(CommandAwareRpcDispatcher.java:241) 
    ... 19 more 

這是CacheManager中的initalization代碼:

try { 
      ctx = new InitialContext(); 
      cacheManager = (DefaultCacheManager)ctx.lookup(SessionConstants.CACHE_MANAGER_GLOBAL_JNDI_NAME); 
     } catch (NamingException e1) { 
      logger.error("SessionHooverJob not able to find: java:global/klopotekCacheManager ... a new instance will be created!");    
     } 

     if (cacheManager ==null){ 

     ... 
     configurator = ConfiguratorFactory.getStackConfigurator("default-configs/default-jgroups-udp.xml"); 
       ProtocolConfiguration udpConfiguration = configurator.getProtocolStack().get(0); 
       if ("UDP".equalsIgnoreCase(udpConfiguration.getProtocolName()) && mcastAddr != null){ 
        udpConfiguration.getProperties().put("mcast_addr", mcastAddr); 
       }    
       GlobalConfigurationBuilder gcb = new GlobalConfigurationBuilder(); 
       gcb.globalJmxStatistics().enabled(true).allowDuplicateDomains(true); 
       gcb.transport().defaultTransport() 
       .addProperty(JGroupsTransport.CONFIGURATION_STRING, configurator.getProtocolStackString()); 
       //.addProperty(JGroupsTransport.CONFIGURATION_FILE, "config/jgroups.xml"); 

       ConfigurationBuilder builder = new ConfigurationBuilder(); 
       builder.clustering().cacheMode(CacheMode.DIST_SYNC).expiration().lifespan(24l, TimeUnit.HOURS);; 

       cacheManager = new DefaultCacheManager(gcb.build(), 
         builder.build()); 

如果在部署後經過40-60秒左右的時間,則不會發生此問題。 如果我有一個JNDI會話管理器已經構建了jgroups通道,即使我將所有的戰爭解除...爲什麼jgroups嘗試再次進行再平衡?

是否有一些配置屬性設置?

回答

1

您不應該使用Wildfly提供的Infinispan/JGroups庫,並且JNDI不是真正推薦共享Cache/CacheManager實例的方式。

相反,您應該部署自己的Infinispan/JGroups版本,然後使用像CDI這樣的東西將CacheManager注入到需要它的地方。 This quickstart向您展示瞭如何使用JBoss Data Grid,它是Infinispan的受支持版本。

該存儲庫包含其他快速入門,如this one centered on CDI injection of Infinispan Cache and JSR-107 Cache instances

+0

爲了共享緩存管理器,使用JNDI的方式寫在infinispan指南(作爲示例報告)上,並被其他開發人員使用。是在應用程序服務器內部署的所有戰爭中共享相同的cacheManager(構建大對象)的一種方法。 https://docs.jboss.org/infinispan/5.0/apidocs/org/infinispan/manager/DefaultCacheManager.html 「一旦構建,CacheManagers應該可用於任何需要緩存的組件,通過JNDI或通過其他機制,如IoC容器「。 – Alex

+0

沒錯,javadoc需要更新,因爲JNDI確實應該用於非常特定的用例。 CDI是一種更容易處理的技術,並且比JNDI更好地處理生命週期(創建/開始/停止/銷燬)。 –

+0

所以你的迴應是JNDI不能釋放所有的mbean資源? – Alex

3

只要您瞭解服務器託管的Infinispan資源的生命週期要求/限制,即使通過JNDI使用WildFly的Infinispan子系統的緩存也沒有什麼問題。在WildFly中,所有Infinispan資源都是按需創建/啓動的,包括緩存管理器,緩存配置和緩存。如果沒有服務需要給定的Infinispan資源,它不會啓動(也不會綁定到JNDI)。同樣,當任何服務不再需要給定的Infinispan資源時,它都會停止(並刪除其JNDI綁定)。因此,爲了通過JNDI查找Infinispan資源,您必須先強制​​它啓動。 最簡單的方法是創建資源引用(即resource-ref或resource-env-ref)。 例如

<resource-ref> 
    <res-ref-name>infinispan/mycontainer</res-ref-name> 
    <lookup-name>java:jboss/infinispan/container/mycontainer</lookup-name> 
</resource-ref> 

您現在可以在應用程序jndi命名空間中查找緩存管理器。 例如

Context ctx = new InitialContext(); 
EmbeddedCacheManager manager = (EmbeddedCacheManager) ctx.lookup("java:comp/env/infinispan/mycontainer"); 

緩存管理器已經啓動。此外,您不應該嘗試停止服務器管理的緩存管理器。此外,您不能保證安裝Infinispan子系統中爲此容器定義的任何緩存配置。因此,使用getCache("...")方法不是獲得對服務器管理的高速緩存的引用的可靠方式。如果您想依據子系統中定義的特定緩存,則可以爲緩存本身創建資源引用。 例如

<resource-ref> 
    <res-ref-name>infinispan/mycache</res-ref-name> 
    <lookup-name>java:jboss/infinispan/cache/mycontainer/mycache</lookup-name> 
</resource-ref> 

您現在可以直接查找緩存。

Cache<?, ?> cache = (Cache) ctx.lookup("java:comp/env/infinispan/mycache"); 

緩存已經啓動。同樣,您不應該嘗試停止服務器託管緩存。當應用程序未部署或服務器關閉時,它將自動停止。