Open chinacode opened 7 years ago
GitHub的Issue及评论可以使用GFM(Github Flavored Markdown)语法进行描述
public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextClosedEvent){ logger.info("destroy dubbo service client ...."); try { AbstractRegistryFactory.destroyAll(); ProtocolConfig.destroyAll(); } catch (Exception e) { logger.error("",e); } logger.info("destroy dubbo NettyClient ...."); try { final Class<?> clazz = Class.forName("com.alibaba.dubbo.remoting.transport.netty.NettyClient"); Field field = clazz.getDeclaredField("channelFactory"); field.setAccessible(true); Object channelFactory = field.get(null); Method method = channelFactory.getClass().getMethod("releaseExternalResources"); method.invoke(channelFactory); } catch (Exception e){ logger.error("",e); } try { Thread.sleep(2000); }catch (Exception e){ logger.error("",e); } } }
你这个貌似也没用呢。
我们是在脚本里先尝试优雅关机,等待1s在kill -9
我fork了一个版本,由于差异比较大,合不过来了。dubbo采用shutdownhook机制实现资源释放,JVM退出才会触发。 可以在application中添加一个destory-method这方法,spring容器退出时会调用所有destory-method方法,在这可以释放资源,当然用spring eventListener也可以。 我自己改的版本https://github.com/YanXs/dubbo3 添加了这个方法,重新部署时不需要关掉JVM
成功了是成功了~ dubbo是否也输出打了wran日志: java.lang.NoClassDefFoundError: com/alibaba/dubbo/registry/support/SkipFailbackWrapperException呢??
新公司项目,每次运维都在抱怨,tomcat 老是关不掉。需要kill -9 , 很蛋疼。 本地开发,重启总是失败,需要杀掉JVM进程才能重启,找了很多资料发现 没有一个完整的方案,现在把我的解决方案(叫汇总也行)写出来。
public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ContextClosedEvent){ logger.info("destroy dubbo service client ...."); try { AbstractRegistryFactory.destroyAll(); ProtocolConfig.destroyAll(); } catch (Exception e) { logger.error("",e); } logger.info("destroy dubbo NettyClient ...."); try { final Class<?> clazz = Class.forName("com.alibaba.dubbo.remoting.transport.netty.NettyClient"); Field field = clazz.getDeclaredField("channelFactory"); field.setAccessible(true); Object channelFactory = field.get(null); Method method = channelFactory.getClass().getMethod("releaseExternalResources"); method.invoke(channelFactory); } catch (Exception e){ logger.error("",e); } try { Thread.sleep(2000); }catch (Exception e){ logger.error("",e); } } }
上面这段格式不知道怎么弄。
通过注解,@PreDestroy 来做Destroy 执行前事件。 `@Component public class LalaDestroy { Logger logger = Logger.getLogger(LalaDestroy.class);
@PreDestroy public void shutdown(){ logger.info("destroy dubbo service client ...."); try { AbstractRegistryFactory.destroyAll(); ProtocolConfig.destroyAll(); } catch (Exception e) { logger.error("",e); } logger.info("destroy dubbo NettyClient ...."); try { final Class<?> clazz = Class.forName("com.alibaba.dubbo.remoting.transport.netty.NettyClient"); Field field = clazz.getDeclaredField("channelFactory"); field.setAccessible(true); Object channelFactory = field.get(null); Method method = channelFactory.getClass().getMethod("releaseExternalResources"); method.invoke(channelFactory); } catch (Exception e){ logger.error("",e); } try { Thread.sleep(2000); }catch (Exception e){ logger.error("",e); } } }`
上面两种方式都可行。