Java響應(yīng)式編程之handle用法解析
Java handle用法
JAVA響應(yīng)式編程reactor中如果需要對(duì)一個(gè)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個(gè)Mono進(jìn)行請(qǐng)求 使用Sleep進(jìn)行模擬請(qǐng)求中業(yè)務(wù)處理耗時(shí)
m5是需要執(zhí)行3s m8是需要執(zhí)行8s m10是需要執(zhí)行15s
如果我們有多個(gè)耗時(shí)處理的請(qǐng)求 需要同時(shí)請(qǐng)求 然后又需要合并結(jié)果 并且返回我們需要的結(jié)果 進(jìn)行提前返回。
例如:我需要同時(shí)請(qǐng)求這些接口 當(dāng)8這個(gè)接口有結(jié)果返回的時(shí)候 由于其他請(qǐng)求時(shí)間太長(zhǎng)了 需要提前返回一個(gè)值 放棄其他結(jié)果處理 所以我們可以進(jìn)行判斷.
//這個(gè)s代表前面?zhèn)魅氲脑?執(zhí)行完會(huì)傳入這個(gè)handle
// synchronousSink.next() 代表我執(zhí)行完這個(gè)流返回給下一個(gè)進(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的時(shí)候 將盧本偉牛傳入下一個(gè)流 然后執(zhí)行完成 所以還有個(gè)m10不會(huì)執(zhí)行完 就會(huì)直接丟棄
我們進(jìn)行測(cè)試
發(fā)現(xiàn)控制臺(tái)打印
我們?nèi)绻褂脗鹘y(tǒng)的mvc執(zhí)行m5我們會(huì)耗時(shí)5s m8會(huì)耗時(shí)8s 加起來就是13s
我們使用響應(yīng)式編程則只會(huì)耗時(shí)8s 當(dāng)如果多個(gè)耗時(shí)操作拼接在一起 我們需要多個(gè)返回結(jié)果的時(shí)候我們可以使用handle進(jìn)行提前返回

返回結(jié)果為盧本偉牛 也就是我們之前當(dāng)s為8時(shí)執(zhí)行的 ,synchronousSink.next(“盧本偉牛”);,將這個(gè)字符串傳給最終結(jié)果的流,當(dāng)然我們也可以根據(jù)自己的邏輯 發(fā)放多個(gè)synchronousSink.next。

handle的標(biāo)準(zhǔn)使用方式
在Java語言中,直接將handle聲明為Activity的內(nèi)部類去使用handle,非靜態(tài)內(nèi)部類會(huì)持有外部類的一個(gè)隱試引用,這樣就可能造成外部類無法被垃圾回收,從而導(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;
}
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? }
} ? ?以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot數(shù)據(jù)訪問自定義使用Druid數(shù)據(jù)源的方法
本文記錄Druid數(shù)據(jù)源的使用,自定義實(shí)現(xiàn)Drud的功能、監(jiān)控頁、登錄、統(tǒng)計(jì)等。對(duì)SpringBoot數(shù)據(jù)訪問使用Druid數(shù)據(jù)源的相關(guān)知識(shí)感興趣額朋友一起看看吧2021-08-08
Java 中文字符按Unicode排序的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10
java.mail實(shí)現(xiàn)發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了java.mail實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02

