flink1.19源码学习-动态代理
这一节很简单,但是很重要。
由于flink源码中大量用到了动态代理,所以第一节还是先把基本知识交代清楚,方便我们接下来的学习。
Java 动态代理是一种用于创建动态代理类和代理对象的方法,它可以在运行时动态地对方法进行增强。
实现
通过一个简单的例子,迅速掌握动态代理
ResourceManagerGateway
public interface ResourceManagerGateway {
/**
* 定义一个注册方法
*/
void registerTaskExecutor();
}
ResourceManager
public class ResourceManager implements ResourceManagerGateway{
@Override
public void registerTaskExecutor() {
System.out.println("注册registerTaskExecutor");
}
}
PekkoInvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class PekkoInvocationHandler implements InvocationHandler {
private Object target;
public PekkoInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
return invokeRpc(method,args);
}
private Object invokeRpc(Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
System.out.println("调用pekko ask方法向ResourceManager发送调用的方法");
Object res = method.invoke(target, args);
System.out.println("结束调用");
return res;
}
}
Demo
import java.lang.reflect.Proxy;
public class Demo {
public static void main(String[] args) {
/** 创建目标对象 */
ResourceManager myObject = new ResourceManager();
/** 创建InvocationHandler */
PekkoInvocationHandler handler = new PekkoInvocationHandler(myObject);
ResourceManagerGateway proxy = (ResourceManagerGateway) Proxy.newProxyInstance(
ResourceManagerGateway.class.getClassLoader(),
new Class[]{ResourceManagerGateway.class},
handler);
proxy.registerTaskExecutor();
}
}
运行结果
调用pekko ask方法向ResourceManager发送调用的方法
注册registerTaskExecutor
结束调用
总结
在接下来的源码阅读中,动态代理主要与RPC结合使用,对于像flink这种分布式架构来说,RPC是重中之重。所以接下来就学习flink的RPC。