文章目錄
-
-
-
- 1. ExporterListener
- 2. InvokerListener
- 3. 總結
-
-
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
- 自定義 ExportListenerTest
-
ServiceBean的destroy方法
由于 ServiceBean 實作了 DisposableBean 接口,是以會在spring容器showdown的時候調用destroy方法,而在ServiceBean的destroy方法中會調用 ExporterListener 的unexported方法,源碼不再詳述。
-
自定義ExporterListener的調用
不使用@Activate來自定義激活,可使用dubbo parameter來進行自定義激活,示例如下:
ExporterListener 擴充實作類:
META-INF/dubbo下配置com.alibaba.dubbo.rpc.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()); } }
服務端配置: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日志,服務端配置如下:
自定義InvokerListener的調用參考ExporterListener的方式
3. 總結
dubbo中的listener機制更多面向的是dubbo開發者,使用者大多用的是服務端export/destory export服務後和消費端refer/destroy refer服務後的一些處理。