Java響應(yīng)式編程之handle用法解析
Java handle用法
JAVA響應(yīng)式編程reactor中如果需要對一個flux中的數(shù)據(jù)進(jìn)行提前返回 可以使用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進(jìn)行異步處理
上述定義了3個Mono進(jìn)行請求 使用Sleep進(jìn)行模擬請求中業(yè)務(wù)處理耗時
m5是需要執(zhí)行3s m8是需要執(zhí)行8s m10是需要執(zhí)行15s
如果我們有多個耗時處理的請求 需要同時請求 然后又需要合并結(jié)果 并且返回我們需要的結(jié)果 進(jìn)行提前返回。
例如:我需要同時請求這些接口 當(dāng)8這個接口有結(jié)果返回的時候 由于其他請求時間太長了 需要提前返回一個值 放棄其他結(jié)果處理 所以我們可以進(jìn)行判斷.
//這個s代表前面?zhèn)魅氲脑?執(zhí)行完會傳入這個handle // synchronousSink.next() 代表我執(zhí)行完這個流返回給下一個進(jìn)行處理 next(Object) // synchronousSink.complete(); 代表我們執(zhí)行完取消其他的流 Flux.merge(m8, m5, m10).handle(((s, synchronousSink) -> { if ("8".equals(s)) { synchronousSink.next("盧本偉牛"); synchronousSink.complete(); } })).subscribe(s -> { System.err.println(s); });
由于上面當(dāng)s為8的時候 將盧本偉牛傳入下一個流 然后執(zhí)行完成 所以還有個m10不會執(zhí)行完 就會直接丟棄
我們進(jìn)行測試
發(fā)現(xiàn)控制臺打印
我們?nèi)绻褂脗鹘y(tǒng)的mvc執(zhí)行m5我們會耗時5s m8會耗時8s 加起來就是13s
我們使用響應(yīng)式編程則只會耗時8s 當(dāng)如果多個耗時操作拼接在一起 我們需要多個返回結(jié)果的時候我們可以使用handle進(jìn)行提前返回
返回結(jié)果為盧本偉牛 也就是我們之前當(dāng)s為8時執(zhí)行的 ,synchronousSink.next(“盧本偉牛”);,將這個字符串傳給最終結(jié)果的流,當(dāng)然我們也可以根據(jù)自己的邏輯 發(fā)放多個synchronousSink.next。
handle的標(biāo)準(zhǔn)使用方式
在Java語言中,直接將handle聲明為Activity的內(nèi)部類去使用handle,非靜態(tài)內(nèi)部類會持有外部類的一個隱試引用,這樣就可能造成外部類無法被垃圾回收,從而導(dǎo)致內(nèi)存泄漏。
故而,給出規(guī)范的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運(yùn)用實(shí)例
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; } ? ? ? ? ? ? ?} ? ? ? ? ?} ? ? } } ? ?
以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java面試突擊為什么要用HTTPS及它的優(yōu)點(diǎn)
這篇文章主要介紹了Java面試突擊為什么要用HTTPS及它的優(yōu)點(diǎn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-07-07JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程
學(xué)生信息管理系統(tǒng)是針對學(xué)校人事處的大量業(yè)務(wù)處理工作而開發(fā)的管理軟件,主要用于學(xué)校學(xué)生信息管理,下面這篇文章主要給大家介紹了關(guān)于JavaWeb實(shí)現(xiàn)學(xué)生管理系統(tǒng)的超詳細(xì)過程,需要的朋友可以參考下2023-05-05Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載
這篇文章主要介紹了Java8實(shí)現(xiàn)FTP及SFTP文件上傳下載,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09SpringSecurity實(shí)現(xiàn)訪問控制url匹配
本文主要介紹了SpringSecurity實(shí)現(xiàn)訪問控制url匹配,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Netty分布式pipeline管道創(chuàng)建方法跟蹤解析
這篇文章主要為大家介紹了Netty分布式pipeline管道創(chuàng)建方法跟蹤解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03