Spring Async和Java的8 CompletableFuture

众所周知,我不是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);
}

我想知道为什么在示例中仍然存在“未来”,而我们已经介绍了Java8 CompletableFuture 。 我猜想原始作者想保持与Java早期版本(6/7)的向后兼容性-在该版本中该构造不可用

似乎其他人也有同样的问题, 在这里写了一个很好的例子。 在其中的一条注释中,您可以看到一个提示,即从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

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

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

相关文章

JustOj 1032: 习题6.7 完数

题目描述 一个数如果恰好等于它的因子之和&#xff0c;这个数就称为"完数"。 例如&#xff0c;6的因子为1、2、3&#xff0c;而6123&#xff0c;因此6是"完数"。 编程序找出N之内的所有完数&#xff0c;并按下面格式输出其因子&#xff1a; 输入 N 输出 ?…

mysql 触发器 本表_MySQL触发器处理本表数据

关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数据。在MySQL中写触发器操作关于MySQL的触发器&#xff0c;基本上每个Mysql教程里都有讲到&#xff0c;但是我发现那些教程里讲的都是如何处理其他表的数…

JS 操作cookie

平时网站的开发中cookie用的还是用的比较多的&#xff0c;因为cookie在客户端&#xff0c;所以用js操作的比较多&#xff0c;下面是常用的设置、查找、删除等功能实现。 function addCookie(objName, objValue, objHours){//添加cookie var str objName "" esc…

官方野生蝇群流口水分数

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

SQL-十步完全理解 SQL

十步完全理解 SQL http://blog.jobbole.com/55086/ 刚开始看到了 执行顺序&#xff0c;写得挺好的&#xff0c;明天继续转载于:https://www.cnblogs.com/hpyg/p/7270168.html

MySQL 高水位update_Oracle delete 高水位线处理问题

最近遇到oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete oracle 高水位没有下降的最近遇到Oracle 表中数据量很大查询和更新比较慢 需要删除&#xff0c;发现删除后查询速度还是很慢&#xff0c;原来是delete…

jasperreports_JasperReports JSF插件用例–简单列表报告

jasperreports这是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我将专注于一个简单的需求&#xff0c;并且我将进一步深入。 起点是我们已经为图书商店完成的项目设置&#xff0c;我将向其中添加一个列表&#xff0c;其中包含在数据库中注册的其他图书&#xf…

mysql optimizer_mysql 参数optimizer_switch

mysql 5.1中开始引入optimizer_switch, 控制mysql优化器行为。他有一些结果集&#xff0c;通过on和off控制开启和关闭优化器行为。使用有效期全局和会话两个级别&#xff0c;在5.5中optimizer_swtich 可取结果如下&#xff0c;不同mysql版本可取结果不同。5.1和5.6参考官方文档…

2个菜鸟Java常量和枚举陷阱

在对Java和Groovy代码进行的各种代码审查中&#xff0c;我经常看到魔术数字和其他随机字符串在整个代码库中乱七八糟。 例如&#xff0c;魔术数字是下面的代码&#xff08;Groovy&#xff09;中的4.2&#xff1a; if (swashbuckle > 4.2) {... }4.2是什么意思&#xff1f;…

欧拉函数 euler

O - 找新朋友1、欧拉函数 euler&#xff08;&#xff09;在数论&#xff0c;对正整数n&#xff0c;欧拉函数是 少于或等于n的数中与n 互质 的数的数目。互质&#xff1a;公约数只有 1 的两个整数&#xff0c;称为互质整数。即 最大的公约数也就是 1 euler&#xff08;&#xf…

mysql cluster 外键_Mysql外键约束

Mysql集群创建外键&#xff0c;分为四种约束&#xff1a;no action&#xff0c;restrict&#xff0c;cascade&#xff0c;set null。如果表A的主关键字是表B中的字段&#xff0c;则该字段称为B的外键&#xff0c;表A称为主表&#xff0c;表B称为从表。外键是用来实现参照完整性…

Map类集合遍历

转载于:https://www.cnblogs.com/Neil223/p/7275035.html

小米10解锁bl跳过168_2021年小米红米手机官方解锁BL详细教程+跳过168小时方法合集...

MIUI的解锁风控一直在改动&#xff0c;从之前的无需解锁到现在的168小时绑定限制&#xff0c;时至2021年我们再次重新整理下小米的解锁新规则以及小米解锁常见问题解决方法。比如大家常问的如果跳过168小时解锁时间限制等等小米解锁工具下载&#xff1a;http://miuirom.xiaomi.…

orderby排序慢_使用@OrderBy对Spring Data MongoDB集合进行排序

orderby排序慢这是关于调整和增强Spring Data MongoDB功能的第三篇文章。 这次&#xff0c;我发现我错过了一个JPA功能– OrderBy批注。 OrderBy指定在检索关联值时集合值关联的元素的顺序。 在本文中&#xff0c;我将展示如何使用Spring Data MongoDB使用OrderBy批注实现排序 …

细节取胜的javadoc

今个以为开发经验丰富的同事提出有个改动有问题&#xff0c;希望改一下。老前辈发话&#xff0c;心虚的紧&#xff0c;立即看了下&#xff0c;问题说是我的方法凝视中写了一个 ** doesnt ** 建议改为 does not 说这个生成javadoc有问题。咦。不禁困惑&#xff0c;这个写法我记得…

android实现箭头流程列表_Android开发关于ExpandableListView上下箭头左右显示的笔记...

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;关键属性&#xff1a;android:layoutDirection""当安卓的layoutDirection “rtl” 时&#xff0c;箭头在右边显示布局&#xff1a;android:layout_width"match_parent"android:layout_height…

Java A的新本地变量类型推断

对于编程语言迷来说&#xff0c;新闻几乎比这更令人兴奋&#xff01; 现在有一个状态为“候选”的本地变量类型推断的JEP 286 。 以及Brian Goetz的反馈请求&#xff0c;我很想邀请您参加&#xff1a; http : //mail.openjdk.java.net/pipermail/platform-jep-discuss/2016-Ma…

扩展kmp

拓展kmp是对KMP算法的扩展&#xff0c;它解决如下问题&#xff1a; 定义母串S&#xff0c;和字串T&#xff0c;设S的长度为n&#xff0c;T的长度为m&#xff0c;求T与S的每一个后缀的最长公共前缀 其中next数组表示T[i,m-1]和T的最长公共前缀 1 const int maxn100010; //字符…

linux中mysql导入数据库命令_linux下mysql数据库导入导出命令

首先linux 下查看mysql相关目录rootubuntu14:~# whereis mysqlmysql:/usr/bin/mysql—- mysql的运行路径/etc/mysql/usr/lib/mysql—– mysql的安装路径/usr/bin/X11/mysql/usr/share/mysql/usr/share/man/man1/mysql.1.gz此外还有一个&#xff1a;var/lib/mysql ——–mys…

转载:FilenameUtils的工具类

一、概述 这是一个Java操作文件的常用库&#xff0c;是Apache对java的IO包的封装&#xff0c;这里面有两个非常核心的类FilenameUtils跟FileUtils&#xff0c;其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装&#xff0c;开发中对文件的操作&#xff0c;几乎都可以…