Java响应式编程之handle用法解析

 更新时间:2022年10月26日 15:45:28   作者:韩金龙小傻瓜  
这篇文章主要介绍了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。

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;
          }
             }
         }
    }
}    

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • springboot如何自定义pom内子依赖版本

    springboot如何自定义pom内子依赖版本

    这篇文章主要介绍了springboot如何自定义pom内子依赖版本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • java中xml和对象之间的互相转换方法

    java中xml和对象之间的互相转换方法

    在java开发中我们经常会遇到Xml与对象互相转换的情况,这篇文章主要给大家介绍了关于java中xml和对象之间的互相转换方法,文中给出了两种解决方法,需要的朋友可以参考下
    2023-06-06
  • druid的borrow行为方法源码解析

    druid的borrow行为方法源码解析

    这篇文章主要为大家介绍了druid的borrow行为方法源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • SpringBoot导出Excel表格到指定路径的代码详解

    SpringBoot导出Excel表格到指定路径的代码详解

    Spring Boot导出Excel通常涉及到使用第三方库如Apache POI或者XlsxWriter等,它们能帮助你在Spring应用中生成并下载Excel文件,那么SpringBoot如何导出Excel表格到指定路径,本文将给大家详细的介绍一下
    2024-07-07
  • Spring中MVC模块代码详解

    Spring中MVC模块代码详解

    这篇文章主要介绍了Spring中MVC模块代码详解,涉及Controller的简单介绍,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • HashMap容量和负载因子使用说明

    HashMap容量和负载因子使用说明

    这篇文章主要介绍了HashMap容量和负载因子使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 详解Mybatis通用Mapper介绍与使用

    详解Mybatis通用Mapper介绍与使用

    目前通用mapper只支持对单表的操作,对单表的增删改查,无需在mapper.xml写对应的sql语句,只需要我们调用相应的接口,对于快速开发极为方便,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • springboot整合多数据源配置方式

    springboot整合多数据源配置方式

    这篇文章主要介绍了springboot整合多数据源配置,多数据源整合springboot+mybatis使用分包方式整合,springboot+druid+mybatisplus使用注解整合,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2021-12-12
  • java中抽象类、抽象方法、接口与实现接口实例详解

    java中抽象类、抽象方法、接口与实现接口实例详解

    这篇文章主要给大家介绍了关于java中抽象类、抽象方法、接口与实现接口的相关资料,文中通过示例代码将四者介绍的非常详细,并且简单介绍了抽象类和接口的区别,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • java基础理论Stream管道流Map操作示例

    java基础理论Stream管道流Map操作示例

    这篇文章主要未大家介绍了java基础理论Stream管道流Map操作方法示例解析,有需要的朋友可以借鉴参考下希望能够有所帮助,祝大家多多进步
    2022-03-03

最新评论