当前位置:   article > 正文

flink1.19源码学习-动态代理(1)_揭秘flink 1.19源码深度剖析

揭秘flink 1.19源码深度剖析

flink1.19源码学习-动态代理

这一节很简单,但是很重要。

由于flink源码中大量用到了动态代理,所以第一节还是先把基本知识交代清楚,方便我们接下来的学习。

Java 动态代理是一种用于创建动态代理类和代理对象的方法,它可以在运行时动态地对方法进行增强。

实现

通过一个简单的例子,迅速掌握动态代理

ResourceManagerGateway

public interface ResourceManagerGateway {
    /**
     * 定义一个注册方法
     */
    void registerTaskExecutor();
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

ResourceManager

public class ResourceManager implements ResourceManagerGateway{
    @Override
    public void registerTaskExecutor() {
        System.out.println("注册registerTaskExecutor");
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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;
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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();
    }
}


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行结果

调用pekko ask方法向ResourceManager发送调用的方法
注册registerTaskExecutor
结束调用
  • 1
  • 2
  • 3

总结

在接下来的源码阅读中,动态代理主要与RPC结合使用,对于像flink这种分布式架构来说,RPC是重中之重。所以接下来就学习flink的RPC。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/424275
推荐阅读
相关标签
  

闽ICP备14008679号