当前位置: 首页 > news >正文

做网站多少钱?wordpress hide title plugin

做网站多少钱?,wordpress hide title plugin,seo专员招聘,建筑网站免费我可以更好地了解a的用途的一种方式 基于反应流的方法是它简化了无阻塞IO调用的方式。 这篇文章将快速讲解进行同步远程调用所涉及的那种代码#xff0c;然后说明如何在非阻塞IO中分层#xff0c;尽管在资源#xff08;尤其是线程#xff09;的使用方面非常高效#xff… 我可以更好地了解a的用途的一种方式 基于反应流的方法是它简化了无阻塞IO调用的方式。 这篇文章将快速讲解进行同步远程调用所涉及的那种代码然后说明如何在非阻塞IO中分层尽管在资源尤其是线程的使用方面非常高效但会带来称为回调地狱的复杂性并且基于反应流的方法如何简化编程模型。 目标服务 由于我将编写一个客户呼叫因此代表城市详细信息的目标服务有两个端点。 当使用uri类型的“ / cityids”调用时返回一个城市ID列表并且示例结果如下所示 [ 1 , 2 , 3 , 4 , 5 , 6 , 7 ] 端点返回给定城市ID的城市的详细信息例如当使用ID 1 –“ / cities / 1”进行调用时 { country : USA , id : 1 , name : Portland , pop : 1600000 } 客户的责任是获取城市ID的列表然后为每个城市ID获取城市的详细信息并将其放到城市列表中。 同步通话 我正在使用Spring Framework的RestTemplate进行远程调用。 Kotlin函数获取城市ID列表如下所示 private fun getCityIds(): ListString { val cityIdsEntity: ResponseEntityListString restTemplate .exchange( http://localhost: $localServerPort/cityids , HttpMethod.GET, null , object : ParameterizedTypeReferenceListString() {}) return cityIdsEntity.body!! } 并获取城市的详细信息 private fun getCityForId(id: String): City { return restTemplate.getForObject( http://localhost: $localServerPort/cities/$id , City:: class .java)!! } 给定这两个功能可以很容易地将它们组合起来以便返回城市列表 val cityIds: ListString getCityIds() val cities: ListCity cityIds .stream() .mapCity { cityId - getCityForId(cityId) } .collect(Collectors.toList()) cities.forEach { city - LOGGER.info(city.toString()) } 该代码非常易于理解但是涉及8个阻塞调用– 1.获取7个城市ID的列表然后获取每个城市的详细信息 2.获取七个城市中每个城市的详细信息 这些调用中的每一个都会位于不同的线程上。 结合使用非阻塞IO和回调 我将使用一个名为AsyncHttpClient的库来进行非阻塞IO调用。 进行远程调用时AyncHttpClient返回一个ListenableFuture类型。 val responseListenableFuture: ListenableFutureResponse asyncHttpClient .prepareGet( http://localhost: $localServerPort/cityids ) .execute() 可以将回调附加到可监听的将来以便在可用时对响应进行操作。 responseListenableFuture.addListener(Runnable { val response: Response responseListenableFuture.get() val responseBody: String response.responseBody val cityIds: ListLong objectMapper.readValueListLong(responseBody, object : TypeReferenceListLong() {}) .... } 给定cityids列表我想获取城市的详细信息因此从响应中我需要进行更多的远程调用并为每个调用附加一个回调以按照以下方式获取城市的详细信息 val responseListenableFuture: ListenableFutureResponse asyncHttpClient .prepareGet( http://localhost: $localServerPort/cityids ) .execute() responseListenableFuture.addListener(Runnable { val response: Response responseListenableFuture.get() val responseBody: String response.responseBody val cityIds: ListLong objectMapper.readValueListLong(responseBody, object : TypeReferenceListLong() {}) cityIds.stream().map { cityId - val cityListenableFuture asyncHttpClient .prepareGet( http://localhost: $localServerPort/cities/$cityId ) .execute() cityListenableFuture.addListener(Runnable { val cityDescResp cityListenableFuture.get() val cityDesc cityDescResp.responseBody val city objectMapper.readValue(cityDesc, City:: class .java) LOGGER.info( Got city: $city ) }, executor) }.collect(Collectors.toList()) }, executor) 这是一段粗糙的代码在一个回调中有一组回调很难对此进行推理和理解因此被称为回调地狱。 在Java CompletableFuture中使用非阻塞IO 通过返回Java的CompletableFuture作为返回类型而不是ListenableFuture可以对代码进行一些改进。 CompletableFuture提供允许修改返回的返回类型的运算符。 例如考虑获取城市ID列表的函数 private fun getCityIds(): CompletableFutureListLong { return asyncHttpClient .prepareGet( http://localhost: $localServerPort/cityids ) .execute() .toCompletableFuture() .thenApply { response - val s response.responseBody val l: ListLong objectMapper.readValue(s, object : TypeReferenceListLong() {}) l } } 在这里我使用“ thenApply”运算符将“ CompletableFuture Response”转换为“ CompletableFuture List Long ” 并类似地获得城市的详细信息 private fun getCityDetail(cityId: Long): CompletableFutureCity { return asyncHttpClient.prepareGet( http://localhost: $localServerPort/cities/$cityId ) .execute() .toCompletableFuture() .thenApply { response - val s response.responseBody LOGGER.info( Got {} , s) val city objectMapper.readValue(s, City:: class .java) city } } 这是基于回调方法的改进但是CompletableFuture缺少足够的运算符例如在这种特定情况下需要将所有城市详细信息放在一起 val cityIdsFuture: CompletableFutureListLong getCityIds() val citiesCompletableFuture: CompletableFutureListCity cityIdsFuture .thenCompose { l - val citiesCompletable: ListCompletableFutureCity l.stream() .map { cityId - getCityDetail(cityId) }.collect(toList()) val citiesCompletableFutureOfList: CompletableFutureListCity CompletableFuture.allOf(*citiesCompletable.toTypedArray()) .thenApply { _: Void? - citiesCompletable .stream() .map { it.join() } .collect(toList()) } citiesCompletableFutureOfList } 我使用了一个名为CompletableFuture.allOf的运算符该运算符返回“ Void”类型并且必须强制返回所需的“” CompletableFuture List City 类型。 使用Project Reactor Project Reactor是Reactive Streams规范的实现。 它有两种特殊类型可返回0/1项目流和0 / n项目流–前者是Mono后者是Flux。 Project Reactor提供了一组非常丰富的运算符这些运算符允许以多种方式转换数据流。 首先考虑该函数以返回城市ID列表 private fun getCityIds(): FluxLong { return webClient.get() .uri( /cityids ) .exchange() .flatMapMany { response - LOGGER.info( Received cities.. ) response.bodyToFluxLong() } } 我正在使用Spring出色的WebClient库进行远程调用并获得Project反应器“ Mono ClientResponse”类型的响应可以使用“ flatMapMany”运算符将其修改为“ Flux Long”类型。 在给定城市ID的情况下沿着相同的路线获取城市的详细信息 private fun getCityDetail(cityId: Long?): MonoCity { return webClient.get() .uri( /cities/{id} , cityId!!) .exchange() .flatMap { response - val city: MonoCity response.bodyToMono() LOGGER.info( Received city.. ) city } } 在这里使用“ flatMap”运算符将项目反应堆“ Mono ClientResponse”类型转换为“ Mono City”类型。 以及从中获取城市ID和城市的代码 val cityIdsFlux: FluxLong getCityIds() val citiesFlux: FluxCity cityIdsFlux .flatMap { this .getCityDetail(it) } return citiesFlux 这非常具有表现力-对比了基于回调的方法的混乱和基于响应流的方法的简单性。 结论 在我看来这是使用基于响应流的方法的最大原因之一尤其是在涉及跨越异步边界的场景例如在这种情况下进行远程调用的情况下尤其是Project Reactor。 它清除了各种回调和回调地狱并提供了使用一组丰富的运算符修改/转换类型的自然方法。 我在这里使用的所有示例的工作版本的存储库位于https://github.com/bijukunjummen/reactive-cities-demo/tree/master/src/test/kotlin/samples/geo/kotlin 翻译自: https://www.javacodegeeks.com/2019/06/callback-hell-reactive-patterns.html
http://www.yutouwan.com/news/211411/

相关文章:

  • 网站设计深圳联系电话?百度贴吧论坛
  • 防邪办网站建设方案文档seo专员是指什么意思
  • 网站建设氺金手指排名14写网站建设需求文档
  • 广州 济南网站建设公司 网络服务网站建设专员一定要会网站建设吗
  • 视频直播网站建设招聘信息网站建设
  • 制作app免费网站模板如何做百度推广网站
  • 影视文化传媒公司网站建设wordpress 显示文章摘要
  • 衡阳网站优化方案公司宣传册设计与制作公司
  • 公司网站建设需要要求什么软件报价网站系统
  • wap自助建论坛网站什么软件推广比较赚钱
  • 网站后台建设协议书如何做推广
  • 网站案例展示怎么做报名入口网站建设
  • 唐山官方网站建设wordpress博客注册
  • 网站页面链接结构怎么开发软件挣钱
  • 企业网站seo营销中天建设集团有限公司重庆分公司
  • 神华科技网站建设WordPress中文企业免费主题
  • 腾讯快速建站平台为何网站建设公司报价不同
  • 余杭网站建设淘宝详情页设计
  • 衡水做网站优化做一网站需要哪些语言
  • 公司做网站需要注意些什么汕头站扩建进展
  • 制作小程序网站源码dw超链接自己做的网站
  • 网站的建设模式是指什么百度指数查询移动版
  • 给公司做兼职维护网站多少钱seo外链平台
  • 提高网站排名怎么做超级优化大师
  • 中国建设会计协会网站首页对伊利网站建设建议
  • 中海外交通建设有限公司网站九讯鹿网站建设
  • 门户网站建设 考核页面好看的蛋糕网站
  • 网站建设空间什么意思app网站设计制作
  • 外贸做哪些网站平台好福步论坛外贸网
  • 如何建站网站建设网站价格