web-applications infinispan jgroups wildfly-9

web applications - Infinispan Jgroups se bloquea después de la implementación de la guerra



web-applications wildfly-9 (2)

Estoy trabajando en Wildfly 9 con Infinispan 7.2.3.

Me enfrento a un extraño problema relacionado con la memoria caché distribuida:

  1. En el servidor de aplicaciones, N implementó guerras exponiendo los servicios REST
  2. Cada código de servicio tiene el deber común de verificar si un CacheManager ya está presente en JNDI, si es así, lo usa, de lo contrario, creo uno nuevo y lo enlace al JNDI. Entonces, cada guerra funciona con una instancia única de CacheManager.
  3. El Infinispan CacheManager está configurado en modo distribuido.

El infinispan y jgroups se proporcionan desde el servidor de aplicaciones. Después de una operación de reintroducción (despliegue y despliegue) de todas las guerras, si de repente empiezo a enviar solicitudes REST a estos servicios, aparece este error:

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

Este es el código de inicialización para 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());

El problema no ocurre si transcurre un tiempo de aproximadamente 40-60 segundos después de la implementación. Si tengo 1 administrador de sesión JNDI que ha creado el canal jgroups, incluso si no implementé toda la guerra ... ¿por qué jgroups intentan reequilibrar de nuevo?

¿Hay alguna propiedad de configuración para configurar?


No debe usar las bibliotecas Infinispan / JGroups proporcionadas por Wildfly, y JNDI no es realmente la forma recomendada de compartir instancias de Cache / CacheManager.

En su lugar, debe implementar su propia versión Infinispan / JGroups, y luego usar cosas como CDI para inyectar el CacheManager donde lo necesite. Este inicio rápido le muestra cómo puede hacerlo utilizando JBoss Data Grid, que es la versión compatible de Infinispan.

El repositorio contiene otros inicios rápidos como este centrado en la inyección de CDI de las instancias de Caché Infinispan y JSR-107 .


No hay nada de malo en utilizar las memorias caché del subsistema Infinispan de WildFly, incluso a través de JNDI, siempre que conozca los requisitos / restricciones del ciclo de vida de los recursos de Infinispan administrados por el servidor. En WildFly, todos los recursos Infinispan se crean / inician a demanda, incluidos los administradores de caché, configuraciones de caché y cachés. Si ningún servicio requiere un recurso Infinispan determinado, no se inicia (ni está vinculado a JNDI). Del mismo modo, cuando ningún servicio requiere más un recurso Infinispan determinado, se detiene (y se elimina su enlace JNDI). Por lo tanto, para buscar un recurso Infinispan a través de JNDI, primero debe forzarlo para que se inicie. La forma más sencilla de hacerlo es crear una referencia de recursos (es decir, un recurso-ref o recurso-env-ref). p.ej

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

Ahora puede buscar el administrador de caché en el espacio de nombres de su aplicación jndi. p.ej

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

El administrador de caché ya estará iniciado. Además, nunca debe intentar detener un administrador de caché administrado por el servidor. Además, no puede garantizar que se instale ninguna de las configuraciones de caché que están definidas dentro del subsistema Infinispan para este contenedor. Por lo tanto, el uso de los getCache("...") no es una forma confiable de obtener una referencia a un caché administrado por el servidor. Si desea depender de un caché específico como se define en el subsistema, debe crear una referencia de recursos para el mismo caché. p.ej

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

Ahora puede buscar el caché directamente.

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

La memoria caché ya estará iniciada. Del mismo modo, no debe intentar detener una caché administrada por el servidor. Se detendrá automáticamente cuando la aplicación se haya desplegado o el servidor esté apagado.