代码之家  ›  专栏  ›  技术社区  ›  lmk

基于常规和Spring数据的缓存操作失败,cacheStoppedException Post Manual Reconnect with clientReconnect Disabled为true

  •  0
  • lmk  · 技术社区  · 6 年前

    我们正在运行2.4版&using spring IgniteSpringBean 安培; Spring Data 用于群集和缓存访问的存储库。

    由于我们遇到了很多与点火客户端断开连接异常相关的问题,我正在编写一个手动分段解析器(通过禁用客户端自动重新连接,将clientReconnectDisabled设置为true),它将检测此情况(使用定期运行的简单缓存查询))&通过以下方式启动断开连接(amp;I) IgniteSpringBean#close 然后重新连接下面的代码片段(与本讨论非常相似, http://apache-ignite-users.70518.x6.nabble.com/SPI-has-already-been-started-always-create-new-configuration-instance-for-each-starting-Ignite-instar-td7360.html )

    xml config中下面引用的bean dcmignitespringbean reconnect()中的代码片段:

    public final void reconnect(final IgniteConfiguration specifiedIgniteConfiguration) {
      LOGGER.info("Initiating reconnect..");
      try {
        close();
        //destroy();
      } catch (Exception e) {
        LOGGER.warn("Error while disconnecting", e);
      }
      LOGGER.info("Disconnected..");
      try {
        Thread.sleep(1000);
      } catch (Exception e) {
        LOGGER.warn("Error while pausing to reconnect", e);
      }
      setConfiguration(specifiedIgniteConfiguration);
      afterSingletonsInstantiated();
      final CacheConfiguration[] cfgArray = specifiedIgniteConfiguration.getCacheConfiguration();
      LOGGER.info("Cache configuration is : {}", cfgArray);
      getOrCreateCaches(Arrays.asList(cfgArray));
      LOGGER.info("Reconnected..");
    }
    

    XML bean配置片段:

    <bean id="igniteInstance" class="com.brocade.dcm.configuration.DCMIgniteSpringBean">
            <property name="configuration" ref="grid.cfg"/>
    </bean>
    <bean id="grid.cfg.provider" class="com.brocade.dcm.configuration.ClientHealthBasedReconnectWrapper">
            <lookup-method name="createIgniteConfiguration" bean="grid.cfg"/>
    </bean>
    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration" scope="prototype">
    ...
    ...
    </bean>
    

    有了上面的内容,我就可以开始工作了,并看到我的扩展点火SpringBean客户机正确地重新连接,并启动了所有的缓存。

    但是问题是,即使客户机已连接,缓存也会启动对任何 IgniteCache 安培; IgniteRepository 实例失败,cachestoppedException(以下)将显示为不可用。

    有人能建议我怎样刷新这些引用吗?我知道,当客户机自动重新连接后,断开连接后,参考继续正常工作,这告诉我有一种方法可以刷新它们,但我没有这样做。

    任何关于如何实现这一点的专家意见……感觉我已经很接近了,但考虑到我正在做黑客:-(

    下面是我分别为ignitcache query()&ignitrepository findbyxx()调用得到的异常,

    class org.apache.ignite.internal.processors.cache.CacheStoppedException: Failed to perform cache operation (cache is stopped): FabricInfoCache
        at org.apache.ignite.internal.processors.cache.GridCacheGateway.enter(GridCacheGateway.java:164)
        at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.onEnter(GatewayProtectedCacheProxy.java:1684)
        at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:365)
        at com.brocade.dcm.configuration.ClientHealthBasedReconnectWrapper.monitorHealth(ClientHealthBasedReconnectWrapper.java:110)
        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:498)
        at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:65)
        at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    

    .

    [Request processing failed; nested exception is java.lang.IllegalStateException: class org.apache.ignite.internal.processors.cache.CacheStoppedException: Failed to perform cache operation (cache is stopped): WebsocketCacheInfo] with root cause
    class org.apache.ignite.internal.processors.cache.CacheStoppedException: Failed to perform cache operation (cache is stopped): WebsocketCacheInfo
        at org.apache.ignite.internal.processors.cache.GridCacheGateway.enter(GridCacheGateway.java:164)
        at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.onEnter(GatewayProtectedCacheProxy.java:1684)
        at org.apache.ignite.internal.processors.cache.GatewayProtectedCacheProxy.query(GatewayProtectedCacheProxy.java:365)
        at org.apache.ignite.springdata.repository.query.IgniteRepositoryQuery.execute(IgniteRepositoryQuery.java:117)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
        at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:61)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
        at com.sun.proxy.$Proxy182.findByWebsocketSessionId(Unknown Source)
        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:498)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
        at com.sun.proxy.$Proxy124.findByWebsocketSessionId(Unknown Source)
    

    谢谢 穆图

    2 回复  |  直到 6 年前
        2
  •  0
  •   lmk    6 年前

    GatewayProtectedCacheProxy#checkProxyIsValid GridCacheContext

    issue

    private GridCacheGateway<K, V> checkProxyIsValid(@Nullable GridCacheGateway<K, V> gate, boolean tryRestart) {
    ..
    ..
      if (isCacheProxy && tryRestart && gate.isStopped() &&
                    context().kernalContext().gateway().getState() == GridKernalState.STOPPED) {
                IgniteKernal igniteKernal = (IgniteKernal) Ignition.ignite(context().gridConfig().getIgniteInstanceName());
                if(igniteKernal != null) {
                 context().setGridKernalContext(igniteKernal.context());
                }
       }
      if (isCacheProxy && tryRestart && gate.isStopped() &&
                context().kernalContext().gateway().getState() == GridKernalState.STARTED) {
                IgniteCacheProxyImpl proxyImpl = (IgniteCacheProxyImpl) delegate;
    
                try {
                    IgniteInternalCache<K, V> cache = context().kernalContext().cache().<K, V>publicJCache(context().name()).internalProxy();
    
                    GridFutureAdapter<Void> fut = proxyImpl.opportunisticRestart();
    
                    if (fut == null)
                        proxyImpl.onRestarted(cache.context(), cache.context().cache());
                    else
                        new IgniteFutureImpl<>(fut).get();
    
                    return gate();
                } catch (IgniteCheckedException ice) {
                    // Opportunity didn't work out.
                }
            }
    
            return gate;
      }
    
         /**
         * NOTE : This method goes into GridCacheContext.java
         * @param ctx
         */
        public void setGridKernalContext(GridKernalContext ctx) {
            this.ctx = ctx;
        }