2016-07-27 195 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"); 

缓存已经启动。同样,您不应该尝试停止服务器托管缓存。当应用程序未部署或服务器关闭时,它将自动停止。