溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java響應式編程之handle怎么使用

發布時間:2022-10-27 16:22:57 來源:億速云 閱讀:283 作者:iii 欄目:開發技術

這篇文章主要介紹“Java響應式編程之handle怎么使用”,在日常操作中,相信很多人在Java響應式編程之handle怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Java響應式編程之handle怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

Java handle用法

JAVA響應式編程reactor中如果需要對一個flux中的數據進行提前返回 可以使用handle

具體如下:

@GetMapping("/a")
    public Mono<Object> a() throws InterruptedException {
        long begin = System.currentTimeMillis();
        Mono<String> m5 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(5);
                System.out.println("5");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "5";
        }).subscribeOn(Schedulers.boundedElastic());

        Mono<String> m8 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(8);
                System.out.println("8");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return "8";
        }).subscribeOn(Schedulers.boundedElastic());
        Mono<String> m10 = Mono.just("").map(s -> {
            try {
                TimeUnit.SECONDS.sleep(15);
                System.out.println("15");
                System.out.println(System.currentTimeMillis() - begin);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "15";
        }).subscribeOn(Schedulers.boundedElastic());
        
        Mono<Object> single = Flux.merge(m8, m5, m10).handle(((s, synchronousSink) -> {
            if ("8".equals(s)) {
                synchronousSink.next("盧本偉牛");
                synchronousSink.complete();
            }
        })).defaultIfEmpty("null").single();
        return single;
    }

subscribeOn(Schedulers.boundedElastic())是讓這些mono進行異步處理

上述定義了3個Mono進行請求 使用Sleep進行模擬請求中業務處理耗時

m5是需要執行3s m8是需要執行8s m10是需要執行15s

如果我們有多個耗時處理的請求 需要同時請求 然后又需要合并結果 并且返回我們需要的結果 進行提前返回。

例如:我需要同時請求這些接口 當8這個接口有結果返回的時候 由于其他請求時間太長了 需要提前返回一個值 放棄其他結果處理 所以我們可以進行判斷.

//這個s代表前面傳入的元素 執行完會傳入這個handle  
// synchronousSink.next() 代表我執行完這個流返回給下一個進行處理  next(Object)  
// synchronousSink.complete(); 代表我們執行完取消其他的流
Flux.merge(m8, m5, m10).handle(((s, synchronousSink) -> {

            if ("8".equals(s)) {
                synchronousSink.next("盧本偉牛");
                synchronousSink.complete();
            }
        })).subscribe(s -> {
                    System.err.println(s);
                });

由于上面當s為8的時候 將盧本偉牛傳入下一個流 然后執行完成 所以還有個m10不會執行完 就會直接丟棄

我們進行測試

發現控制臺打印

我們如果使用傳統的mvc執行m5我們會耗時5s m8會耗時8s 加起來就是13s

我們使用響應式編程則只會耗時8s 當如果多個耗時操作拼接在一起 我們需要多個返回結果的時候我們可以使用handle進行提前返回

Java響應式編程之handle怎么使用

返回結果為盧本偉牛 也就是我們之前當s為8時執行的 ,synchronousSink.next(“盧本偉?!?;,將這個字符串傳給最終結果的流,當然我們也可以根據自己的邏輯 發放多個synchronousSink.next。

Java響應式編程之handle怎么使用

handle的標準使用方式

在Java語言中,直接將handle聲明為Activity的內部類去使用handle,非靜態內部類會持有外部類的一個隱試引用,這樣就可能造成外部類無法被垃圾回收,從而導致內存泄漏。

故而,給出規范的handle使用方式如下:

handle的基類

public class UIHandler<T> extends Handler{
 
     protected WeakReference<T> ref;
 
     public UIHandler(T cla){
        ref = new WeakReference<T>(cla);
     }
 
      public T getRef(){
          return ref != null ? ref.get() : null;
      }
}

handle運用實例

public class MainActivity extends Activity{
 
    private final MainHandler mHandler = new MainHandler(this);
 
    @Override
    protected void onCreate(Bundle savedInstanceState){
        super.oncreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mHandler.post(mRunnable);
    }
 
    private static final Runnable mRunnable = new Runnable(){
 
        @Override
         public void run(){
 
         }
    };
 
    private class MainHandler extends UIHandler{
         private MainHandler(MainActivity activity){
             super(activity);
         }
         
         @Override
         public void handleMessage(Message msg){
             super.handleMessage(msg);
             MainActivity activity = (MainActivity)ref.get();
             if(activity != null){
                if (activity.isFinishing()
                    return;
          switch(msg.what){
            case 1:
            break;
          }
             }
         }
    }
}

到此,關于“Java響應式編程之handle怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女