
你好,貌似是反射对象为null了
我看不到你的代码 所以只能粗略估计可能是发射方法里面写的问题,'eyunyiyouserviceinfIIptvRequestServicegetLogInfo(javalangString)
接口 = new 接口实现类 (); 这样定义的?
因为你说一阵好 一阵不好,所以建议用断点走走看,好和不好的时候各个属性的值。
从而找到问题的根源。
顺便问一下,你用的是Axis2?
答案是肯定可以的,我将从下面几点进行说明:
1dubbo 的调用流程
2Dubbo整体设计
3从源码上说明注册中心挂了还是可以继续通信的
Dubbo 调用流程
架构图
流程说明:
1Provider(提供者)绑定指定端口并启动服务
2提供者连接注册中心,并发本机IP、端口、应用信息和提供服务信息发送至注册中心存储
3Consumer(消费者),连接注册中心 ,并发送应用信息、所求服务信息至注册中心
4注册中心根据 消费 者所求服务信息匹配对应的提供者列表发送至Consumer 应用缓存。
5Consumer 在发起远程调用时基于缓存的消费者列表择其一发起调用。
6Provider 状态变更会实时通知注册中心、在由注册中心实时推送至Consumer
这么设计的意义:
Dubbo 整体设计其协作流程如下:
从源码上说明注册中心挂了还是可以继续通信的
首先要把消费者注册到Zookeeper注册中心
然后使用RegistryDirectory 监听一下几个目录(会自动触发一次去获取这些目录上的当前数据)
当前所引入的服务的动态配置目录:/dubbo/config/dubbo/orgapachedubbodemoDemoService:111:g1configurators
比如监控providers 目录:
当有服务提供者注册,zookeeper会自动推动给订阅的消费者,然后转换为invoker存储到缓存中
我们在看调用时的代码:
我们看到 FailoverClusterInvoker 的doInvoke方法
Invoker invoker = select(loadbalance, invocation, copyInvokers, invoked);
此方法根据负载均衡器去缓存中获取一个invoker,
上面的 copyInvokers 就是上面我们缓存进去的 List
invokers = routerChainroute(getConsumerUrl(), invocation);
总结
在我们系统启动时,已经缓存了注册中心上的所有服务,后续的注册中心挂了只会影响到后续则注册,不会影响调用!
Dubbo分布式的RPC,微服务框架,
包括三个关键功能:基于接口的远程调用,容错与负载均衡,服务自动注册与发现。
Dubbo使得调用远程服务就像调用本地java服务一样简单。
参考Dubbo官方文档:包括实现细节,远程调用细节,服务提供者暴露服务。
主要流程。
1、provider向注册中心去注册
2、consumer从注册中心订阅服务,注册中心会通知consumer注册好的服务
3、consumer调用provider
4、consumer和provider都异步的通知监控中心
基于zk作为注册中心:
提供者在启动时,向注册中心zk 注册自己提供的服务。
消费者在启动时,向注册中心zk 订阅自己所需的服务。
所以是可以的,消费者在启动时,消费者会从zk拉取注册的生产者的地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用,消费者本地有一个生产者的列表,他会按照列表继续工作,倒是无法从注册中心去同步最新的服务列表,短期的注册中心挂掉是不要紧的,但一定要尽快修复,挂掉是不要紧的,但前提是你没有增加新的服务,如果你要调用新的服务,则是不能办到的
这个异常,一般是由于调用Mathod类的invoke()方法,该方法所代表的指定方法抛出异常时,或者调用Constructor类的newInstance()方法,该方法所代表的底层构造方法抛出异常时,由javalangreflectInvocationTargetExceptio异常包装后作为新的异常抛出而产生,默认异常信息是NULL。
所以我怀疑是使用反射的方式调用构造函数时,由于数据或者其他问题造成了构造方法抛出异常,以InvocationTargetException异常的方式显示出来。
问题出在:
at sunreflectDelegatingMethodAccessorImplinvoke(DelegatingMethodAccessorImpljava:25)
at javalangreflectMethodinvoke(Methodjava:585)
仔细检查一下,应该能解决
前一篇文章主要介绍了 spring 核心特性机制的 IOC 容器机制和核心运作原理,接下来我们去介绍另外一个较为核心的功能,那就是 AOP 容器机制,主要负责承接前一篇代理模式机制中动态代理:JDKProxy 和 CglibProxy 的功能机制之后,我们开始研究一下如何实现一下相关的 AOP 容器代理机制的。
实现的基本实现原理就是后置处理器:BeanPostProcessor 机制,实现动态化植入机制。
bean 在初始化的时候会进行调用对应的 BeanPostProcessor 的对应的方法会进行织入。
主要取决于 wrapIfNecessary 方法:
如果是基础设施类型,则直接回进行返回该 bean 对象,不会进行相关的初始化对应的 aspectj 的动态织入机制。
会进行寻找相关的 Bean 对应的何时的加强通知类。
则会对该 bean 对象,额外进行增强 *** 作生成相关的代理对象,并返回该执行之后的对象,否则会直接返回该对象即可。
getAdvicesAndAdvisorsForBean 方法是我们筛选 Advice 增强类的核心方法,主要用于过滤和筛选对应该 bean 的何时的增强器数组信息。
主要用于调用 AnnotationAwareAspectJAutoProxyCreator 的findCandidateAdvisors()方法,其内部会进行先关的核心构建相关的 Aspectj 的类的相关实现 *** 作
advisorsFactorygetAdvisors 获取通知器
切点类处理 *** 作到此为止,还不完整接下来才是构建动态代理对象的真正执行 *** 作,
扩展相关的筛选出的通知器列表,extendAdvisors 方法,通知器列表首部添加一个 DefaultPointcutAposr 类型的通知器,也就是 ExposeInvocationInterceptorADVISOR 的实现机制。
proxy-target-class 的属性值,代表是否可以支持代理实现类,默认采用的 false 代表着,当 bean 有实现接口的时候,会直接采用 jdk 的动态代理机制生成代理对象,如果是 true,则代表着使用 cglib 进行生成代理对象。
复制代码
前提是必须要配置相关的 expose-proxy 属性配置值为 true,才会进行暴露对应的代理机制。
为了解决目标方法调用同对象中的其他方法,其他方法的切面逻辑是无法实现,因为会涉及到相关的 this *** 作而不是 proxy 对象机制。
可以实现使用 AopContextcurrentProxy()强制转换为当前的代理对象。
获取相关的对应方法的拦截器栈链路,如果没有获取到相关的缓存链路,则会直接调用相关的 getInterceptorsAndDynamicInterceptorAdvice 获取先关的拦截器链。
会进行先关的 PointcutAdvisor 类型通知器,这里会调用相关的通知器所持有的切点(Pointcut)对类和方法进行匹配,匹配冲过这说明相关的向当前的方法进行织入逻辑控制。此外还会通过 geIntercptors()方法对非 MethodIntercptor 类型的通知进行转换。返回相关的拦截器数组,并且随后存入缓存中。
则会直接通过代理机制的反射控制进行调用执行即可。
则例如 jdkDynamicAutoProxy 对象进行调用构建 ReflectiveMethodInvocation 对象,例如它的 process 方法启动拦截器栈的 invoke 方法。
处理返回值,并且返回该值。
InvocationTargetException异常由Methodinvoke(obj, args)方法抛出。当被调用的方法的内部抛出了异常而没有被捕获时,将由此异常接收。
至于具体原因,就要看代码和详细的错误信息了。
以上就是关于java.lang.reflect.InvocationTargetException: null全部的内容,包括:java.lang.reflect.InvocationTargetException: null、说一下Dubbo的工作原理注册中心挂了可以继续通信吗、java.lang.reflect.InvocationTargetException等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)