spring async_Spring Async和Java的8 CompletableFuture

spring async

众所周知,我不是Spring的最大粉丝,但是当时我在一个组织中工作,该组织使用Spring(以不同的形式和版本)维护了太多的项目。 我仍然对Spring持怀疑态度,当然有一些很好的主意,有一些很好的(太多)抽象,有一些非常方便的“捷径”来引导复杂的项目。 在这篇文章中,我不会详细说明我不喜欢的事情。

我喜欢Spring的文档,这是他们的入门指南。 写得好具体。 我正在通过SpringBoot / RestApi [ link ]阅读有关“ 异步 ”方法执行的简短指南。

这就是示例“ asynchronous” findUser()方法的实现。 完整的源代码在这里 。

@Async
public Future<User> findUser(String user) throws InterruptedException {System.out.println("Looking up " + user);User results = restTemplate.getForObject("https://api.github.com/users/" + user, User.class);// Artificial delay of 1s for demonstration purposesThread.sleep(1000L);return new AsyncResult<User>(results);
}

我想知道为什么在示例中仍然有一个“ Future”,而我们已经介绍了Java8 CompletableFuture 。 我猜想原始作者想保留与Java早期版本(6/7)的向后兼容性,因为Java以前没有这种构造

似乎其他人也有同样的问题,并在这里写了一个很好的例子。 在其中的一条注释中,您可以看到一个提示,即从4.2版及更高版本开始,Spring API将与已经提供的Future&AsyncResult之上的CompletableFuture兼容。 我想,“ 很好,这是一个耻辱,为什么不尝试甚至记录下来,因为如果有人使用此示例,他/她可能会保留当前的实现方式 ” –为什么不使用某种标准?

因此,我决定做一个小小的更改,删除Future并用CompletableFuture替换它,还注释掉对Future.isDone()的调用,并用非常方便的CompletableFuture.allof()方法替换它。

因此,我更改了“服务”方法的返回类型,同时更新了调用方代码-以同步所有3个期货,一旦allof()完成,我们就可以打印结果。

package hello;import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class GitHubLookupService {RestTemplate restTemplate = new RestTemplate();@Asyncpublic CompletableFuture findUser(String user) throws InterruptedException {System.out.println("Looking up " + user);User results = restTemplate.getForObject("https://api.github.com/users/" + user, User.class);// Artificial delay of 1s for demonstration purposesThread.sleep(1000L);return CompletableFuture.completedFuture(results);}}

修改后的示例可以在此处找到。 我从Tomasz Nirkewicz找到了这个和这篇博客文章, 这是CompletableFuture丰富方法列表的非常不错且实用的指南。 我最喜欢的Devoxx演讲者Jose Paumard也做了一个非常完整的演讲,您可以在这里找到。

@Overridepublic void run(String... args) throws Exception {// Start the clocklong start = System.currentTimeMillis();// Kick of multiple, asynchronous lookupsCompletableFuture page1 = gitHubLookupService.findUser("PivotalSoftware");CompletableFuture page2 = gitHubLookupService.findUser("CloudFoundry");CompletableFuture page3 = gitHubLookupService.findUser("Spring-Projects");// Wait until they are all done//while (!(page1.isDone() && page2.isDone() && page3.isDone())) {//  Thread.sleep(10); //10-millisecond pause between each check//}//wait until all they are completed.CompletableFuture.allOf(page1,page2,page3).join();//I could join as well if interested.// Print results, including elapsed timeSystem.out.println("Elapsed time: " + (System.currentTimeMillis() - start) +" ms");System.out.println(page1.get());System.out.println(page2.get());System.out.println(page3.get());}

链接

  • https://spring.io/guides/gs/async-method/
  • http://geowarin.github.io/completable-futures-with-spring-async.html
  • http://www.nurkiewicz.com/2013/05/java-8-completablefuture-in-action.html
  • http://www.nurkiewicz.com/2013/05/java-8-definitive-guide-to.html
  • https://github.com/javapapo/projects-from-blog/tree/master/spring-async-complfuture

翻译自: https://www.javacodegeeks.com/2016/04/spring-async-javas-8-completablefuture.html

spring async

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

公里与英里的换算c语言函数_60迈=60码=60公里?这三者天壤之别,可别搞错了

说到行车速度&#xff0c;大家经常用的是这三个单位&#xff1a;码、迈、公里/时&#xff0c;很多人以为这三者是同一个意思&#xff0c;都是每小时多少公里。实际上这三者并不等同&#xff0c;下面小编科普一下这几个词的差异。码1码不等于1公里&#xff0c;而是等于0.9144米&…

php3.2.3分组查询,ThinkPHP3.2.3版本如何设置应用分组

鑫强已经解决了我的解决方法是创建两个入口文件实际上我的目的就是想要达到两个模块共用一个配置文件和公共函数文件我的解决方法是在项目根目录下建立两个入口文件一个是Index.php与Root.php两个入口文件其中是这样写的Index.php{<?php #前台入口文件 header(Conte…

FFmpeg options

libavformat options libavcodec options

通过图书编号查询python,基于Python的ISBN书号查询示例代码-六派数据

示例代码本代码示例是基于Python的六派数据接口进行数据请求API服务请求的代码示例&#xff0c;使用前你需要&#xff1a;以下是完整代码示例&#xff1a;#!/usr/bin/env python# -*- coding: utf-8 -*-# 测试环境: python2.7# 安装requests依赖 > pip install requests/ ea…

归约操作java8_使用Java 8进行分组,转换和归约

归约操作java81.简介 在上一篇文章中 &#xff0c;我写了关于如何使用流和分组对对象集合进行分组的文章。 这很有用&#xff0c;但不涵盖特定的用例。 例如&#xff0c;有时我们不仅需要对事物进行分组&#xff0c;还需要将结果转换为更合适的对象。 在这篇文章中&#xff0c…

C++ 11 深度学习(一)auto、头文件防卫、引用、常量

1.数组初始化 int a[]{ 1,2,3,4,5 }; 2.C11 auto auto可以在声明变量的时候根据变量的初始值的类型自动为此变量先择合适的类型&#xff0c;声明时要赋予初值。 auto自动推导发生在编译期间 auto A 10;//A会被自动推导为int类型 3.头文件防卫式声明 作用:防止头文件重…

flux storm_Apache Storm:如何使用Flux配置KafkaBolt

flux storm微型框架中的助焊剂可以帮助我们定义和部署Storm拓扑。 Flux有各种包装器&#xff0c;可帮助您定义所需的流并初始化Bolts和Spouts&#xff08;使用带有或不带有参数的构造函数&#xff0c;并通过反射自动调用自定义配置方法&#xff09;。 您只需要使用Flux就是将…

android 在什么情况下会主动gc_Python 什么情况下会生成 pyc 文件?

作者&#xff1a;折木奉太郎(经授权转载)来源&#xff1a;https://www.zhihu.com/question/30296617/answer/112564303作为 Python 爱好者&#xff0c;需要了解 .py 脚本的基本运行机制及特性&#xff1a;在很多工作上&#xff0c;Python 的运行流程基本上取决于用户&#xff0…

oracle 查看内存参数配置,Oracle内存参数配置及版本问题

Oracle的内存配置与Oracle性能息息相关。从总体上讲&#xff0c;可以分为两大块&#xff1a;共享部分(主要是SGA)和进程独享部分(主要是PGA)。在 32 位操作系统下 的Oracle版本&#xff0c;不时有项目反馈关于内存的错误(如ORA-04030、04031错误)都是十分令人头疼的问题。查阅资…

【IP协议头分析】

Version 版本号 IHL IP头长度 Type of Service Total Length 总长度 Identification 拆包的唯一标识 Flags 1位保留 &#xff0c; 2位 允许拆包 3位 不允许拆包 Fragment offset 在原包偏移量 Time to Live 时间或路由跳数 Protocol IP中是什么协议类型 Header Check…

乡村野生草药_官方野生蝇群流口水分数

乡村野生草药官方是什么&#xff1f; 标题太小&#xff0c;但有用的贡献。 Wildfly Swarm允许我们创建相当小的自包含应用程序&#xff0c;包括我们从Wildfly Application Server中需要的应用程序。 在这篇文章中&#xff0c;我们将研究与Wildfly Swarm合作使用的Drools分数 。…

obs多推流地址_(无人直播)教程利用OBS推流抖音直播电脑屏幕或PC游戏

目前的火爆程度相信大家都有目共睹&#xff0c;也為部分活躍用戶提供直播功能&#xff0c;開通直播的方法有&#xff1a;①粉絲達到10000粉絲&#xff0c;官方會自動邀請妳開通直播權限。②加入和官方合作的工會&#xff0c;無需粉絲&#xff0c;也可以開通直播權限。開通直播功…

oracle数据库sqlloader,sql loader ---ORACLE SQLLDR

sql loader的基本使用&#xff1a;1. sql loader里有几个概念&#xff1a;控制文件&#xff1a;和数据库的文件不是一回事&#xff0c;个人理解是用于数据加载控制的。数据文件&#xff1a;要加载入库的数据文件&#xff0c;支持文本&#xff0c;csv, 等格式。 数据文件的内容可…

倒数日电脑版_应用日报|iOS 或更名为 iPhoneOS,倒数日 Mac 版上线限时免费

今日推荐倒数日 Days Matter for Desktop免费&#xff0c;macOS 86 MB倒数日 Days Matter 是 iOS 端非常经典的应用&#xff0c;今天它的 Mac 版本上线&#xff0c;限时免费 7 天。它延续了 iOS 端的风格语言&#xff0c;同样能帮你记录生活中重要的日子&#xff1a;例如恋人…

【TPC协议头解析】

Source Port 源端口 Destination Port 目的端口 Sequence Number 数据报编号 (seq)&#xff08;按字节序&#xff09;保证有序 Acknowledgment Number (ACK) 报文应答, 保证可靠性 Data offset 跳到data数据部分 Reserved 保留部分 URG 紧急数据标识 ACK 确认消息…

hibernate查询缓存_在Hibernate中启用实体和查询缓存

hibernate查询缓存1.简介 在我执行过的与性能相关的任务中&#xff0c;这就是其中之一。 令人担心的是&#xff0c;如果对于特定实体每次都调用相同的查询&#xff0c;并且表数据在特定的时隙内不易更改&#xff0c;则我们可以使用Hibernate缓存查询结果。 这意味着&#xff0c…

iphone新旧手机数据传输已取消_如何取消iPhone手机App自动扣费?三种方法让你不再被“偷”...

一直以来苹果手机App这个自动续费真是让大家不胜其烦&#xff0c;钱虽然不多可总是平白无故这里十块&#xff0c;那里二十块的被扣也是不小的浪费&#xff0c;日常生活中为了追追剧、听听音乐、玩玩游戏难免会开通一些App会员而选择自动续费的话每月会费是有不错优惠的&#xf…

【TCP三次握手与四次挥手最强解析】

TCP连接拥塞控制四种方法总结&#xff08;详细简单&#xff0c;稳的一批&#xff09; TCP三次握手 作用&#xff1a;确认seqnumber&#xff1b;确定窗口大小以及最大报文大小 TCP四次挥手 WAIT_TIME状态到CLOSED需要2MSL时间&#xff08;最长单位MSL为2min,一般30s&#xff0…