战争部署后,Infinispan Jgroups崩溃

时间:2016-07-27 17:09:26

标签: web-applications infinispan jgroups wildfly-9

我使用Infinispan 7.2.3在Wildfly 9上工作。

我正面临与分布式缓存相关的奇怪问题:

  1. 在应用程序服务器上,我有N个部署战争暴露REST服务
  2. 每个服务代码都有共同的职责来检查缓存管理器是否已存在于JNDI上,如果是,则使用它,否则我创建一个新的并将其绑定到JNDI。所以每次战争都使用一个唯一的CacheManager实例。
  3. Infinispan CacheManager以分布式模式配置。
  4. infinispan和jgroup是从应用程序服务器提供的。 在重新部署所有战争的操作(取消部署和部署)后,如果我突然开始向这些服务发送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: org.jgroups.blocks.UnicastRequest@75770aa6, 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的初始化代码:

        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会再次尝试重新平衡?

    是否需要设置一些配置属性?

2 个答案:

答案 0 :(得分:3)

使用WildFly的Infinispan子系统中的缓存,即使是通过JNDI也没有错,只要您了解服务器管理的Infinispan资源的生命周期要求/约束​​。在WildFly中,所有Infinispan资源都是按需创建/启动的,包括缓存管理器,缓存配置和缓存。如果没有服务需要给定的Infinispan资源,则不会启动它(也不会绑定到JNDI)。同样,当任何服务不再需要给定的Infinispan资源时,它将被停止(并且其JNDI绑定被删除)。因此,为了通过JNDI查找Infinispan资源,您必须首先强制它启动。 最简单的方法是创建资源引用(即resource-ref或resource-env-ref)。 e.g。

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

您现在可以在应用程序jndi名称空间中查找缓存管理器。 e.g。

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

缓存管理器已经启动。此外,您永远不应该尝试停止服务器管理的缓存管理器。此外,您无法保证安装此容器的Infinispan子系统中定义的任何缓存配置。因此,使用getCache("...")方法不是获取对服务器管理的缓存的引用的可靠方法。如果要依赖子系统中定义的特定缓存,则应为缓存本身创建资源引用。 e.g。

<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");

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

答案 1 :(得分: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