首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

AsyncToken 模式:替代傳統 Listener 的異步回調最佳實踐

     編輯:Java 相關知識

Listener 模式的局限

  • Service 方法多導致事件類型膨脹,Listener 需處理過多事件
  • 監聽器需預先註冊,無法在調用過程中動態新增
  • 處理「發送失敗重試」等場景時邏輯彆扭

AsyncToken 核心優勢

  1. Token 可無限傳遞:任何對結果感興趣的組件均可註冊回調
  2. 擁有上下文:閉包捕獲調用參數,支援重試等業務邏輯
  3. 一 Token 對應一調用:無需事件類型區分,天然綁定特定調用
  4. 靈活轉換:可再轉發給 Listener 以事件形式分發

實戰代碼範例

public void testSendEmail() {
    final String address = "badqiu@gmail.com";
    final String subject = "test";
    final String content = "async token test";

    // 返回 token,含 addResponder() 註冊回調
    AsyncToken token = sendAsyncEmail(address, subject, content);

    // 外部組件可繼續註冊監聽
    token.addResponder(new IResponder() {
        public void onFault(Exception fault) {
            System.out.println("email send fail, cause: " + fault);
            // 直接引用上下文參數進行重試
            sendAsyncEmail(address, subject, content);
        }
        public void onResult(Object result) {
            System.out.println("email send success, result: " + result);
        }
    });
}

public AsyncToken sendAsyncEmail(String address, String subject, String content) {
    final AsyncToken token = new AsyncToken();
    new Thread(new Runnable() {
        public void run() {
            try {
                // do send email job...
                Object executeResult = "success";
                token.setComplete(executeResult);  // 通知完成
            } catch (Exception e) {
                token.setFault(e);  // 通知失敗
            }
        }
    }).start();
    return token;
}

與 Listener 模式對比

適用場景

  • 非同步 RPC/訊息發送結果回調
  • 需支援重試、補償邏輯的異步操作
  • 多組件關心同一異步操作結果
  • 漸進式遷移:Token 可轉接至既有 Listener 架構
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度ListenerAsyncToken
傳遞性靜態註冊,難以傳遞Token 可自由傳遞、多方訂閱
事件區分需事件類型區分方法一 Token 一調用,無需事件類型
註冊時機預先註冊獲得 Token 後隨時註冊
上下文捕獲需額外綁定參數閉包自然捕獲調用上下文