2016-07-29 56 views
0

我正在使用Wildfly 9.x和Infinispan 7.2.3。我正面臨強制jgroups change_view事件的問題,以便在「predestroy」階段中選擇一個不同的協調器。Infinispan JGROUPS force更改視圖

此代碼片段:

Address localAddr=cacheManager.getAddress(); 
     Address coord=cacheManager.getMembers().get(0); 
     if(!localAddr.equals(coord)) { 
      logger.error("View can only be changed on coordinator"); 
      return; 
     } 
     if(cacheManager.getTransport().getMembers().size() == 1) { 
      logger.error("Coordinator cannot change as view only has a single member"); 
      return; 
     } 

     long newId= cacheManager.getTransport().getViewId() + 1; 
     List<Address> mbrs = cacheManager.getMembers(); 
     Address tmpCoord=mbrs.remove(0); 

給了我這個錯誤:

10:13:28,688 WARN [org.jboss.as.ee] (ServerService Thread Pool -- 95) WFLYEE0006: Failed to destroy component instance o[email protected]5d8d8b5c: javax.ejb.EJBException: java.lang.UnsupportedOperationException 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:187) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:277) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:349) 
    at org.jboss.as.ejb3.tx.LifecycleCMTTxInterceptor.processInvocation(LifecycleCMTTxInterceptor.java:66) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.concurrent.ConcurrentContextInterceptor.processInvocation(ConcurrentContextInterceptor.java:45) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ContextClassLoaderInterceptor.processInvocation(ContextClassLoaderInterceptor.java:64) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.InterceptorContext.run(InterceptorContext.java:356) 
    at org.jboss.invocation.PrivilegedWithCombinerInterceptor.processInvocation(PrivilegedWithCombinerInterceptor.java:80) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61) 
    at org.jboss.as.ee.component.BasicComponentInstance.destroy(BasicComponentInstance.java:125) 
    at org.jboss.as.ejb3.component.singleton.SingletonComponent.destroySingletonInstance(SingletonComponent.java:185) 
    at org.jboss.as.ejb3.component.singleton.SingletonComponent.done(SingletonComponent.java:142) 
    at org.jboss.as.ejb3.component.EJBComponent.stop(EJBComponent.java:559) 
    at org.jboss.as.ee.component.ComponentStartService$2.run(ComponentStartService.java:78) 
    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) 
    at org.jboss.threads.JBossThread.run(JBossThread.java:320) 
Caused by: java.lang.UnsupportedOperationException 
    at java.util.Collections$UnmodifiableList.remove(Collections.java:1317) 
    at com.klopotek.core.session.job.SessionsHooverScheduler.changeView(SessionsHooverScheduler.java:219) 
    at com.klopotek.core.session.job.SessionsHooverScheduler.stopJobs(SessionsHooverScheduler.java:192) 
    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.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptor.java:96) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.doLifecycleInterception(Jsr299BindingsInterceptor.java:114) 
    at org.jboss.as.weld.ejb.Jsr299BindingsInterceptor.processInvocation(Jsr299BindingsInterceptor.java:98) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.component.ManagedReferenceReleaseInterceptor.processInvocation(ManagedReferenceReleaseInterceptor.java:56) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50) 
    at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:340) 
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:275) 
    ... 24 more 

有沒有辦法使用Infinispan的強制設定一個新的觀點呢?

回答

1

如果您設法訪問JGroups頻道,則[1]可能有效。 IIRC通道可以通過cache.getAdvancedCache().getRpcManager().getChannel(),或一些類似的調用來檢索...

[1] https://github.com/belaban/JGroups/wiki/Changing-the-coordinator-of-a-cluster

+0

是的,我已經嘗試過你的例子,但通過infinispan我無法重現它。我無法在RpcManager類中找到任何getChannel()...你能指出正確的方法嗎? – Alex

+0

我發現這... http://planet.jboss.org/post/how_to_hijack_a_jgroups_channel_inside_infinispan_jboss_and_get_away_with_it – Alex

+0

它是RpcManager.getTransport(),將其轉換爲JGroupsTransport,然後調用getChannel() –

1

我不知道,但更改Infinispan的協調可能導致你的另一個變化也許再重新平衡這樣做。 此行爲可能會隨着下一個版本而改變。

爲什麼你想這樣做?如果您關閉節點,則根據策略更改協調器,並重新平衡緩存(用於分發)以匹配密鑰的所有者數量。