這篇文章主要介紹“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進行提前返回
返回結果為盧本偉牛 也就是我們之前當s為8時執行的 ,synchronousSink.next(“盧本偉?!?;,將這個字符串傳給最終結果的流,當然我們也可以根據自己的邏輯 發放多個synchronousSink.next。
在Java語言中,直接將handle聲明為Activity的內部類去使用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; } }
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怎么使用”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。