[TOC]
1. ExporterListener
-
本地服务暴露过程
本地服务暴露过程会按照 ProtocolFilterWrapper -> ProtocolListenerWrapper -> InjvmProtocol 调用顺序,在 ProtocolListenerWrapper 中会构建 ListenerExporterWrapper 实例,在生成 ListenerExporterWrapper 实例过程中,会对 ListenerExporterWrapper 实例中的 listeners 属性依次调用 exported 方法。
-
远程服务暴露过程
远程暴露服务过程会按照 ProtocolFilterWrapper -> ProtocolListenerWrapper -> RegistryProtocol 调用顺序,在 ProtocolListenerWrapper 中会构建 ListenerExporterWrapper 实例,在生成 ListenerExporterWrapper 实例过程中,会对 ListenerExporterWrapper 实例中的 listeners 属性依次调用 exported 方法。
@SPI
public interface ExporterListener {
// 暴露服务后的监听/处理,在 ListenerExporterWrapper 对象进行初始化的时候就会进行调用
void exported(Exporter<?> exporter) throws RpcException;
// 取消暴露服务后的处理
void unexported(Exporter<?> exporter);
}
// 用户可以继承该方法重写需要的方法
public abstract class ExporterListenerAdapter implements ExporterListener {
public void exported(Exporter<?> exporter) throws RpcException {
}
public void unexported(Exporter<?> exporter) throws RpcException {
}
}
-
使用实例
-
自定义 ExportListenerTest
// 使用@Activate自动激活 @Activate public class ExportListenerTest extends ExporterListenerAdapter { @Override public void exported(Exporter<?> exporter) throws RpcException { System.out.println("暴露完成后的处理:" + exporter.getInvoker().getInterface()); } }
-
META-INF/dubbo下配置
com.alibaba.dubbo.rpc.ExporterListener文件
exportListenerTest=listener.ExportListenerTest
-
启动过程的输出
暴露完成后的处理:interface service.DemoService 暴露完成后的处理:interface service.DemoService
其中第一次输出是暴露本地服务的输出,第二次输出是暴露远程服务的输出
-
-
ServiceBean的destroy方法
由于 ServiceBean 实现了 DisposableBean 接口,所以会在spring容器showdown的时候调用destroy方法,而在ServiceBean的destroy方法中会调用 ExporterListener 的unexported方法,源码不再详述。
-
自定义ExporterListener的调用
不使用@Activate来自定义激活,可使用dubbo parameter来进行自定义激活,示例如下:
ExporterListener 扩展实现类:
public class MultiExportListenerTest extends ExporterListenerAdapter { @Override public void exported(Exporter<?> exporter) throws RpcException { System.out.println("MultiExportListenerTest 暴露完成后的处理:" + exporter.getInvoker().getInterface()); } } public class ExportListenerTest extends ExporterListenerAdapter { @Override public void exported(Exporter<?> exporter) throws RpcException { System.out.println("ExportListenerTest 暴露完成后的处理:" + exporter.getInvoker().getInterface()); } }
META-INF/dubbo下配置com.alibaba.dubbo.rpc.ExporterListener:
exportListenerTest=listener.ExportListenerTest multiExportListenerTest=listener.MultiExportListenerTest
服务端配置:
<dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test"> <dubbo:parameter key="exporter.listener" value="multiExportListenerTest"/> </dubbo:service> 另一种方式: <dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test" listener="multiExportListenerTest"/>
2. InvokerListener
-
消费端引用服务
@SPI public interface InvokerListener { // 消费端引用服务后处理 void referred(Invoker<?> invoker) throws RpcException; // 取消引用后处理 void destroyed(Invoker<?> invoker); } // 用户可以继承该方法重写需要的方法 public abstract class InvokerListenerAdapter implements InvokerListener { public void referred(Invoker<?> invoker) throws RpcException { } public void destroyed(Invoker<?> invoker) { } }
-
DeprecatedInvokerListener及自定义InvokerListener的调用
DeprecatedInvokerListener 的调用过程
当引用服务过程判断服务是否过时,如果服务端设deprecated为true,消费方引用时将打印服务过时警告error日志,服务端配置如下:
<dubbo:service interface="service.DemoService" ref="demoService" protocol="dubbo" group="dubbo_test" deprecated="true"/>
自定义InvokerListener的调用参考ExporterListener的方式
3. 总结
dubbo中的listener机制更多面向的是dubbo开发者,使用者大多用的是服务端export/destory export服务后和消费端refer/destroy refer服务后的一些处理。
网友评论