-
Notifications
You must be signed in to change notification settings - Fork 1.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
对netty的EventExecutor进行修饰 #372
Comments
这代码每次的请求都会修饰,还有一种就是缓存修饰的对象,但是我认为这是对low的做法,应该可以直接在源头上处理 |
赞成 +1 ! @heixiaoma 因为涉及执行器的库/框架会有很多,所以在 另外,尤其是对比较大的库/框架的
@heixiaoma 你可以实现整理一个: 😁
提到
|
感谢老哥的建议,我多尝试尝试这个问题,或许通过javassist来修改netty的代码来实现或许是一种方法 |
/**
* 修改Netty,让线程池被TTL包装
* AbstractEventExecutor eventloop都继承了这个抽象类,我们只加入一点自己的逻辑,并在RouterHandler里使用
*/
public static void modifyNetty() {
ClassPool cp = ClassPool.getDefault();
try {
String strPath="io.netty.util.concurrent.AbstractEventExecutor";
ClassPath classPath= new LoaderClassPath(Thread.currentThread().getContextClassLoader());
cp.insertClassPath(classPath);
Loader loader = new Loader(cp);
Class<?> abstractEventExecutor = loader.loadClass(strPath);
CtClass ctClass = cp.getCtClass(abstractEventExecutor.getName());
ctClass.freeze();
ctClass.defrost();
CtClass executorType = cp.get(Executor.class.getCanonicalName());
// final Executor executor=TtlExecutors.getTtlExecutor(this); 模拟这样一段代码
CtField ctField = new CtField(executorType, "executor", ctClass);
ctField.setModifiers(Modifier.FINAL);
ctClass.addField(ctField, "com.alibaba.ttl.threadpool.TtlExecutors.getTtlExecutor(this);");
//在添加一个get方法用于RouterHandler调用
// public Executor getExecutor() {
// return this.executor;
// }
CtMethod m = new CtMethod( cp.get(Executor.class.getCanonicalName()), "getTtlExecutor", new CtClass[]{}, ctClass);
m.setModifiers(Modifier.PUBLIC);
// 添加返回
m.setBody("return this.executor;");
ctClass.addMethod(m);
ctClass.toClass();
ctClass.detach();
} catch (Throwable e) {
log.error(ExceptionUtil.getMessage(e));
}
} if (getTtlExecutor == null) {
getTtlExecutor = ctx.executor().getClass().getMethod("getTtlExecutor");
}
Executor executor = (Executor)getTtlExecutor.invoke(ctx.executor()); 写了一个demo,看上去也很丑 |
先 close 了;有进一步信息或问题可以继续讨论。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
目前这段代码可以完美的使用,但是性能不是很高,有没有办法直接获取ctx.executor()的就是TTL修饰过的,我尝试多次,貌似没有办法处理这个问题,前来和各位大哥交流学习下
The text was updated successfully, but these errors were encountered: