激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - dubbo新手學習之事件通知實踐教程

dubbo新手學習之事件通知實踐教程

2020-09-15 00:33溪~源 Java教程

這篇文章主要給大家介紹了關于dubbo新手學習之事件通知實踐的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

今天主要給大家分享一下dubbo的事件通知機制。

先看下dubbo中文官網的示例解釋:事件通知。

在調用之前、調用之后、出現異常時,會觸發 oninvoke、onreturn、onthrow 三個事件,可以配置當事件發生時,通知哪個類的哪個方法.

實踐

溪源目的是快速學習dubbo的相關機制,故定義的相同的接口和方法,采用分包的方式解耦合,便于后期維護。
先看服務接口

dubbo-demo-interface

目錄如圖

dubbo新手學習之事件通知實踐教程**

UserNotifyService **

/**
 * @author wx
 * @date 2020/9/8 1:44 下午
 * 測試事件通知
 */
public interface UserNotifyService {
 /**
  * 獲取用戶名字
  * @param userId
  * @return
  */
 String getUserName(String userId);
}

dubbo-demo-xml-provider

目錄如下

dubbo新手學習之事件通知實踐教程

notify-provider.xml

定義一個新的配置文件,用于配置事件通知相關bean。

dubbo新手學習之事件通知實踐教程

UserNotifyServiceImpl

/**
 * @author wx
 * @date 2020/9/8 1:46 下午
 */
@Service
public class UserNotifyServiceImpl implements UserNotifyService {

 private static final String USER_ID = "1503892";
 @Override
 public String getUserName(String userId) {
  if (StringUtils.isBlank(userId)) {
   throw new RpcException("userId is null");
  }
  return USER_ID.equals(userId) ? "溪~源" : "";
 }
}

ProviderApplication

/**
  * 事件通知
  * @throws IOException
  */
 private static void notifyTest() throws IOException {
  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/notify-provider.xml");
  context.start();
  System.in.read();
 }

dubbo-demo-xml-consumer 目錄如下

dubbo新手學習之事件通知實踐教程

ConsumerNotifyService

擴展點

1. oninvoke方法:
 必須具有與真實的被調用方法sayHello相同的入參列表:例如,oninvoke(String name)
2. onreturn方法:
 2.1 至少要有一個入參且第一個入參必須與getUserName的返回類型相同,接收返回結果:例如,onReturnWithoutParam(String result);
 2.2 可以有多個參數,多個參數的情況下,第一個后邊的所有參數都是用來接收getUserName入參的:例如, onreturn(String result, String name)
3. onthrow方法:
 3.1 至少要有一個入參且第一個入參類型為Throwable或其子類,接收返回結果;例如,onthrow(Throwable ex);
 3.2 可以有多個參數,多個參數的情況下,第一個后邊的所有參數都是用來接收getUserName入參的:例如,onthrow(Throwable ex, String name);
4. 如果是consumer在調用provider的過程中,出現異常時不會走onthrow方法的,onthrow方法只會在provider返回的RpcResult中含有Exception對象時,才會執行。(dubbo中下層服務的Exception會被放在響應RpcResult的exception對象中傳遞給上層服務)

對于上面的解釋,大家可能會存在疑惑,部分方法要求第一個參數為服務接口的返回值類型???約定大于配置???揭開迷底的方法就是debug源碼設計實現邏輯~

源代碼:

/**
 * @author wx
 * @date 2020/9/8 1:53 下午
 */
public interface ConsumerNotifyService {
 /**
  * 調用之前
  * @param name
  */
 void onInvoke(String name);

 /**
  * 無參數:調用之后
  * @param result 參數用于接收 [事件通知]服務接口的方法返回值類型保持一致
  */
 void onReturnWithoutParam(String result);

 /**
  * 有參數:調用之后
  * @param result 第一個參數 接收 [事件通知]服務接口的方法返回值類型保持一致
  * @param name 第二個或者之后,與[事件通知]服務接口的方法入參保持一致
  */
 void onReturn(String result, String name);

 /**
  * 拋異常
  * @param ex
  * @param name
  */
 void onThrow(Throwable ex, String name);
}

ConsumerNotifyServiceImpl

/**
 * @author wx
 * @date 2020/9/8 1:59 下午
 */
@Service
public class ConsumerNotifyServiceImpl implements ConsumerNotifyService{
 @Override
 public void onInvoke(String name) {
  System.out.println("[事件通知]執行onInvoke方法,參數:" + name);
 }

 @Override
 public void onReturnWithoutParam(String result) {
  System.out.println("[事件通知]執行onReturnWithoutParam方法,返回結果:" + result);
 }

 @Override
 public void onReturn(String result, String name) {
  System.out.println("[事件通知]執行onReturn方法,參數:" + name + ", 返回結果:" + result);
 }

 @Override
 public void onThrow(Throwable ex, String name) {
  System.out.println("[事件通知]執行onThrow方法,參數:" + name + ", 異常信息:" + ex.getMessage());
 }
}

notify-consumer.xml

同理,消費者端也新建notify-consumer.xml文件,具體配置如圖:

dubbo新手學習之事件通知實踐教程

ConsumerApplication

 private static void notifyTest() {
  ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/notify-consumer.xml");
  UserNotifyService notifyService = context.getBean(UserNotifyService.class);
  String userName = notifyService.getUserName("1503892");
  System.out.println(userName);

 }

運行

分別啟動生產者和消費者,運行結果如圖:

分別執行了onInvoke方法和onReturn方法

dubbo新手學習之事件通知實踐教程

源碼

關于dubbo的事件通知機制,源碼實現基本上位于FutureFilter類中,先給大家貼一下類方法目錄:

dubbo新手學習之事件通知實踐教程

上面溪源提到為什么部分方法要約定第一個參數與接口方法返回值類型保持一致呢?下面揭開迷底,我們進入fireReturnCallback方法

private void fireReturnCallback(final Invoker<?> invoker, final Invocation invocation, final Object result) {
  ....//省略部分代碼
  Object[] params;
  //獲取方法參數類型
  Class<?>[] rParaTypes = onReturnMethod.getParameterTypes();
  if (rParaTypes.length > 1) {
  //兩個參數:第一個參數與真實方法getUserName方法返回結果類型相同,第二個接收所有的真實請求參數
   if (rParaTypes.length == 2 && rParaTypes[1].isAssignableFrom(Object[].class)) {
    params = new Object[2];
    // 真實方法的返回結果
    params[0] = result;
    //執行方法入參
    params[1] = args;
   } else {
   //多個參數:第一個參數與真實方法getUserName結果類型相同,后邊幾個接收所有的真實請求參數
    params = new Object[args.length + 1];
    params[0] = result;
    System.arraycopy(args, 0, params, 1, args.length);
   }
  } else {
  //只有一個參數:接收返回執行結果
   params = new Object[]{result};
  }
  try {
   onReturnMethod.invoke(onReturnInst, params);
  } catch (InvocationTargetException e) {
   fireThrowCallback(invoker, invocation, e.getTargetException());
  } catch (Throwable e) {
   fireThrowCallback(invoker, invocation, e);
  }
 }

事件通知機制,底層實際上利用了反射機制實現類方法的調用。

溪源初次接觸dubbo本地存根機制,如文中存在錯誤之處,希望大家及時指正!

源碼傳送門:https://github.com/stream-source/dubbo/tree/master/dubbo-demo

總結

到此這篇關于dubbo新手學習之事件通知實踐教程的文章就介紹到這了,更多相關dubbo事件通知內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/xuan_lu/article/details/108503765

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久草视频免费 | 久久青草影院 | 亚洲午夜一区二区三区 | 中文字幕极速在线观看 | 羞羞网站在线看 | 一级一级一级一级毛片 | 久久蜜臀一区二区三区av | 极品美女一级毛片 | 欧洲精品久久久 | 蜜桃av鲁一鲁一鲁一鲁 | 国产在线导航 | 91精品国产综合久久婷婷香 | 最新黄色电影网站 | 日韩毛片毛片久久精品 | 爽爽淫人综合网网站 | 永久免费av片在线观看全网站 | 日日草天天干 | 中文字幕网站在线 | 日韩精品中文字幕在线观看 | 欧美爱爱视频免费看 | 91成人免费版 | h视频在线免费看 | 成年免费大片黄在线观看岛国 | 久久影院一区二区三区 | 久久精品二区 | 久久网国产精品 | 天天操很很操 | 欧美一级黄色网 | 亚洲导航深夜福利涩涩屋 | 日本68xxxx| 久久精品com | 欧美 中文字幕 | 成人午夜免费福利 | 日韩 综合 | 羞羞网站在线观看入口免费 | 国产精品久久久久久久av | 国产精品久久久久免费视频 | 91麻豆精品国产91久久久更新资源速度超快 | 91久久久久久久 | 99re久久最新地址获取 | 91精品国产综合久久久欧美 |