首页 > 其他分享 >webflux使用

webflux使用

时间:2024-09-06 10:52:23浏览次数:4  
标签:instanceReference log Mono mono 使用 webflux error eosProject

1. 生成Mono对象

private Mono<String> getEosDuplicateLastScanId(EosProject eosProject) {
        Mono<String> scanIdMono = webClient.get()
                .uri(uriBuilder ->
                        UriComponentsBuilder.fromHttpUrl(HOST)
                                .path("/eos/data/duplicate/moduleLatestScanId")
                                .queryParam("moduleId", eosProject.getId().toString())
                                .queryParam("_", System.currentTimeMillis())
                                .build().toUri())
                .headers(headers -> headers.add("Cookie", eosScanConfig.getCookie()))
                .retrieve()
                .bodyToMono(JSONObject.class)
                .log()
                .filter(jsonObject -> Objects.nonNull(jsonObject.getString("data")))
                .map(jsonObject -> jsonObject.getString("data"));
        return scanIdMono;
}
  1. url的完整参数需要使用uri方法产地进Function函数来实现童工UriComponentsBuilder.fromHttoUrl()来传递http中的host,最后通过toUri返回uri对象
  2. bodyToMono 是返回的数据解析到JSONObject类型
  3. filter前置过滤,需要判断下返回数据不为空的类型,如果不加filter条件,map返回为null的话会抛异常

2. mono对象的异步回调

 eosProjectDuplicateMono.subscribe(
                    eosDuplicateDto -> {
                        Optional<InstanceReference> instanceReferenceOptional = buildInstanceReference(eosDuplicateDto, context, eosProject);
                        instanceReferenceOptional.ifPresent(instanceReference -> {
                            log.info("saveInstanceReference:{}", instanceReference);
                            instanceReferenceDao.save(instanceReference);
                        });
                    },
                    error -> {
                        log.error("fetch {} EosDuplicate reference error" ,eosProject.getId(), error);
                        latch.countDown();
                    },
                    () -> {
                        log.info("fetch {} EosDuplicate reference complete",eosProject.getId());
                        latch.countDown();
                    }
);
  1. eosProjectDuplicateMono 是mono对象
  2. eosProjectDuplicateMono 如果是Mono.empty()的话,执行subscribe的话,会执行最后onComplete逻辑
    () -> {
    log.info("fetch {} EosDuplicate reference complete",eosProject.getId());
    latch.countDown();
    }
  3. onNext()是如果mono中有数据并正常返回的时候调用执行
    eosDuplicateDto -> {
    Optional instanceReferenceOptional = buildInstanceReference(eosDuplicateDto, context, eosProject);
    instanceReferenceOptional.ifPresent(instanceReference -> {
    log.info("saveInstanceReference:{}", instanceReference);
    instanceReferenceDao.save(instanceReference);
    });
    }
  4. onFailed()是如果mono在异步执行的过程中出现报错的时候被回调
    error -> {
    log.error("fetch {} EosDuplicate reference error" ,eosProject.getId(), error);
    latch.countDown();
    }
  5. onNext()中的代码块如果执行报错,也会走到onFailed

3. 等待mono的结果返回

mon可以多个放入一个list,然后等待都执行完毕,类似线程池中同步等待,防止执行太快,控制批次
这个不能和subscribe 同时使用,所以如果使用subscribe订阅返回消息的时候,控制批次的话可以引入countDonwLatch,在onError和onComplete的时候加上countDown方法

4.2个mono串起来

private Mono<EosDuplicateDto> getEosProjectDuplicateResult(EosProject eosProject) {
        Mono<String> lastScanIdMono = getEosDuplicateLastScanId(eosProject);

        Mono<EosDuplicateDto> eosDuplicateMono = lastScanIdMono.flatMap(scanId -> {
            // 使用从 mono1 返回的数据创建第二个 Mono
            return getEosDuplicateResponse(scanId);
        });

        return eosDuplicateMono;
}
  1. lastScanIdMono 第一个mono的返回值,需要传递个第二个eosDuplicateMono 中,依赖flatMap 的流进行操作
  2. 如果第一个mono返回的是mono.empty()这种类型的话,调用flatMap的话,不会执行里面的流程,而是也直接返回一个mono.empty()

标签:instanceReference,log,Mono,mono,使用,webflux,error,eosProject
From: https://www.cnblogs.com/PythonOrg/p/18399831

相关文章

  • 【c】printf()中%占位符的选取和使用: %d, %s等
    格式占位符速通格式占位符%格式占位符%是在C/C++语言中格式输入函数,如scanf、printf等函数中使用。其意义就是起到格式占位的意思,表示在该位置有输入或者输出。规定符%d十进制有符号整数%u十进制无符号整数%f浮点数%s字符串%c单个字符%p指针的值%e指......
  • WebGL入门(031):EXT_frag_depth 简介、使用方法、示例代码
    还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。No.内容链接1Openlayers【入门教程】-......
  • 4. 使用DeepDream生成图像
    importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltdefload_model():model=tf.keras.applications.InceptionV3(weights='imagenet',include_top=False)model.trainable=Falsereturnmodeldefdeep_dream(image......
  • 如何使用京东JD商品SKU信息API进行商品信息查询和提取
    1.API调用方法概述京东JD商品SKU信息API通常用于查询特定SKU(StockKeepingUnit)的商品详细信息。在调用API之前,你需要确保已经注册成为京东开发者,并获得了相应的API权限和访问密钥。API调用方法:HTTP方法:通常是GET或POST,具体取决于API的要求。URL:API的端点URL,从京东开放平台......
  • Python使用MySQL数据库
    安装MySQL-python要想使python可以操作mysql 就需要MySQL-python驱动,它是python 操作mysql必不可少的模块。下载地址:https://pypi.python.org/pypi/MySQL-python/下载MySQL-python-1.2.5.zip 文件之后直接解压。进入MySQL-python-1.2.5目录:>>python setup.py install ......
  • CI3在路由规则中使用回调函数来处理逆向引用
      创建yy类classyyextendsCI_Controller{publicfunction__construct(){parent::__construct();}publicfunctionfy(){echo'home/yy';}publicfunctionfy2(){echo'home/yy2';}} $route[......
  • Vue 中的 Vuex:全面解析与使用教程
    什么是Vuex?Vuex是Vue.js官方提供的状态管理模式,专为Vue.js应用设计。它通过集中式存储管理应用中所有的组件状态,允许组件之间更方便地共享数据,并提供了一套规则来确保状态以可预测的方式发生变化。Vuex对大型应用尤其有用,因为它将组件中的状态提取到外部,并通过全局状......
  • 《黑神话:悟空》 风灵月影修改器使用指南:详尽教程,助你轻松驾驭游戏
    《黑神话:悟空》是一款深受玩家喜爱的动作冒险游戏,其精美的画面和引人入胜的故事剧情吸引了众多粉丝。对于那些希望通过修改器来进一步增强游戏体验的玩家来说,“风灵月影”修改器是一个不错的选择。下面是如何使用这款修改器的详细步骤。获取修改器首先,你需要从一个可信赖的......
  • LEAN 类型理论之注解(Annotations of LEAN Type Theory)—— 归纳类型(Inductive Type)的
            使用规则(EliminationRule),也叫解构规则(DestructionRule),与构建规则(IntroductionRule),也叫建构规则(ConstructionRule),相对应。        即,构建规则(IntroductionRule),定义了该类型的正规元素是如何构建出来的;而,使用规则(EliminationRule),定义了该类型的正......
  • linux curl命令介绍以及使用
    文章目录`curl`简介`curl`的安装基本用法发送GET请求将响应内容保存到文件显示请求的头部信息发送POST请求上传文件携带请求头处理重定向通过代理发送请求下载文件指定请求的超时时间高级用法模拟浏览器行为保持会话(Cookie)验证HTTPS请求总结在Linux中,curl是一个......