2016-07-27 3 views
0

Infinispan 7.2.3으로 Wildfly 9에서 작업하고 있습니다. 내가 분산 캐시와 관련된 이상한 문제까지 직면하고있어Infinispan Jgroups가 전쟁 배포 후 충돌합니다.

: 내가 N이 응용 프로그램 서버에서

  1. 각 서비스 코드가 있는지 확인하는 일반적인 의무가 REST 서비스를 노출 전쟁 배포 된 CacheManager는 이미 JNDI에 존재합니다. 그렇다면 사용합니다. 그렇지 않으면 새 JNDI를 만들고 JNDI에 바인드합니다. 따라서 모든 전쟁은 고유 한 CacheManager 인스턴스로 작동합니다.
  2. Infinisan CacheManager는 분산 모드로 구성됩니다.

infinispan 및 jgroup은 응용 프로그램 서버에서 제공됩니다. 모든 전쟁의 재 배포 작업 후 (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 초가 지나면 문제가 발생하지 않습니다. jgroups 채널을 구축 한 1 개의 JNDI 세션 관리자가있는 경우 모든 전쟁의 배포를 취소해도 ... jgroup이 다시 균형을 조정하려고하는 이유는 무엇입니까?

설정할 구성 속성이 있습니까?

답변

1

Wildfly에서 제공하는 Infinispan/JGroups 라이브러리를 사용하지 않아도되며 JNDI는 Cache/CacheManager 인스턴스를 공유하는 데 실제로 권장되는 방법은 아닙니다.

대신 자신의 Infinispan/JGroups 버전을 배포 한 다음 CDI와 같은 것을 사용하여 필요한 곳에 CacheManager를 삽입해야합니다. This quickstart은 지원되는 Infinisan 버전 인 JBoss Data Grid를 사용하여 어떻게 수행 할 수 있는지 보여줍니다.

저장소에 this one centered on CDI injection of Infinispan Cache and JSR-107 Cache instances과 같은 다른 빠른 시작이 포함되어 있습니다.

+0

cachemanager를 공유하기 위해 JNDI를 사용하는 방법은 infinisan 가이드 (예로서보고)에 쓰여지고 다른 개발자가 사용합니다. 응용 프로그램 서버 내부에 배포 된 모든 war 중에서 동일한 cacheManager (빌드 할 큰 객체)를 공유하는 한 가지 방법입니다. https://docs.jboss.org/infinispan/5.0/apidocs/org/infinispan/manager/DefaultCacheManager.html "일단 생성되면 CacheManagers는 JNDI를 통해 또는 다른 일부를 통해 캐시가 필요한 모든 구성 요소에서 사용할 수 있어야합니다 IoC 컨테이너와 같은 메커니즘 "이라고 설명했다. – Alex

+0

맞습니다. JNDI는 매우 특정한 사용 사례에 실제로 사용되어야하기 때문에 javadoc은 실제로 업데이트해야합니다. CDI는 처리하기가 훨씬 쉬운 기술이며 JNDI보다 훨씬 나은 라이프 사이클 (생성/시작/중지/삭제)을 처리합니다. –

+0

그래서 JNDI가 모든 mbean 리소스를 릴리스 할 수 없다는 응답이 있습니까? – Alex

3

WildFly의 Infinispan 하위 시스템에서 캐시를 사용하면 JNDI를 통해 캐시를 사용하는 데 문제가 없으며 서버 관리 Infinisan 리소스의 수명주기 요구 사항/제한 사항을 알고 있어야합니다. WildFly에서는 모든 Infinispan 리소스가 캐시 관리자, 캐시 구성 및 캐시를 포함하여 필요에 따라 생성/시작됩니다. Infinisan 리소스가 필요하지 않은 서비스는 시작되지 않으며 JNDI에 바인딩되지 않습니다. 마찬가지로 Infinisan 리소스가 더 이상 필요없는 서비스가 중지되면 중지되고 JNDI 바인딩이 제거됩니다. 따라서 Infinispan 리소스를 JNDI를 통해 조회하려면 먼저 해당 리소스를 강제로 시작해야합니다. 가장 쉬운 방법은 리소스 참조 (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"); 

캐시 관리자가 이미 시작되었습니다. 또한 서버 관리 캐시 관리자를 중지하지 마십시오.또한이 컨테이너에 대해 Infinisan 하위 시스템 내에 정의 된 캐시 구성이 설치되어 있다고 보장 할 수는 없습니다. 따라서 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"); 

캐시가 이미 시작됩니다. 마찬가지로 서버 관리 캐시를 중지하지 마십시오. 응용 프로그램을 배포 취소하거나 서버를 종료하면 자동으로 중지됩니다.