Netty

异步神器CompletableFuture

廉价感情. 提交于 2021-01-22 04:47:05
介绍 上个礼拜我们线上有个接口比较慢,这个接口在刚开始响应时间是正常的。但随着数据量的增多,响应时间变慢了。 这个接口里面顺序调用了2个服务,且2个服务之间没有数据依赖。我就用CompletableFuture把调用2个服务的过程异步化了一下,响应时间也基本上缩短为原来的一半,问题解决。 正好上次分享了函数式接口和Stream的使用,这次就分享一下CompletableFuture,里面也用到了大量的函数式接口 想方便的异步执行任务,就必须放到单独的线程中。继承Thread类,实现Runnable都不能拿到任务的执行结果,这时就不得不提创建线程的另一种方式了,实现Callable接口。 @FunctionalInterface public interface Callable < V > { V call () throws Exception ; } Callable接口一般配合ExecutorService来使用 // ExecutorService.java <T> Future<T> submit (Callable<T> task) ; ExecutorService executor = Executors.newCachedThreadPool(); Future<Integer> result = executor.submit(() -> { int sum =

Java常用第三方库大全

牧云@^-^@ 提交于 2021-01-21 11:14:14
一、JAVA核心扩展   JAVA的标准库虽然提供了那些最基本的数据类型操作方法,但仍然对一些常见的需求场景,缺少实用的工具类。而另一些则是JAVA标准库本身不够完善,需要第三方库去加以补充的。   1、Apache Commons Lang   Apache Commons Lang是Apache最著名的JAVA库 (GitHub上的代码库),它是对java.lang的很好扩展,包含了大量非常实用的工具类,其中用的最多的有StringUtils,DateUtils,NumberUtils等。   除了Apache Commons Lang,还有一些其他的Apache库也是对JAVA本身的很好补充,如Apache Commons Collection,Apache Commons IO,Apache Commons Math   2、Google Cuava   Google Cuava包含了Google在自己的JAVA项目中所使用的一些核心JAVA库。包含了对:集合,缓存,并发库,字符串处理, I/O等各个方面的支持。另外Google开发的库总是以性能著称。   3、Joda-Time   Java SE 8之前的JAVA版本中对日期的支持是比较差的,Joda-Time被经常被使用来替换原有的日期系统,它能够支持更多的日历体系,并提供了很多非常方便的日期处理方法

spring boot启动报错Error starting ApplicationContext(未能配置数据源)

删除回忆录丶 提交于 2021-01-21 09:39:12
主要错误: Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. 未能配置数据源:未指定“url”属性,也无法配置嵌入式数据源。 Error starting ApplicationContext . To display the conditions report re - run your application with 'debug' enabled . 2019 - 06 - 03 09 : 47 : 45.300 ERROR 23160 -- - [ //加入Java开发交流君样:756584822一起吹水聊天 main ] o . s . b . d . LoggingFailureAnalysisReporter : * * * * * * * * * * * * * * * * * * * * * * * * * * * APPLICATION FAILED TO START * * * * * * * * * * * * * * * * * * * * * * * * * * * Description : Failed to configure a DataSource : 'url'

没搞清楚网络I/O模型?那怎么入门Netty

99封情书 提交于 2021-01-18 17:03:47
本文是Netty系列笔记第2篇 Netty是网络应用框架,所以从最本质的角度来看,是对网络I/O模型的封装使用。 因此,要深刻理解Netty的高性能,也必须从网络I/O模型说起。 看完本文,可以回答这三个问题: 五种I/O模型是什么?核心区别在哪里? 同步=阻塞?异步=非阻塞? Netty的高性能,是采用了哪种I/O模型? 1.掌握五种I/O模型的关键钥匙 Unix系统下的五种基本I/O模型大家应该都有所耳闻,分为: blocking I/O(同步阻塞IO,BIO) nonblocking I/O(同步非阻塞IO,NIO) I/O multiplexing (I/O多路复用) signal driven I/O(信号驱动I/O) asynchronous I/O(异步I/O,AIO) 每种I/O的特性如何,尤其是同步/非同步、阻塞/非阻塞的区别,其实很多人并不能准确地进行区分。 所以,我们先把最核心的“钥匙”告诉大家,带着这把“钥匙”再来看I/O模型的关键问题,就能手到擒来了。 当一次网络IO发生时,主要涉及到 三个对象 : 发起此次IO操作的Process或者Application 系统内核kernel。用户进程无法直接操作I/O设备,必须通过系统内核kernel与I/O设备交互。 I/O设备,包括网络、磁盘等。本文主要针对网络。 真正的I/O过程,主要分为 两个阶段 :

java并发之TimeUnit理解

一笑奈何 提交于 2021-01-18 17:02:29
TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep(),在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它,事实上sleep方法本身也很常用而且出现在很多面试中。如果你已经使用过Thread.sleep(),当然我确信你这样做过,那么你一定熟知它是一个静态方法,暂停线程时它不会释放锁,该方法会抛出InterrupttedException异常(如果有线程中断了当前线程)。但是我们很多人并没有注意的一个潜在的问题就是它的可读性。Thread.sleep()是一个重载方法,可以接收长整型毫秒和长整型的纳秒参数,这样对程序员造成的一个问题就是很难知道到底当前线程是睡眠了多少秒、分、小时或者天。看看下面这个Thread.sleep()方法: Thread.sleep(2400000) 粗略一看,你能计算出当前线程是等待多长时间吗?可能有些人可以,但是对于大多数程序员来说这种写法的可读性还是很差的,你需要把毫秒转换成秒和分,让我们来看看另外一个例子,这个例子比前面那个例子可读性稍微好一点: Thread.sleep(4*60*1000); 这比前面那个例子已经好多了,但是仍然不是最好的,你注意到睡眠时间用毫秒

Netty大小端

此生再无相见时 提交于 2021-01-15 02:27:20
Netty大小端 在网络传输的过程中,字节存在俩种序列方式,即大端序和小端序。 举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。 大端字节序:高位字节在前,低位字节在后,这是人类读写数值的方法。 小端字节序:低位字节在前,高位字节在后,即以0x1122形式储存。 咱们拿一个数字886来举例子: 888的二进制为: 【0000 0000】 【0000 0000】【0000 ‭0011】 【0111 1000】‬,以字节单位打印出来为: [0, 0, 3, 120] ,这种方式就是大端序。 如果按照小端序那么888的二进制为: ‭ 【0111 1000】‬ 【0000 0011】 【0000 0000】【0000 0000】,以字节为单位打印出来为:[120, 3, 0, 0],这种方式就是小端序。 Netty大端序写入:[0, 0, 3, 120] ByteBuf buf = ByteBufAllocator.DEFAULT.buffer(4 ); buf.writeInt( 888 ); byte [] n = new byte [4 ]; System.out.println(buf.readBytes(n)); System.out.println(Arrays.toString(n)); Netty小端序写入:[120, 3, 0, 0]

throws、throw、try、catch、finally 分别代表什么意义?

百般思念 提交于 2021-01-14 13:12:26
throws、throw、try、catch、finally 分别代表什么意义? Java的异常处理是通过5个关键词来实现的:try、catch、throw、throws和finally。 一般情况下是用try来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally)由缺省处理器来处理。 try:指定一块预防所有“异常”的程序。 catch:紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。 throw:用来明确地抛出一个“异常”。 throws:标明一个成员函数可能抛出的各种“异常”。 Finally:不管发生什么“异常”都被执行一段代码。 最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822 来源: oschina 链接: https://my.oschina.net/u/4412708/blog/4898609

秀出天际!腾讯T4梳理的Java核心宝典(框架+原理+笔记+导图)

北战南征 提交于 2021-01-14 10:58:51
Java语言今年已经25岁了,仍常年稳坐各大编程语言榜单前列,一直是大多数开发者心中最流行的编程语言。 Java工程师的就业面广、薪资高,这得益于 Java 语言优良的关键特性。现在越来越多的人仍旧不断地加入到学习 Java 的队伍中来,小编在此就给大家带来一份腾讯T4大佬精心整理的Java核心宝典,来帮助大家学习提升自己! 下面我们来看看这份腾讯T4大佬整理的Java核心宝典: 本文内容分为三部分 第一部分: JavaSE部分,主要讲Java基础的知识(小白看过来),觉得自己基础不是很好的朋友也看看用作参考,查漏补缺 第二部分: 框架部分,主要讲解面试中常见的微服务、网络编程、分布式存储和分布式计算等必备知识点。 第三部分: 原理部分,主要讲解JVM原理、多线程、数据结构和算法、分布式缓存、设计模式等面试必备知识点。 JavaSE部分 目录 限于平台篇幅原因,更多内容展示不了,感兴趣的朋友帮忙帮忙一键三连后,见下图加小助理VX(gyhycx7980)即可免费领取到! 内容 第 2 章 开发环境搭建 第 5 章 Java编码规范 第 11 章 面向对象基础 第 20 章 对象容器—集合 第 27 章 注解 第 29 章 项目实战 限于平台篇幅原因,更多内容展示不了,感兴趣的朋友帮忙帮忙一键三连后,见下图加小助理VX(gyhycx7980)即可免费领取到! 框架部分 目录

外行人都能看懂的WebFlux,错过了血亏!

限于喜欢 提交于 2021-01-14 07:59:37
前言 只有光头才能变强。 文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y 本文知识点架构: 知识点架构 如果有关注我公众号文章的同学就会发现,最近我不定时转发了一些比较好的WebFlux的文章,因为我最近在学。 我之前也说过,学习一项技术之前,先要了解为什么要学这项技术。其实这次学习 WebFlux 也没有多大的原生动力,主要是在我们组内会轮流做一次技术分享,而我又不知道分享什么比较好… 之前在初学大数据相关的知识,但是这一块的时间线会拉得比较长,感觉赶不及小组内分享(而组内的同学又大部分都懂大数据,就只有我一个菜鸡,泪目)。所以,想的是:“要不我学点新东西搞搞?”。于是就花了点时间学 WebFlux 啦~ 这篇文章主要讲解什么是 WebFlux ,带领大家入个门,希望对大家有所帮助(至少看完这篇文章,知道WebFlux是干嘛用的) 一、什么是WebFlux? 我们从 Spring 的官网拉下一点点就可以看到介绍 WebFlux 的地方了 WebFlux的简介 从官网的简介中我们能得出什么样的信息? 我们程序员往往 根据不同的应用场景选择不同的技术 ,有的场景适合用于同步阻塞的,有的场景适合用于异步非阻塞的。而 Spring5 提供了一整套 响应式 (非阻塞)的技术栈供我们使用(包括Web控制器、权限控制

Netty socket 客户端 如何正确重新连接服务端 接收数据推送

徘徊边缘 提交于 2021-01-13 18:58:02
当服务端断开连接时 需要客户端进行重新连接 错误写法: 以上写法 根据全局成员非静态变量 connectStatus 判断 是否建立连接时。读取不到更新后的值。 当修改 connectStatus 为全局静态变量时 可以读取到最新的值,但是会导致不能及时的将线程池中的任务 取消掉 会对服务端进行多次连接。从而服务端 推送过来的数据 不能接收到。 关于重连注意点: ChannelFuture future = client.connect( socketIp , port ) ; future.awaitUninterruptibly() ; 初始化连接使用这个 Future.awaitUninterruptibly 当再 channelInactive 进行异步定时重连时 不能加 await() 会导致程序阻塞。 上述代码导致的问题: 遇到得奇葩问题: 当标红方法 不是静态方法,时普通成员方法 这个定时任务不会执行。 最优写法: 采用schedule 延迟执行,监听返回结果 如果没有连接成功 则进行递归操作;否则停止任务。 本文分享自微信公众号 - 纯洁的明依(chenmingyi20181223)。 如有侵权,请联系 support@oschina.cn 删除。 本文参与“ OSC源创计划 ”,欢迎正在阅读的你也加入,一起分享。 来源: oschina 链接: https:/