From 45b28d7c6830da3e8b14638fde81af0745e3f69f Mon Sep 17 00:00:00 2001 From: zsy0216 <594983498@qq.com> Date: Tue, 18 Aug 2020 17:34:40 +0800 Subject: [PATCH 01/68] fix: fix springboot version --- ...\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" index fb79859..4a6b4b4 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" @@ -1,7 +1,7 @@ ## 前言 前一章已经讲解了SpringBoot的SpringFactoriesLoader类的功能以及作用,即读取spring.factories文件中的工厂类,其中就包括了系统初始化器。在SpringBoot中,系统初始化器名称为ApplicationContextInitializer,它是一个接口,只定义了一个initialize方法。下面将详细介绍下SpringBoot的系统初始化器的原理以及作用,并且自定义一个系统初始化器,并在此基础上讲解下常见的使用场景。 -**SpringBoot版本:5.2.1.RELEASE** +**SpringBoot 版本:2.2.1.RELEASE** ## 正文 From 8cd23b26c9129e5280aa85b7fb6085913aaa41df Mon Sep 17 00:00:00 2001 From: liuhao <326047736@qq.com> Date: Wed, 21 Oct 2020 19:11:47 +0800 Subject: [PATCH 02/68] Just add code block language.. --- ...15\345\212\241\346\232\264\351\234\262.md" | 8 +-- ...0\224\342\200\224 Dubbo\347\232\204URL.md" | 2 +- ...66\357\274\210\344\270\212\357\274\211.md" | 14 ++--- ...66\357\274\210\344\270\213\357\274\211.md" | 28 +++++----- ...66\357\274\210\344\270\255\357\274\211.md" | 2 +- ...245\345\255\246\344\271\240ThreadLocal.md" | 10 ++-- ...le\345\205\263\351\224\256\345\255\227.md" | 8 +-- ...02\357\274\210\344\270\200\357\274\211.md" | 24 ++++----- ...02\357\274\210\344\272\214\357\274\211.md" | 54 +++++++++---------- ...25\345\261\202\346\272\220\347\240\201.md" | 18 +++---- ...01\344\270\216\345\216\237\347\220\206.md" | 52 +++++++++--------- .../\344\272\214\350\277\233\345\210\266.md" | 4 +- ...26\347\225\245\346\250\241\345\274\217.md" | 28 +++++----- ...50\357\274\210\344\270\212\357\274\211.md" | 44 +++++++-------- ...50\357\274\210\344\270\213\357\274\211.md" | 12 ++--- ...AnnotationAwareAspectJAutoProxyCreator.md" | 26 ++++----- ...36\347\247\230\351\235\242\347\272\261.md" | 28 +++++----- ...AnnotationAwareAspectJAutoProxyCreator.md" | 34 ++++++------ ...0\224\342\200\224SpringFactoriesLoader.md" | 16 +++--- ...50\345\212\240\350\275\275\345\231\250.md" | 10 ++-- ...13\344\273\266\346\234\272\345\210\266.md" | 34 ++++++------ ...35\345\247\213\345\214\226\345\231\250.md" | 14 ++--- ...\345\210\235\350\257\206SpringSecurity.md" | 8 +-- ...70\345\277\203\351\200\273\350\276\221.md" | 22 ++++---- ...46\273\244\345\231\250FilterChainProxy.md" | 34 ++++++------ ...04\350\277\207\346\273\244\345\231\250.md" | 20 +++---- 26 files changed, 277 insertions(+), 277 deletions(-) diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\342\200\224\342\200\224\346\234\215\345\212\241\346\232\264\351\234\262.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\342\200\224\342\200\224\346\234\215\345\212\241\346\232\264\351\234\262.md" index 758f10a..eede346 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\342\200\224\342\200\224\346\234\215\345\212\241\346\232\264\351\234\262.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\342\200\224\342\200\224\346\234\215\345\212\241\346\232\264\351\234\262.md" @@ -1,4 +1,4 @@ -``` +```Java package org.apache.dubbo.rpc; import org.apache.dubbo.common.extension.ExtensionLoader; public class Protocol$Adaptive implements org.apache.dubbo.rpc.Protocol { @@ -33,7 +33,7 @@ public class Protocol$Adaptive implements org.apache.dubbo.rpc.Protocol { } ``` -``` +```Java package org.apache.dubbo.rpc; import org.apache.dubbo.common.extension.ExtensionLoader; public class ProxyFactory$Adaptive implements org.apache.dubbo.rpc.ProxyFactory { @@ -71,7 +71,7 @@ public class ProxyFactory$Adaptive implements org.apache.dubbo.rpc.ProxyFactory } ``` -``` +```Java package org.apache.dubbo.remoting; import org.apache.dubbo.common.extension.ExtensionLoader; public class Transporter$Adaptive implements org.apache.dubbo.remoting.Transporter { @@ -99,7 +99,7 @@ public class Transporter$Adaptive implements org.apache.dubbo.remoting.Transport ![export01](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/Dubbo/export01.png) JavassistProxyFactory代码如下: -``` +```Java public class JavassistProxyFactory extends AbstractProxyFactory { @Override diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204URL.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204URL.md" index 1119488..99cea39 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204URL.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204URL.md" @@ -34,7 +34,7 @@ dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService?anyhost=true&applic 先看下Dubbo中org.apache.dubbo.common包下的URL类源码: -``` +```Java public /*final**/ class URL implements Serializable { diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\212\357\274\211.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\212\357\274\211.md" index fc509ca..b0d01fa 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\212\357\274\211.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\212\357\274\211.md" @@ -28,13 +28,13 @@ Java SPI的定义及使用步骤如下: 在com.test.spi包目录下,定义了一个PrintService接口和一个PrintServiceImpl实现类,然后在resources目录下定义了一个META-INF/services/com.test.spi.PrintService,注意这里定义的是一个 全路径名称的文件。 -``` +```Java public interface Printservice ( void printlnfo(); } ``` -``` +```Java public class PrintServicelmpl implements Printservice { @Override public void printlnfo() { @@ -43,7 +43,7 @@ public class PrintServicelmpl implements Printservice { } ``` -``` +```Java public static void main(String[] args) ( ServiceLoader serviceServiceLoader = ServiceLoader.load(PrintService.class); @@ -119,7 +119,7 @@ ExtensionLoader即扩展点加载器,它是Dubbo SPI的核心,负责加载 上图清楚的展示了LoadingStrategy接口及其实现类的关系。LoadingStrategy继承了Prioritized,因而其实现类会有优先级之分,而Dubbo默认是使用的DubboInternalLoadingStrategy,查看其三个类的源码: -``` +```Java public class DubboInternalLoadingStrategy implements LoadingStrategy { // 表示要加载的目录位置 @@ -136,7 +136,7 @@ public class DubboInternalLoadingStrategy implements LoadingStrategy { } ``` -``` +```Java public class DubboLoadingStrategy implements LoadingStrategy { // 表示要加载的目录位置 @@ -160,7 +160,7 @@ public class DubboLoadingStrategy implements LoadingStrategy { } ``` -``` +```Java public class ServicesLoadingStrategy implements LoadingStrategy { // 表示要加载的目录位置 @@ -185,7 +185,7 @@ public class ServicesLoadingStrategy implements LoadingStrategy { 这里的MAX_PRIORITY、NORMAL_PRIORITY和MIN_PRIORITY时定义在Prioritized这个接口中的,查看一下Prioritized中定义的值以及实现的compareTo方法: -``` +```Java /** * The maximum priority */ diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" index 91b2449..d99cbec 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" @@ -12,7 +12,7 @@ 另外在@SPI注解的value值指定了扩展点默认的实现类名,例如SimpleExt注解由@SPI("impl1")修饰,则表示它的实现类名为:SimpleExtImpl1,查看SPI的配置文件可证: -``` +```Java # Comment 1 impl1=org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl1#Hello World impl2=org.apache.dubbo.common.extension.ext1.impl.SimpleExtImpl2 # Comment 2 @@ -24,13 +24,13 @@ Dubbo通过ExtensionLoader去加载上述SPI配置文件,然后读取到@SPI(" Dubbo SPI的核心逻辑几乎都封装在ExtensionLoader之中,ExtensionLoader存放于dubbo-common模块的extension保重,功能类似于JDK SPI中的java.util.ServiceLoader。 下面展示了ExtensionLoader最常用的使用方式: -``` +```Java SimpleExt ext = ExtensionLoader.getExtensionLoader(SimpleExt.class).getDefaultExtension(); ``` 首先时调用ExtensionLoader#getExtensionLoader(SimpleExt.class),来获取SimpleExt类型的ExtensionLoader。查看ExtensionLoader源码如下: -``` +```Java public static ExtensionLoader getExtensionLoader(Class type) { if (type == null) { throw new IllegalArgumentException("Extension type == null"); @@ -51,11 +51,11 @@ SimpleExt ext = ExtensionLoader.getExtensionLoader(SimpleExt.class).getDefaultEx } return loader; } -``` +```Java getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经缓存了该类型的扩展点加载器,如果没有则new一个该类型的ExtensionLoader并添加进EXTENSION_LOADERS中。但需要注意的是ExtensionLoader的构造方法 中,是会先创建默认的ExtensionFactory类型的ExtensionLoader对象,然后调用getAdaptiveExtension()方法创建适配类型的扩展点实现类。 -``` +```Java private ExtensionLoader(Class type) { this.type = type; // 从此处可以知道,对于默认的ExtensionFactory.class来说,是没有objectFactory熟悉对象值的 @@ -68,7 +68,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 被赋值为AdaptiveExtensionFactory。 下面看下getExtensionClass()方法的逻辑 -``` +```Java private Class getExtensionClass(String name) { if (type == null) { throw new IllegalArgumentException("Extension type == null"); @@ -81,7 +81,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 } ``` -``` +```Java private Map> getExtensionClasses() { Map> classes = cachedClasses.get(); // 双重检测,防止并发环境下指令重排序,cachedClasses是static类型 @@ -99,7 +99,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 } ``` -``` +```Java private Map> loadExtensionClasses() { // 缓存默认的扩展点名称,这里会去读取@SPI注解 cacheDefaultExtensionName(); @@ -140,7 +140,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 } ``` -``` +```Java // 加载SPI配置文件目录 private void loadDirectory(Map> extensionClasses, String dir, String type, boolean extensionLoaderClassLoaderFirst, boolean overridden, String... excludedPackages) { @@ -173,7 +173,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 } ``` -``` +```Java private void loadClass(Map> extensionClasses, java.net.URL resourceURL, Class clazz, String name, boolean overridden) throws NoSuchMethodException { if (!type.isAssignableFrom(clazz)) { @@ -218,7 +218,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 ![SPI_ADAPTIVE](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/Dubbo/spi_@Adaptive.png) 在ExtensionFactory接口上有@SPI注解修饰,而Dubbo会在调用ExtensionFactory时,会去调用ExtensionFactory的SPI配置文件中的扩展点名称以及扩展点实现类,查看下其SPI配置文件: -``` +```Java adaptive=org.apache.dubbo.common.extension.factory.AdaptiveExtensionFactory spi=org.apache.dubbo.common.extension.factory.SpiExtensionFactory ``` @@ -232,7 +232,7 @@ AdaptiveExtensionFactory会根据运行时状态来决定给ExtensionFactory赋 下面看下AdaptiveExtensionFactory类: -``` +```Java @Adaptive public class AdaptiveExtensionFactory implements ExtensionFactory { @@ -275,7 +275,7 @@ public class AdaptiveExtensionFactory implements ExtensionFactory { 下面看看ExtensionLoader的方法: -``` +```Java private Class getAdaptiveExtensionClass() { // 获取扩展点实现类,如果缓存中没有则去扫描SPI文件,扫描到扩展点实现类后则存入cachedClasses缓存中 getExtensionClasses(); // ------------------------ ② @@ -325,7 +325,7 @@ public class AdaptiveExtensionFactory implements ExtensionFactory { 的扩展点实现类,就会去通过Javassist来生成代理代码,即生成对于的Xxx@Adaptive代码。 下面就是通过Javassist代理生产的适配类。(再Dubbo源码中的dubbo-common模块test目录下的org.apache.dubbo.extension包中有对应的测试类) -``` +```Java package org.apache.dubbo.common.extension.ext1; import org.apache.dubbo.common.extension.ExtensionLoader; diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\255\357\274\211.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\255\357\274\211.md" index 58f5d93..d9c7e01 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\255\357\274\211.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\255\357\274\211.md" @@ -65,7 +65,7 @@ 接下来的原理分析通过Dubbo源码中的test包下的代码来进行说明。(想学好开源框架,要好好利用开源框架中各种Test用例) -``` +```Java @Test public void test_getDefaultExtension() throws Exception { SimpleExt ext = getExtensionLoader(SimpleExt.class).getDefaultExtension(); diff --git "a/note/JDK/\344\270\200\347\257\207\346\226\207\347\253\240\345\277\253\351\200\237\346\267\261\345\205\245\345\255\246\344\271\240ThreadLocal.md" "b/note/JDK/\344\270\200\347\257\207\346\226\207\347\253\240\345\277\253\351\200\237\346\267\261\345\205\245\345\255\246\344\271\240ThreadLocal.md" index fbe3c0c..0235a9f 100644 --- "a/note/JDK/\344\270\200\347\257\207\346\226\207\347\253\240\345\277\253\351\200\237\346\267\261\345\205\245\345\255\246\344\271\240ThreadLocal.md" +++ "b/note/JDK/\344\270\200\347\257\207\346\226\207\347\253\240\345\277\253\351\200\237\346\267\261\345\205\245\345\255\246\344\271\240ThreadLocal.md" @@ -108,7 +108,7 @@ #### 2.1 ThreadLocal内部使用了哪些数据结构? 首先,我们来看下ThreadLocal中几个比较重要的数据结构。 -``` +```Java /** * 用于ThreadLocal内部ThreadLocalMap数据结构的哈希值,用于降低哈希冲突。 */ @@ -135,7 +135,7 @@ private static int nextHashCode() { 下面将是ThreadLocal最终要的一个数据结构:ThreadLocalMap -``` +```Java /** * ThreadLocalMap其实就是一个用于ThreadLocal的自定义HashMap,它和HashMap很像。在其内部有一个自定义的Entry类, * 并且有一个Entry数组来存储这个类的实例对象。类似于HashMap,ThreadLocalMap同样的拥有初始大小,拥有扩容阈值。 @@ -197,7 +197,7 @@ static class ThreadLocalMap { 下面回到关于ThreadLocal源码的介绍,先看看set()和get()方法源码: -``` +```Java // ThreadLocal中的set()方法 public void set(T value) { Thread t = Thread.currentThread(); @@ -244,7 +244,7 @@ static class ThreadLocalMap { -``` +```Java public T get() { // 获取当前线程 Thread t = Thread.currentThread(); @@ -280,7 +280,7 @@ static class ThreadLocalMap { 知道怎么存储以及获取ThreadLocal之后,还要知道怎么清除ThreadLocal,防止内存泄漏,下面看下remove()源码: -``` +```Java // ThreadLocal的remove()方法 public void remove() { // 获取当前线程中的ThreadLocalMap diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" index 728a6ba..79f3bfd 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" @@ -56,7 +56,7 @@ Lock引起的将当前处理器缓存该变量的数据写回到系统内存中 为了实现volatile的内存语义,编译期在生成字节码时会对使用volatile关键字修饰的变量进行处理,在字节码文件里对应位置生成一个Lock前缀指令,Lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成。 下面代码来演示一下禁止指令重排序: -``` +```Java a = 1; //语句一 b = 2; //语句二 flag = true; //语句三,flag为volatile变量 @@ -137,7 +137,7 @@ LoadLoad,StoreStore,LoadStore,StoreLoad实际上是Java对上面两种屏障的 下面来谈谈volatile的应用场景: 1. 状态标志:多个线程以一个volatile变量作为为状态标志,例如完成**初始化**或者**状态同步**。典型例子AQS的同步状态: -``` +```Java /** * The synchronization state. */ @@ -146,7 +146,7 @@ private volatile int state; 2. 一次性安全发布 最典型的例子就是安全的单例模式: -``` +```Java private static Singleton instance; public static Singleton getInstance() { //第一次null检查 @@ -164,7 +164,7 @@ public static Singleton getInstance() { 上面这种写法,仍然会出现问题——多线程调用getInstance方法时,有可能一个线程会获得还**没有初始化的对象**!这都是因为重排序的原因,具体分析这里不展开。 解决办法及时用volatile对instance进行修饰 -``` +```Java private static volatile Singleton instance; ``` 这就是经典的“双重检查锁定与延迟初始化”。 diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" index 4418513..7b87bdf 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" @@ -30,7 +30,7 @@ #### 1.1 String的修饰符与实现类 打开String源码,可以看到String类的由final修饰的,并且实现了Serializable,Comparable,CharSequence接口。 -``` +```Java public final class String implements java.io.Serializable, Comparable, CharSequence { } @@ -41,7 +41,7 @@ public final class String #### 1.2 String类的成员变量 -``` +```Java public final class String implements java.io.Serializable, Comparable, CharSequence { @@ -66,7 +66,7 @@ hash值将用于String类的hashCode()方法的计算,这里先不作具体讲 ##### 1.2.4 serialPersistentFields属性 了解过JAVA序列化的,应该清楚transient是用于指定哪个字段不被默认序列化,对于不需要序列化的属性直接用transient修饰即可。而serialPersistentFields用于指定哪些字段需要被默认序列化,具体用法如下: -``` +```Java private static final ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("name", String.class), new ObjectStreamField("age", Integer.Type) @@ -77,15 +77,15 @@ private static final ObjectStreamField[] serialPersistentFields = { #### 1.3 创建String对象 1. 直接使用"",换句话说就是使用"字面量"赋值 - ``` + ```Java String name = "bruis"; ``` 2. 使用连接符"+"来赋值 - ``` + ```Java String name = "ca" + "t"; ``` 3. 使用关键字new来创建对象 - ``` + ```Java String name = new String("bruis"); ``` 4. 除了上面最常见的几种创建String对象的方式外,还有以下方法可以创建String对象 @@ -126,7 +126,7 @@ JAVA的运行时数据区包括以下几个区域: #### 2.2 String与JAVA内存区域 下面看看使用""和new的方式创建的字符串在底层都发生了些什么 -``` +```Java public class TestString { public static void main(String[] args) { String name = "bruis"; @@ -296,7 +296,7 @@ SourceFile: "TestString.java" ``` 这里有一个需要注意的地方,在java中使用"+"连接符时,一定要注意到"+"的连接符效率非常低下,因为"+"连接符的原理就是通过StringBuilder.append()来实现的。所以如:String name = "a" + "b";在底层是先new 出一个StringBuilder对象,然后再调用该对象的append()方法来实现的,调用过程等同于: -``` +```Java // String name = "a" + "b"; String name = new StringBuilder().append("a").append("b").toString(); ``` @@ -307,7 +307,7 @@ String name = new StringBuilder().append("a").append("b").toString(); 官方文档解释为字符串常量池由String独自维护,当调用intern()方法时,如果字符串常量池中包含该字符串,则直接返回字符串常量池中的字符串。否则将此String对象添加到字符串常量池中,并返回对此String对象的引用。 下面先看看这几句代码,猜猜结果是true还是false -``` +```Java String a1 = new String("AA") + new String("BB"); System.out.println("a1 == a1.intern() " + (a1 == a1.intern())); @@ -325,7 +325,7 @@ String name = new StringBuilder().append("a").append("b").toString(); 使用字面量的方式创建字符串,要分两种情况。 ① 如果字符串常量池中没有值,则直接创建字符串,并将值存入字符串常量池中; -``` +```Java String name = "bruis"; ``` 对于字面量形式创建出来的字符串,JVM会在编译期时对其进行优化并将字面量值存放在字符串常量池中。运行期在虚拟机栈栈帧中的局部变量表里创建一个name局部变量,然后指向字符串常量池中的值,如图所示: @@ -335,7 +335,7 @@ String name = "bruis"; 2. 使用new的方式创建字符串 -``` +```Java String name = new String("bruis"); ``` 首先在堆中new出一个对象,然后常量池中创建一个指向堆中"bruis"的引用。 @@ -343,7 +343,7 @@ String name = new String("bruis"); ##### 2.3.2 解析 -``` +```Java /** * 首先对于new出的两个String()对象进行字符串连接操作,编译器无法进行优化,只有等到运行期期间,通过各自的new操作创建出对象之后,然后使 用"+"连接符拼接字符串,再从字符串常量池中创建三个分别指向堆中"AA"、"BB",而"AABB"是直接在池中创建的字面量值,这一点可以通过类的反编译来证明,这里就不具体展开了。 */ diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\272\214\357\274\211.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\272\214\357\274\211.md" index cd33048..09008df 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\272\214\357\274\211.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\272\214\357\274\211.md" @@ -26,7 +26,7 @@ ### 1. String的equals方法 String源码的equals方法如下: -``` +```Java public boolean equals(Object anObject) { if (this == anObject) { return true; @@ -55,7 +55,7 @@ String源码的equals方法如下: ### 2. String的hashcode方法 String源码中hashcode方法如下: -``` +```Java public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { @@ -70,7 +70,7 @@ String源码中hashcode方法如下: } ``` 在String类中,有个字段hash存储着String的哈希值,如果字符串为空,则hash的值为0。String类中的hashCode计算方法就是以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模,经过第一次的hashcode计算之后,属性hash就会赋哈希值。从源码的英文注释可以了解到哈希的计算公式: -``` +```Java s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] ``` @@ -78,7 +78,7 @@ s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 这是一个很经典的话题了,下面来深入研究一下这两个方法。由上面的介绍,可以知道String的equals()方法实际比较的是两个字符串的内容,而String的hashCode()方法比较的是字符串的hash值,那么单纯的a.equals(b)为true,就可以断定a字符串等于b字符串了吗?或者单纯的a.hash == b.hash为true,就可以断定a字符串等于b字符串了吗?答案是否定的。 比如下面两个字符串: -``` +```Java String a = "gdejicbegh"; String b = "hgebcijedg"; System.out.println("a.hashcode() == b.hashcode() " + (a.hashCode() == b.hashCode())); @@ -100,7 +100,7 @@ false ### 4. String的compareTo()方法 -``` +```Java public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; @@ -124,7 +124,7 @@ false ### 5. String的startWith(String prefix)方法 -``` +```Java public boolean startsWith(String prefix) { return startsWith(prefix, 0); } @@ -150,7 +150,7 @@ false 如果参数字符序列是该字符串字符序列的前缀,则返回true;否则返回false; 示例: -``` +```Java String a = "abc"; String b = "abcd"; System.out.println(b.startsWith(a)); @@ -161,7 +161,7 @@ true ### 6. String的endsWith(String suffix)方法 查看String的endsWith(String suffix)方法源码: -``` +```Java public boolean endsWith(String suffix) { return startsWith(suffix, value.length - suffix.value.length); } @@ -169,7 +169,7 @@ true 其实endsWith()方法就是服用了startsWith()方法而已,传进的toffset参数值时value和suffix长度差值。 示例: -``` +```Java String a = "abcd"; String b = "d"; System.out.println(a.endsWith(b)); @@ -179,7 +179,7 @@ true ### 7. String的indexOf(int ch)方法 -``` +```Java public int indexOf(int ch) { return indexOf(ch, 0); } @@ -209,7 +209,7 @@ true 对于String的indexOf(int ch)方法,查看其源码可知其方法入参为ASCII码值,然后和目标字符串的ASCII值来进行比较的。其中常量Character.MIN_SUPPLEMENTARY_CODE_POINT表示的是0x010000——十六进制的010000,十进制的值为65536,这个值表示的是十六进制的最大值。 下面再看看indexOfSupplementary(ch, fromIndex)方法 -``` +```Java private int indexOfSupplementary(int ch, int fromIndex) { if (Character.isValidCodePoint(ch)) { final char[] value = this.value; @@ -228,7 +228,7 @@ true java中特意对超过两个字节的字符进行了处理,例如emoji之类的字符。处理逻辑就在indexOfSupplementary(int ch, int fromIndex)方法里。 Character.class -``` +```Java public static boolean isValidCodePoint(int codePoint) { // Optimized form of: // codePoint >= MIN_CODE_POINT && codePoint <= MAX_CODE_POINT @@ -238,7 +238,7 @@ Character.class ``` 对于方法isValidCodePoint(int codePoint)方法,用于确定指定代码点是否是一个有效的Unicode代码点。代码 -``` +```Java int plane = codePoint >>> 16; return plane < ((MAX_CODE_POINT + 1) >>> 16); ``` @@ -246,7 +246,7 @@ return plane < ((MAX_CODE_POINT + 1) >>> 16); ### 8. String的split(String regex, int limit)方法 -``` +```Java public String[] split(String regex, int limit) { char ch = 0; if (((regex.value.length == 1 && @@ -301,7 +301,7 @@ return plane < ((MAX_CODE_POINT + 1) >>> 16); split(String regex, int limit)方法内部逻辑非常复杂,需要静下心来分析。 if判断中**第一个括号**先判断一个字符的情况,并且这个字符不是任何特殊的正则表达式。也就是下面的代码: -``` +```Java (regex.value.length == 1 && ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ``` @@ -309,17 +309,17 @@ if判断中**第一个括号**先判断一个字符的情况,并且这个字 在if判断中,**第二个括号**判断有两个字符的情况,并且如果这两个字符是以```\```开头的,并且不是字母或者数字的时候。如下列代码所示: -``` +```Java (regex.length() == 2 && regex.charAt(0) == '\\' && (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 && ((ch-'a')|('z'-ch)) < 0 && ((ch-'A')|('Z'-ch)) < 0) ``` 判断完之后,在进行**第三个括号**判断,判断是否是两字节的unicode字符。如下列代码所示: -``` +```Java (ch < Character.MIN_HIGH_SURROGATE || ch > Character.MAX_LOW_SURROGATE) ``` 对于下面这段复杂的代码,我们结合示例一句一句来分析。 -``` +```Java int off = 0; int next = 0; boolean limited = limit > 0; @@ -357,7 +357,7 @@ if判断中**第一个括号**先判断一个字符的情况,并且这个字 #### 8.2 源码分析2 示例代码1: -``` +```Java String splitStr1 = "what,is,,,,split"; String[] strs1 = splitStr1.split(","); for (String s : strs1) { @@ -375,7 +375,7 @@ split ``` 示例代码2: -``` +```Java String splitStr1 = "what,is,,,,"; String[] strs1 = splitStr1.split(","); for (String s : strs1) { @@ -392,7 +392,7 @@ is 示例代码3: -``` +```Java String splitStr1 = "what,is,,,,"; String[] strs1 = splitStr1.split(",", -1); for (String s : strs1) { @@ -419,7 +419,7 @@ is o ``` 由于regex为',',所以满足if括号里的判断。一开始next和off指针都在0位置,limit为0,在while里的判断逻辑指的是获取','索引位置,由上图拆分的字符数组可知,next会分别为4,7,8,9,10。由于limited = limit > 0,得知limited为false,则逻辑会走到 -``` +```Java if (!limited || list.size() < limit - 1) { list.add(substring(off, next)); off = next + 1; @@ -468,7 +468,7 @@ list集合里就会添加进空字符串"" [what,is, , , ,] ``` 当程序走到时, -``` +```Java if(!limited || list.size() < limit) { list.add(substring(off, value.length); } @@ -486,7 +486,7 @@ list集合里就会添加进空字符串"" ``` 这里相信小伙伴们都知道示例1和示例2的区别在那里了,是因为示例2最后索引位置的list为空字符串,所以list.get(resultSize-1).length()为0,则会调用下面的代码逻辑: -``` +```Java while (resultSize > 0 && list.get(resultSize - 1).length() == 0) { resultSize--; } @@ -504,7 +504,7 @@ list集合里就会添加进空字符串"" 就以示例代码一为例,对于字符串"what,is,,,,"。 **对于limit > 0**,由于代码: -``` +```Java boolean limited = limit > 0; // limited为true .. .. @@ -528,7 +528,7 @@ what,is,,,, **对于limit = 0**,由于代码: -``` +```Java if (limit == 0) { while (resultSize > 0 && list.get(resultSize - 1).length() == 0) { resultSize--; @@ -543,7 +543,7 @@ is ``` **对于limit < 0**,由于代码: -``` +```Java if (!limited || list.size() < limit) list.add(substring(off, value.length)); ``` diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Thread\345\272\225\345\261\202\346\272\220\347\240\201.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Thread\345\272\225\345\261\202\346\272\220\347\240\201.md" index b0b44b9..fa16533 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Thread\345\272\225\345\261\202\346\272\220\347\240\201.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Thread\345\272\225\345\261\202\346\272\220\347\240\201.md" @@ -50,7 +50,7 @@ #### 3.1 线程优先级 优先级代表线程执行的机会的大小,优先级高的可能先执行,低的可能后执行,在 Java 源码中,优先级从低到高分别是 1 到 10,线程默认 new 出来的优先级都是 5,源码如下: -``` +```Java // 最低优先级 public final static int MIN_PRIORITY = 1; @@ -75,7 +75,7 @@ public final static int MAX_PRIORITY = 10; #### 4.1 start 启动线程 -``` +```Java // 该方法可以创建一个新的线程出来 public synchronized void start() { // 如果没有初始化,抛异常 @@ -111,7 +111,7 @@ private native void start0(); 下面只贴出部分关键源码: -``` +```Java // 无参构造器,线程名字自动生成 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); @@ -161,13 +161,13 @@ private void init(ThreadGroup g, Runnable target, String name, 当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。 -``` +```Java public final void join() throws InterruptedException { join(0); } ``` -``` +```Java public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); @@ -206,7 +206,7 @@ private void init(ThreadGroup g, Runnable target, String name, yield 是个 native 方法,底层代码如下: -``` +```Java public static native void yield(); ``` @@ -220,7 +220,7 @@ sleep 也是 native 方法,可以接受毫秒的一个入参,也可以接受 接受毫秒和纳秒两个入参时,如果给定纳秒大于等于 0.5 毫秒,算一个毫秒,否则不算。 -``` +```Java public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { @@ -239,7 +239,7 @@ sleep 也是 native 方法,可以接受毫秒的一个入参,也可以接受 sleep(millis); } ``` -``` +```Java public static native void sleep(long millis) throws InterruptedException; ``` @@ -252,7 +252,7 @@ interrupt 中文是打断的意思,意思是可以打断中止正在运行的 我们举一个例子来说明如何打断 WAITING 的线程,代码如下: -``` +```Java @Test public void testInterrupt() throws InterruptedException { Thread thread = new Thread(new Runnable() { diff --git "a/note/JDK/\346\267\261\345\205\245\350\247\243\350\257\273CompletableFuture\346\272\220\347\240\201\344\270\216\345\216\237\347\220\206.md" "b/note/JDK/\346\267\261\345\205\245\350\247\243\350\257\273CompletableFuture\346\272\220\347\240\201\344\270\216\345\216\237\347\220\206.md" index 5a43c54..d3271c8 100644 --- "a/note/JDK/\346\267\261\345\205\245\350\247\243\350\257\273CompletableFuture\346\272\220\347\240\201\344\270\216\345\216\237\347\220\206.md" +++ "b/note/JDK/\346\267\261\345\205\245\350\247\243\350\257\273CompletableFuture\346\272\220\347\240\201\344\270\216\345\216\237\347\220\206.md" @@ -43,7 +43,7 @@ CompletableFuture类提供了非常多的方法供我们使用,包括了runAsy **runAsync()**,异步运行, -``` +```Java @Test public void runAsyncExample() throws Exception { ExecutorService executorService = Executors.newSingleThreadExecutor(); @@ -77,7 +77,7 @@ CompletedFuture...isDown **supplyAsync()** supply有供应的意思,supplyAsync就可以理解为异步供应,查看supplyAsync()方法入参可以知道,其有两个入参: -- Supplier supplier, +- Supplier\ supplier, - Executor executor 这里先简单介绍下Supplier接口,Supplier接口是JDK8引入的新特性,它也是用于创建对象的,只不过调用Supplier的get()方法时,才会去通过构造方法去创建对象,并且每次创建出的对象都不一样。Supplier常用语法为: @@ -85,7 +85,7 @@ supply有供应的意思,supplyAsync就可以理解为异步供应,查看sup Supplier sup= MySupplier::new; ``` 再展示代码例子之前,再讲一个thenAccept()方法,可以发现thenAccept()方法的入参如下: -- Comsumer +- Comsumer\ Comsumer接口同样是java8新引入的特性,它有两个重要接口方法: 1. accept() @@ -94,7 +94,7 @@ Comsumer接口同样是java8新引入的特性,它有两个重要接口方法 thenAccept()可以理解为接收CompletableFuture的结果然后再进行处理。 下面看下supplyAsync()和thenAccept()的例子: -``` +```Java public void thenApply() throws Exception { ExecutorService executorService = Executors.newFixedThreadPool(2); CompletableFuture cf = CompletableFuture.supplyAsync(() -> { //实现了Supplier的get()方法 @@ -132,8 +132,8 @@ public void thenApply() throws Exception { 从代码逻辑可以看出,thenApply_test等到了pool-1-thread-1线程完成任务后,才进行的调用,并且拿到了supplye()方法返回的结果,而main则异步执行了,这就避免了Future获取结果时需要阻塞或轮询的弊端。 **exceptionally** -当任务在执行过程中报错了咋办?exceptionally()方法很好的解决了这个问题,当报错时会去调用exceptionally()方法,它的入参为:Function fn,fn为执行任务报错时的回调方法,下面看看代码示例: -``` +当任务在执行过程中报错了咋办?exceptionally()方法很好的解决了这个问题,当报错时会去调用exceptionally()方法,它的入参为:Function\ fn,fn为执行任务报错时的回调方法,下面看看代码示例: +```Java public void exceptionally() { ExecutorService executorService = Executors.newSingleThreadExecutor(); CompletableFuture cf = CompletableFuture.supplyAsync(() -> { @@ -172,7 +172,7 @@ thenAcceptAsync: helloworld java.lang.RuntimeException: 测试exceptionally... CompletableFuture类实现了Future接口和CompletionStage接口,Future大家都经常遇到,但是这个CompletionStage接口就有点陌生了,这里的CompletionStage实际上是一个任务执行的一个“阶段”,CompletionStage详细的内容在下文有介绍。 -``` +```Java public class CompletableFuture implements Future, CompletionStage { volatile Object result; // CompletableFuture的结果值或者是一个异常的报装对象AltResult volatile Completion stack; // 依赖操作栈的栈顶 @@ -207,13 +207,13 @@ public class CompletableFuture implements Future, CompletionStage { runAsync()做的事情就是异步的执行任务,返回的是CompletableFuture对象,不过CompletableFuture对象不包含结果。runAsync()方法有两个重载方法,这两个重载方法的区别是Executor可以指定为自己想要使用的线程池,而runAsync(Runnable)则使用的是ForkJoinPool.commonPool()。 下面先来看看runAsync(Runnable)的源码: -``` +```Java public static CompletableFuture runAsync(Runnable runnable) { return asyncRunStage(asyncPool, runnable); } ``` 这里的asyncPool是一个静态的成员变量: -``` +```Java private static final boolean useCommonPool = (ForkJoinPool.getCommonPoolParallelism() > 1); // 并行级别 private static final Executor asyncPool = useCommonPool ? @@ -221,7 +221,7 @@ private static final Executor asyncPool = useCommonPool ? ``` 回到asyncRunStage()源码: -``` +```Java static CompletableFuture asyncRunStage(Executor e, Runnable f) { if (f == null) throw new NullPointerException(); CompletableFuture d = new CompletableFuture(); @@ -230,7 +230,7 @@ private static final Executor asyncPool = useCommonPool ? } ``` 看到asyncRunStage()源码,可以知道任务是由Executor来执行的,那么可想而知Async类一定是实现了Callable接口或者继承了Runnable类,查看Async类: -``` +```Java static final class AsyncRun extends ForkJoinTask implements Runnable, AsynchronousCompletionTask { CompletableFuture dep; Runnable fn; @@ -265,7 +265,7 @@ postComplete()的源码还是有点复杂的,先不急着分析。**先看看C #### Completion 下面先看看Completion的源码: -``` +```Java abstract static class Completion extends ForkJoinTask implements Runnable, AsynchronousCompletionTask { volatile Completion next; @@ -291,7 +291,7 @@ volatile Completion stack; ``` 由这个属性可以看出,CompletableFuture其实就是一个链表的一个数据结构。 -``` +```Java abstract static class UniCompletion extends Completion { Executor executor; // executor to use (null if none) CompletableFuture dep; // 代表的依赖的CompletableFuture @@ -322,7 +322,7 @@ abstract static class UniCompletion extends Completion { ``` claim方法要在执行action前调用,若claim方法返回false,则不能调用action,原则上要保证action只执行一次。 -``` +```Java static final class UniAccept extends UniCompletion { Consumer fn; UniAccept(Executor executor, CompletableFuture dep, @@ -342,7 +342,7 @@ static final class UniAccept extends UniCompletion { } } ``` -``` +```Java final boolean uniAccept(CompletableFuture a, Consumer f, UniAccept c) { Object r; Throwable x; @@ -370,7 +370,7 @@ final boolean uniAccept(CompletableFuture a, } ``` 对于Completion的执行,还有几个关键的属性: -``` +```Java static final int SYNC = 0;//同步 static final int ASYNC = 1;//异步 static final int NESTED = -1;//嵌套 @@ -391,14 +391,14 @@ Completion在CompletableFuture中是如何工作的呢?现在先不着急了 - Runable既不产生结果也不消耗结果 下面看看一个Stage的调用例子: -``` +```Java stage.thenApply(x -> square(x)).thenAccept(x -> System.out.println(x)).thenRun(() -> System.out.println()) ``` 这里x -> square(x)就是一个Function类型的Stage,它返回了x。x -> System.out.println(x)就是一个Comsumer类型的Stage,用于接收上一个Stage的结果x。() ->System.out.println()就是一个Runnable类型的Stage,既不消耗结果也不产生结果。 一个、两个或者任意一个CompletionStage的完成都会触发依赖的CompletionStage的执行,CompletionStage的依赖动作可以由带有then的前缀方法来实现。如果一个Stage被两个Stage的完成给触发,则这个Stage可以通过相应的Combine方法来结合它们的结果,相应的Combine方法包括:thenCombine、thenCombineAsync。但如果一个Stage是被两个Stage中的其中一个触发,则无法去combine它们的结果,因为这个Stage无法确保这个结果是那个与之依赖的Stage返回的结果。 -``` +```Java @Test public void testCombine() throws Exception { String result = CompletableFuture.supplyAsync(() -> { @@ -422,7 +422,7 @@ stage.thenApply(x -> square(x)).thenAccept(x -> System.out.println(x)).thenRun(( 下面开始介绍CompletableFuture的几个核心方法: **postComplete** -``` +```Java final void postComplete() { CompletableFuture f = this; Completion h; //this表示当前的CompletableFuture while ((h = f.stack) != null || //判断stack栈是否为空 @@ -444,7 +444,7 @@ final void postComplete() { postComplete()方法可以理解为当任务完成之后,调用的一个“后完成”方法,主要用于触发其他依赖任务。 **uniAccept** -``` +```Java final boolean uniAccept(CompletableFuture a, Consumer f, UniAccept c) { Object r; Throwable x; @@ -476,7 +476,7 @@ final boolean uniAccept(CompletableFuture a, **pushStack** -``` +```Java final void pushStack(Completion c) { do {} while (!tryPushStack(c)); //使用CAS自旋方式压入栈,避免了加锁竞争 } @@ -493,7 +493,7 @@ final boolean uniAccept(CompletableFuture a, ``` 光分析源码也没法深入理解其代码原理,下面结合一段示例代码来对代码原理进行分析。 -``` +```Java @Test public void thenApply() throws Exception { ExecutorService executorService = Executors.newFixedThreadPool(2); @@ -533,19 +533,19 @@ final boolean uniAccept(CompletableFuture a, CompletedFuture...isDown */ -这段示例代码所做的事情就是supplyAsync(Supplier supplier)休眠200秒之后,返回一个字符串,thenAccept(Consumer action)等到任务完成之后接收这个字符串,并且调用thenApply_test()方法,随后输出 hello world。 +这段示例代码所做的事情就是supplyAsync(Supplier\ supplier)休眠200秒之后,返回一个字符串,thenAccept(Consumer\ action)等到任务完成之后接收这个字符串,并且调用thenApply_test()方法,随后输出 hello world。 代码中让线程休眠200秒是为了方便观察CompletableFuture的传递过程。 下面就描述下程序的整个运作流程。 **①** 主线程调用CompletableFuture的supplyAsync()方法,传入Supplier和Executor。在supplyAsync()中又继续调用CompletableFuture的asyncSupplyStage(Executor, Supplier)方法。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128102326944.png) -来到asyncSupplyStage()方法中,调用指定的线程池,并执行execute(new AsyncSupply(d,f)),这里d就是我们的“源任务”,接下来thenApply()要依赖着这个源任务进行后续逻辑操作,f就是Supplier的函数式编程。 +来到asyncSupplyStage()方法中,调用指定的线程池,并执行execute(new AsyncSupply\(d,f)),这里d就是我们的“源任务”,接下来thenApply()要依赖着这个源任务进行后续逻辑操作,f就是Supplier的函数式编程。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128102631844.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) AsyncSupply实现了Runnable的run()方法,核心逻辑就在run()方法里。在run()方法里,先判断d.result == null,判断该任务是否已经完成,防止并发情况下其他线程完成此任务了。f.get()就是调用的Supplier的函数式编程,这里会休眠200秒,所以executor线程池开启的线程会在这里阻塞200秒。 **②** 虽然executor线程池线程阻塞了,但是main线程任然会继续执行接下来的代码。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128103312134.png) -main线程会在asyncSupplyStage()方法中返回d,就是我们的“依赖任务”,而这个任务此时还处在阻塞中。接下来main线程会继续执行CompletableFuture的thenAccept(Comsumer action)方法,然后调用CompletableFuture的uniAcceptStage()方法。 +main线程会在asyncSupplyStage()方法中返回d,就是我们的“依赖任务”,而这个任务此时还处在阻塞中。接下来main线程会继续执行CompletableFuture的thenAccept(Comsumer\ action)方法,然后调用CompletableFuture的uniAcceptStage()方法。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019112810354686.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) 在uniAcceptStage()方法中,会将“依赖任务”、“源任务”、线程池以及Comsumer报装程一个UniAccept对象,然后调用push()压入stack的栈顶中。随后调用UniAccept的tryFire()方法。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128103848372.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) @@ -555,7 +555,7 @@ main线程会在asyncSupplyStage()方法中返回d,就是我们的“依赖任 **③** 回到“源任务”,虽然main线程已经结束了整个生命周期,但是executor线程池的线程任然阻塞着的,休眠了200秒之后,继续执行任务。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20191128105600904.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) -然后来到了postComplete()方法。这个方法在前面已经介绍到了,它是CompletableFuture的核心方法之一,做了许多事情。最重要的一件事情就是触发其他依赖任务,接下来调用的方法依次为:UniAccept.tryFire(mode) ——> CompletableFuture.uniAccept(..) ——> Comsumer.accept(s) ——> 输出“hello world”,并输出当前调用线程的线程名。因这个调用链已经在②中介绍过了,所以就不再详细介绍其运作逻辑。 +然后来到了postComplete()方法。这个方法在前面已经介绍到了,它是CompletableFuture的核心方法之一,做了许多事情。最重要的一件事情就是触发其他依赖任务,接下来调用的方法依次为:UniAccept.tryFire(mode) ——\> CompletableFuture.uniAccept(..) ——\> Comsumer.accept(s) ——\> 输出“hello world”,并输出当前调用线程的线程名。因这个调用链已经在②中介绍过了,所以就不再详细介绍其运作逻辑。 **小结:** 通过这个小示例,终于理解到了“源任务”和“依赖任务”之间的调用关系,以及CompletableFuture的基本运作原理。然而CompletableFuture还有其他的方法需要去深入分析,由于篇幅所限就不再赘述,感兴趣的读者可以以debug的模式去一点一点分析CompletableFuture其他方法的底层原理。这里不得不说Java并发包作者Doug Lea大神真的太厉害了,阅读他的源码之后,可以发现他写的代码不能以技术来形容,而应该使用“艺术”来形容。 diff --git "a/note/Netty/\344\272\214\350\277\233\345\210\266.md" "b/note/Netty/\344\272\214\350\277\233\345\210\266.md" index 69bfb3b..97f7667 100644 --- "a/note/Netty/\344\272\214\350\277\233\345\210\266.md" +++ "b/note/Netty/\344\272\214\350\277\233\345\210\266.md" @@ -48,7 +48,7 @@ 对于二进制运算,记住一个口诀: 1. 与(&)运算 - + 运算规则: ``` 0&0=0, 0&1=0, 1&0=0, 1&1=1 ``` @@ -143,7 +143,7 @@ a = 10 **在开源框架底层中算法会用到大量的二进制运算,** 例如:在最近学习的Netty底层源码中,DefaultEventExecutorChooserFactory的底层源码有一个方法, 就是通过 a & (-a)来运算的。 -``` +```Java @Override public EventExecutorChooser newChooser(EventExecutor[] executors) { if (isPowerOfTwo(executors.length)) { diff --git "a/note/Spring/\344\273\216Spring\346\272\220\347\240\201\344\270\255\345\255\246\344\271\240\342\200\224\342\200\224\347\255\226\347\225\245\346\250\241\345\274\217.md" "b/note/Spring/\344\273\216Spring\346\272\220\347\240\201\344\270\255\345\255\246\344\271\240\342\200\224\342\200\224\347\255\226\347\225\245\346\250\241\345\274\217.md" index a35adcc..d26db14 100644 --- "a/note/Spring/\344\273\216Spring\346\272\220\347\240\201\344\270\255\345\255\246\344\271\240\342\200\224\342\200\224\347\255\226\347\225\245\346\250\241\345\274\217.md" +++ "b/note/Spring/\344\273\216Spring\346\272\220\347\240\201\344\270\255\345\255\246\344\271\240\342\200\224\342\200\224\347\255\226\347\225\245\346\250\241\345\274\217.md" @@ -24,7 +24,7 @@ ### 一、先看看初学者都会的多重if-else判断 -``` +```Java public int count(int num1, int num2, String operation) { if (operation.equals("+")) { return num1 + num2; @@ -45,7 +45,7 @@ public int count(int num1, int num2, String operation) { ### 二、策略模式实现 #### 2.1 定义一个策略接口: Strategy.class -``` +```Java public interface Strategy { public int doOperation(int num1, int num2); } @@ -54,7 +54,7 @@ public interface Strategy { #### 2.2 创建接口的实现类 Add.java -``` +```Java public class Add implements Strategy{ @Override public int doOperation(int num1, int num2) { @@ -64,7 +64,7 @@ public class Add implements Strategy{ ``` Substract.java -``` +```Java public class Substract implements Strategy{ @Override public int doOperation(int num1, int num2) { @@ -74,7 +74,7 @@ public class Substract implements Strategy{ ``` Multiply.java -``` +```Java public class Multiply implements Strategy{ @Override public int doOperation(int num1, int num2) { @@ -84,7 +84,7 @@ public class Multiply implements Strategy{ ``` Divide.java -``` +```Java public class Divide implements Strategy{ @Override public int doOperation(int num1, int num2) { @@ -95,7 +95,7 @@ public class Divide implements Strategy{ #### 2.3 创建Context类 -``` +```Java public class Context { private Strategy strategy; @@ -110,7 +110,7 @@ public class Context { ``` #### 2.4 创建实现类 -``` +```Java public class StrategyPatternDemo { public static void main(String[] args) { Context context = new Context(); @@ -158,7 +158,7 @@ public class StrategyPatternDemo { 在学习BeanDefinitionReader之前,要先了解一下什么是BeanDefinition 接口BeanDefinition.java -``` +```Java public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE; @@ -172,7 +172,7 @@ public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement { 可以看到BeanDefinition作为一个接口,主要是用于存储从XML配置文件读取Bean信息到JVM内存的一个载体,具体是存储在了BeanDefinition的实现类——RootBeanDefinition中,下面来看看RootBeanDefinition。 -``` +```Java public class RootBeanDefinition extends AbstractBeanDefinition { @Nullable private BeanDefinitionHolder decoratedDefinition; @@ -187,7 +187,7 @@ public class RootBeanDefinition extends AbstractBeanDefinition { } ``` 可以看到RootBeanDefinition不是真正存储Bean信息的载体,继续查看BeanDefinitionHolder -``` +```Java public class BeanDefinitionHolder implements BeanMetadataElement { private final BeanDefinition beanDefinition; @@ -244,13 +244,13 @@ public interface ResourceLoader { 由于```resourceLoader instanceof ResourcePatternResolver为true```,所以走如下逻辑: AbstractBeanDefinitionReader.java -``` +```Java Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location); int count = loadBeanDefinitions(resources); ``` AbstractApplicationContext.java -``` +```Java @Override public Resource[] getResources(String locationPattern) throws IOException { return this.resourcePatternResolver.getResources(locationPattern); @@ -258,7 +258,7 @@ AbstractApplicationContext.java ``` PathMatchingResourcePatternResolver.java -``` +```Java @Override public Resource[] getResources(String locationPattern) throws IOException { diff --git "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" index dc0a23f..436b444 100644 --- "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" +++ "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" @@ -17,10 +17,10 @@ Spring容器就相当于一个大的水桶,里面装着很多水——bean对 ## 进入正题 在Spring容器的设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这个接口实现了容器最基本的功能;另一个是ApplicationContext应用上下文,作为容器的高级形态而存在,它用于扩展BeanFactory中现有的功能。ApplicationContext和BeanFactory两者都是用于加载Bean的,但是相比之下,ApplicationContext提供了更多的扩展功能,简单一点说:ApplicationContext包含BeanFactory的所有功能。绝大多数“典型”的企业应用和系统,ApplicationContext就是你需要使用的。下面展示一下分别使用BeanFactory和ApplicationContext读取xml配置文件的方式: -``` +```Java BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml")); ``` -``` +```Java ApplicationContext bf = new ClassPathXmlApplicationContext("applicationContext.xml"); ``` 下面先介绍Spring最核心的两个类。 @@ -63,7 +63,7 @@ XML配置文件的读取是Spring中最重要的功能,因为Spring的大部 下面演示一个使用ApplicationContext接口获取xml配置,从而实现一个helloword级别的spring程序: applicationContext.xml -``` +```Java ``` 测试类 -``` +```Java public class SpringMain { public static void main(String[] args) { //使用spring容器 @@ -101,11 +101,11 @@ Person{name='Bruis', age=23} 通过在断点debug,跟踪程序运行。 1. SpringMain.class -``` +```Java ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); ``` 2. ClassPathXmlApplicationContext.class -``` +```Java public ClassPathXmlApplicationContext(String configLocation) throws BeansException { this(new String[]{configLocation}, true, (ApplicationContext)null); } @@ -123,7 +123,7 @@ public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, } ``` 3. AbstractRefreshableConfigApplicationContext.class -``` +```Java //给configLocations字符串数组设置值,支持多个配置文件已数组方式同时传入。 public void setConfigLocations(String... locations) { if (locations != null) { @@ -149,7 +149,7 @@ public void setConfigLocations(String... locations) { ![Image](https://note.youdao.com/yws/api/personal/file/76AE8FEDAFF54B6881C336B056AC5B0A?method=download&shareKey=430f5263180efd8467df6e6434456f3d) 1. AbstractApplicationContext.class -``` +```Java /* 简单来说,Spring容器的初始化时右refresh()方法来启动的,这个方法标志着IOC容器的正式启动。具体来说,这里的启动包括了BeanDefinition和Resource的定位、载入和注册三个基本过程。 */ @@ -198,7 +198,7 @@ public void refresh() throws BeansException, IllegalStateException { } ``` 2. AbstractRefreshableApplicationContext.class -``` +```Java /* 通知子类刷新内部bean工厂,初始化BeanFactory并进行XML文件的解析、读取。obtain就是指获得的含义,这个方法obtaiinFreshBeanFactory正是实现BeanFactory的地方,也就是经过这个方法,ApplicationContext就已经拥有了BeanFactory的全部功能(也就是BeanFactory包含在了Spring容器里了)。 */ @@ -246,7 +246,7 @@ protected final void refreshBeanFactory() throws BeansException { 那么,person的属性是怎么被封装到beanFactory里面的呢?请看下面的源码解析。 3. AbstractXmlApplicationContext.class -``` +```Java protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { //为给定的BeanFactory创建一个新的XmlBeanDefinitionReader XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); @@ -272,7 +272,7 @@ protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansE 首先在refreshBeanFactory()方法中已经初始化了DefaultListableBeanFactory,对于读取XML配置文件,还需要使用XmlBeanDefinitionReader。所以在上述loadBeanDefinitions()中就需要初始化XmlBeanDefinitionReader。在DefaultListableBeanFactory和XmlBeanDefinitionReader后就可以进行配置文件的读取了。要注意的地方时,在XmlBeanDefinitionReader初始化时就已经把DefaultListableBeanFactory给注册进去了,所以在XmlBeanDefinitionReader读取的BeanDefinition都会注册到DefaultListableBeanFactory中,也就是经过上述的loadingBeanDefinitions(),类型DefaultListableBeanFactory的变量beanFactory就已经包含了所有**解析好的配置**了。 4. AbstractBeanDefinitionReader.class -``` +```Java @Override public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException { Assert.notNull(locations, "Location array must not be null"); @@ -321,7 +321,7 @@ public int loadBeanDefinitions(String location, @Nullable Set actualRe } ``` 5. PathMatchingResourcePatternResolver.class -``` +```Java @Override public Resource[] getResources(String locationPattern) throws IOException { Assert.notNull(locationPattern, "Location pattern must not be null"); @@ -352,7 +352,7 @@ public Resource[] getResources(String locationPattern) throws IOException { } ``` 6. XmlBeanDefinitionReader.class -``` +```Java /* 从XML配置文件中获取bean定义信息 */ @@ -412,7 +412,7 @@ protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) ![图片](https://note.youdao.com/yws/api/personal/file/861658D89B0D4B48A7ED56B554CF3028?method=download&shareKey=c3bc974e751495bac74d9ac9ec56cb75) 1. XmlBeanDefinitionReader.class -``` +```Java /* 注册给定DOM文档中包含的bean定义 */ @@ -424,7 +424,7 @@ public int registerBeanDefinitions(Document doc, Resource resource) throws BeanD } ``` 2. DefaultBeanDefinitionDocumentReader.class -``` +```Java /* 此实现根据“spring-beans”XSD解析bean定义 */ @@ -507,7 +507,7 @@ protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate d ``` 2. BeanDefinitionParserDelegate.class -``` +```Java /* 解析bean定义本身,而不考虑名称或别名,如果解析期间出错则返回null。 */ @@ -640,7 +640,7 @@ public void parsePropertyElement(Element ele, BeanDefinition bd) { ![Images](https://note.youdao.com/yws/api/personal/file/CF65BB80EB934EBEBA49466CFAB261A0?method=download&shareKey=8b9f0078cf5a3171dfd69d00d9ba55f6) 然后,就会一路返回到refresh()方法里的加载bean定义信息的方法——loadBeanDefinitions(),此时beanFactory里面就会存在一个带有KV对的ConcurrentHashMap,而这个beanFactory会存放在Spring容器里面。 -``` +```Java DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); @@ -673,7 +673,7 @@ bean的创建和初始化过程是在refresh方法里的invokeBeanFactoryPostPro ![Images](https://note.youdao.com/yws/api/personal/file/8B415614A97D45B481925159264C344F?method=download&shareKey=1083828cfcea581b0aa5cae56e3f3090) 1. AbstractApplicationContext.class -``` +```Java public void refresh() throws BeansException, IllegalStateException { ... // 实例剩余的(非懒加载)的单例 @@ -719,7 +719,7 @@ protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory b 这里的懒加载的意思,指的是bean单例不是在Spring容器初始化的时候就创建的,而是在要使用该bean的时候,才会创建该bean。 2. DefaultListableBeanFactory.class -``` +```Java // 实例剩余的(非懒加载)的单例 @Override public void preInstantiateSingletons() throws BeansException { @@ -780,7 +780,7 @@ public void preInstantiateSingletons() throws BeansException { ``` 3. AbstractBeanFactory.class -``` +```Java protected T doGetBean(final String name, @Nullable final Class requiredType, @Nullable final Object[] args, boolean typeCheckOnly) throws BeansException { // 去除name上存在的工厂bean的前缀 @@ -895,7 +895,7 @@ protected T doGetBean(final String name, @Nullable final Class requiredTy ``` 4. DefaultSingletonBeanRegistry.class -``` +```Java /* 尝试从缓存中获取单例对象,如果缓存中有该单例对象,并且该对象正在被创建,则从缓存中获取。 */ @@ -970,7 +970,7 @@ public Object getSingleton(String beanName, ObjectFactory singletonFactory) { ![Images](https://note.youdao.com/yws/api/personal/file/4C30C0DA143E422FBD27E50AE71AC179?method=download&shareKey=2f4dff65df0e9761ede47d26782dd977) 5. AbstractAutowireCapableBeanFactory.class -``` +```Java /* 该类的中心方法:创建bean实例,实例化bean实例,应用bean的后置处理器 diff --git "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" index faa364d..7f8691e 100644 --- "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" +++ "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" @@ -84,7 +84,7 @@ IOC容器的启动过程就是建立Spring上下文的过程,该上下文是 结合着时序图,再去调试源码,思路会清晰很多。 ContextLoaderListener.class -``` +```Java public class ContextLoaderListener extends ContextLoader implements ServletContextListener { public ContextLoaderListener() { @@ -117,7 +117,7 @@ public class ContextLoaderListener extends ContextLoader implements ServletConte 这里的ContextLoaderListener是Spring的类,但实现了ServletContextListener接口。这个接口是Servlet API中定义的,提供了与Servlet生命周期结合的回调,也就是说Servlet调用contextInitialized()方法初始化容器时,会回调ContextLoaderListener中实现的contextInitialized()方法,Servlet中的contextDestroyed()方法也同理。观察源码可知,在Web容器中,建立WebApplicationContext的过程是在contextInitialized()方法中完成的。 ContextLoader.class -``` +```Java public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { ... // 判断在web容器中是否存在WebApplicationContext,因为在配置中只允许申明一次ServletContextListener,多次声明会扰乱Spring的执行逻辑。 @@ -168,7 +168,7 @@ public WebApplicationContext initWebApplicationContext(ServletContext servletCon 由ContextLoader的源码可知,SpringIOC的载入过程是在ContextLoader类的initWebApplicationContext()方法中完成的。 这里还要介绍一个重要的接口——WebApplicationContext -``` +```Java public interface WebApplicationContext extends ApplicationContext { /** @@ -184,7 +184,7 @@ public interface WebApplicationContext extends ApplicationContext { } ``` 而WebApplicationContext接口是由XMLWebApplicationContext来实现具体的功能,然后再通过ApplicationContext接口与BeanFactory接口对接,完成Spring容器的功能。然而对于具体的一些Spring容器的实现都是在AbstractRefreshableWebApplicationContext中完成的,这一点和**上篇**讲解的AbstractRefreshableConfigApplicationContext功能类似。initWebApplicationContext()方法最后返回的是一个WebApplicationContext接口,而实际返回的就是XMLWebApplicationContext实现类。XMLWebApplicationContext在基本的ApplicationContext功能的基础上,增加了对**Web环境**和XML配置定义的处理。在XMLWebApplicationContext的初始化过程中,Web容器中的IOC容器被建立起来,从而再整个Web容器中建立起Spring应用。 -``` +```Java public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationContext { /** 默认读取Spring配置文件的根路径,如果指定其他配置文件,则从这个默认的根路径读取。 */ @@ -234,7 +234,7 @@ public class XmlWebApplicationContext extends AbstractRefreshableWebApplicationC 从源码中可以看到,XMLWebApplicationContext中成员变量存放着默认的读取Spring配置文件的根目录,在生成IOC容器过程中,就会从默认路径/WEB-INF/applicationContext.xml配置文件中或者指定的配置文件路径获取,然后再通过熟悉的loadBeanDefinitions()方法来获取Bean定义信息,最终完成整个上下文的初始化过程。 ContextLoader.class -``` +```Java protected WebApplicationContext createWebApplicationContext(ServletContext sc) { // 这里判断使用什么样的类在Web容器中作为IOC容器 Class contextClass = determineContextClass(sc); @@ -274,7 +274,7 @@ protected Class determineContextClass(ServletContext servletContext) { 下面看看默认的IOC容器是什么。有图有真相: ![image](https://note.youdao.com/yws/api/personal/file/AB1007BC2A7549D7898417D6231AE4E3?method=download&shareKey=e851d344aedd461f319dba3b8e2c6fe8) -``` +```Java protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) { if (ObjectUtils.identityToString(wac).equals(wac.getId())) { String idParam = sc.getInitParameter(CONTEXT_ID_PARAM); diff --git "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224\346\263\250\345\206\214AnnotationAwareAspectJAutoProxyCreator.md" "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224\346\263\250\345\206\214AnnotationAwareAspectJAutoProxyCreator.md" index 5003158..014dd27 100644 --- "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224\346\263\250\345\206\214AnnotationAwareAspectJAutoProxyCreator.md" +++ "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224\346\263\250\345\206\214AnnotationAwareAspectJAutoProxyCreator.md" @@ -13,7 +13,7 @@ - TestMain //main测试方法入口 TestBean.java -``` +```Java public class TestBean { private String testStr = "testStr"; @@ -32,7 +32,7 @@ public class TestBean { ``` AspectJTest.java -``` +```Java @Aspect public class AspectJTest { @@ -96,7 +96,7 @@ aspectTest.xml ``` TestMain.java -``` +```Java public class TestMain { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("aspectTest.xml"); @@ -157,7 +157,7 @@ http\://www.springframework.org/schema/aop=org.springframework.aop.config.AopNam 无图无真相啊,原来Spring将配置文件中的xmlns配置都解析成了一个一个Java命名解析器。回到我们的关注重点——AopNamespaceHandler,查看源码: AopNamespaceHandler.class -``` +```Java public class AopNamespaceHandler extends NamespaceHandlerSupport { public AopNamespaceHandler() { } @@ -171,7 +171,7 @@ public class AopNamespaceHandler extends NamespaceHandlerSupport { } ``` 可以看到,在init()方法里,Spring对aspectj-autoproxy也就是AnnotationAwareAspectJAutoProxyCreator进行了注册。在详细了解注册原理之前,先说明下在Spring中,所有的解析器都是对BeanDefinitionParser接口的同一实现: -``` +```Java public interface BeanDefinitionParser { @Nullable BeanDefinition parse(Element var1, ParserContext var2); @@ -180,7 +180,7 @@ public interface BeanDefinitionParser { 解析入口都是从parse方法开始的。 进入AspectJAutoProxyBeanDefinitionParser类中查看parse的实现逻辑: -``` +```Java class AspectJAutoProxyBeanDefinitionParser implements BeanDefinitionParser { ... @Nullable @@ -196,7 +196,7 @@ class AspectJAutoProxyBeanDefinitionParser implements BeanDefinitionParser { AopNamspaceUtils -``` +```Java public abstract class AopNamespaceUtils { public static final String PROXY_TARGET_CLASS_ATTRIBUTE = "proxy-target-class"; private static final String EXPOSE_PROXY_ATTRIBUTE = "expose-proxy"; @@ -231,7 +231,7 @@ public abstract class AopNamespaceUtils { ``` -``` +```Java public abstract class AopConfigUtils { @Nullable private static BeanDefinition registerOrEscalateApcAsRequired(Class cls, BeanDefinitionRegistry registry, @Nullable Object source) { @@ -264,7 +264,7 @@ registerOrEscalateApcAsRequired方法的作用就是获取AnnotationAwareAspectJ 看看如果proxy-target-class和expose-proxy都为true时,代码的逻辑。 -``` +```Java public abstract class AopConfigUtils { ... /* @@ -307,7 +307,7 @@ public abstract class AopConfigUtils { 经过了useClassProxyingIfNecessary()方法的调用,ParserContext对象中存放好了注册的额外信息(proxy-target-class、expose-proxy值等),这里暂且将ParserContext称为解析上下文。由上面的源码可知,在AopNamespaceUtils类的registerAspectJAnnotationAutoProxyCreatorIfNecessary方法中,将获取的org.springframework.aop.config.internalAutoProxyCreator的BeanDefinition和解析上下文一起传入registerComponentIfNecessary方法中,进行Component组件注册。 在随后的registerComponentIfNecessary方法中,经过new BeanComponentDefinition()构造方法的调用,已经将AnnotationAwareAspectJAutoProxyCreator的BeanDefinition注册到了SpringIOC中。 -``` +```Java public abstract class AopConfigUtils { ... private static void registerComponentIfNecessary(@Nullable BeanDefinition beanDefinition, ParserContext parserContext) { @@ -318,14 +318,14 @@ public abstract class AopConfigUtils { } } ``` -``` +```Java public class BeanComponentDefinition extends BeanDefinitionHolder implements ComponentDefinition { public BeanComponentDefinition(BeanDefinition beanDefinition, String beanName) { this(new BeanDefinitionHolder(beanDefinition, beanName)); } } ``` -``` +```Java public class BeanDefinitionHolder implements BeanMetadataElement { public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName) { this(beanDefinition, beanName, (String[])null); @@ -341,7 +341,7 @@ public class BeanDefinitionHolder implements BeanMetadataElement { } ``` 然后一路返回,将BeanDefinition存放在解析上下文(ParserContext)中,并在AspectJAutoProxyBeanDefinitionParser类的extendBeanDefinition方法中取出。 -``` +```Java class AspectJAutoProxyBeanDefinitionParser implements BeanDefinitionParser { private void extendBeanDefinition(Element element, ParserContext parserContext) { BeanDefinition beanDef = parserContext.getRegistry().getBeanDefinition("org.springframework.aop.config.internalAutoProxyCreator"); diff --git "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224\346\217\255\345\274\200JDK\345\212\250\346\200\201\344\273\243\347\220\206\345\222\214CGLIB\344\273\243\347\220\206\347\232\204\347\245\236\347\247\230\351\235\242\347\272\261.md" "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224\346\217\255\345\274\200JDK\345\212\250\346\200\201\344\273\243\347\220\206\345\222\214CGLIB\344\273\243\347\220\206\347\232\204\347\245\236\347\247\230\351\235\242\347\272\261.md" index a83ee68..026a120 100644 --- "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224\346\217\255\345\274\200JDK\345\212\250\346\200\201\344\273\243\347\220\206\345\222\214CGLIB\344\273\243\347\220\206\347\232\204\347\245\236\347\247\230\351\235\242\347\272\261.md" +++ "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224\346\217\255\345\274\200JDK\345\212\250\346\200\201\344\273\243\347\220\206\345\222\214CGLIB\344\273\243\347\220\206\347\232\204\347\245\236\347\247\230\351\235\242\347\272\261.md" @@ -14,7 +14,7 @@ #### 1.1 引入简单的CGLIB例子 在讲解CGLIB动态代理之前,先看一下最简单的CGLIB动态代理的例子。 -``` +```Java import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy; @@ -71,7 +71,7 @@ com.bruis.learnaop.testcglibaop.EnhancerDemo$$EnhancerByCGLIB$$413eae0d@53e25b76 回到SpringAOP源码。在《深入学习SpringAOP源码(二)》中,介绍到DefaultAopProxyFactory源码部分 -``` +```Java public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) { @@ -88,7 +88,7 @@ public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { } ``` 从createAopProxy()源码中可以看到,创建SpringAOP有两种方式,一、JDK动态代理;二、CGLIB动态代理;点进ObjenesisCglibAopProxy源码,发现它继承了CglibAopFactory -``` +```Java class ObjenesisCglibAopProxy extends CglibAopProxy { protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) { // 通过增强器获取代理类的class对象 @@ -122,7 +122,7 @@ class ObjenesisCglibAopProxy extends CglibAopProxy { createProxyClassAndInstance方法和前面总结的CGLIB创建代理的步骤一样。 继续查看CglibAopProxy是如何准备Enhancer增强器以及创建拦截器链的。 -``` +```Java class CglibAopProxy implements AopProxy, Serializable { public Object getProxy(@Nullable ClassLoader classLoader) { if (logger.isTraceEnabled()) { @@ -229,7 +229,7 @@ class CglibAopProxy implements AopProxy, Serializable { #### 1.3 DynamicAdvisedInterceptor都做了些啥工作? -``` +```Java private static class DynamicAdvisedInterceptor implements MethodInterceptor, Serializable { @Nullable public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { @@ -280,7 +280,7 @@ class CglibAopProxy implements AopProxy, Serializable { #### 1.4 啥是拦截器链?拦截器链从哪获取? 啥是拦截器链?从哪获取拦截器链?下面继续深入DefaultAdvisorChainFactory方法的getInterceptorsAndDynamicInterceptionAdvice()方法 -``` +```Java public class DefaultAdvisorChainFactory implements AdvisorChainFactory, Serializable { public List getInterceptorsAndDynamicInterceptionAdvice(Advised config, Method method, @Nullable Class targetClass) { /* @@ -371,7 +371,7 @@ public class DefaultAdvisorChainFactory implements AdvisorChainFactory, Serializ 在这过程中,DefaultAdvisorAdapterRegistry扮演者非常关键的角色。 -``` +```Java public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable { private final List adapters = new ArrayList(3); @@ -451,7 +451,7 @@ DefaultAdvisorAdapterRegistry类主要负责: #### 1.5 调用拦截器链的proceed方法 视线回到DynamicAdvisedInterceptor的intercept方法,在 -``` +```Java List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); ``` 执行完成之后,chain中存放好了拦截器链,分别是 @@ -460,7 +460,7 @@ List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(me 3. AspectJAroundAdvice 4. MethodBeforeAdviceInterceptor -``` +```Java List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); Object retVal; if (chain.isEmpty() && Modifier.isPublic(method.getModifiers())) { @@ -477,7 +477,7 @@ List chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(me **后置通知实现逻辑:** -``` +```Java public class AspectJAfterAdvice extends AbstractAspectJAdvice implements MethodInterceptor, AfterAdvice, Serializable { public Object invoke(MethodInvocation mi) throws Throwable { Object var2; @@ -492,7 +492,7 @@ public class AspectJAfterAdvice extends AbstractAspectJAdvice implements MethodI } ``` -``` +```Java public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Cloneable { protected final Object proxy; @@ -535,7 +535,7 @@ public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Clonea **环绕通知实现逻辑:** -``` +```Java public class AspectJAroundAdvice extends AbstractAspectJAdvice implements MethodInterceptor, Serializable { public Object invoke(MethodInvocation mi) throws Throwable { if (!(mi instanceof ProxyMethodInvocation)) { @@ -553,7 +553,7 @@ public class AspectJAroundAdvice extends AbstractAspectJAdvice implements Method } } ``` -``` +```Java public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedenceInformation, Serializable { protected Object invokeAdviceMethod(JoinPoint jp, @Nullable JoinPointMatch jpMatch, @Nullable Object returnValue, @Nullable Throwable t) throws Throwable { return this.invokeAdviceMethodWithGivenArgs(this.argBinding(jp, jpMatch, returnValue, t)); @@ -582,7 +582,7 @@ public abstract class AbstractAspectJAdvice implements Advice, AspectJPrecedence 3. invokeAdviceMethodWithGivenArgs方法调用aspectJAdviceMethod.invoke方法,调用AspectJTest类中aroundTest方法 **前置通知实现逻辑:** -``` +```Java public class MethodBeforeAdviceInterceptor implements MethodInterceptor, BeforeAdvice, Serializable { private final MethodBeforeAdvice advice; diff --git "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\267\261\345\205\245AnnotationAwareAspectJAutoProxyCreator.md" "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\267\261\345\205\245AnnotationAwareAspectJAutoProxyCreator.md" index fd88853..034a001 100644 --- "a/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\267\261\345\205\245AnnotationAwareAspectJAutoProxyCreator.md" +++ "b/note/SpringAOP/\346\267\261\345\205\245\345\255\246\344\271\240SpringAOP\346\272\220\347\240\201\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \346\267\261\345\205\245AnnotationAwareAspectJAutoProxyCreator.md" @@ -26,7 +26,7 @@ 将视线转移到AbstractAutowireCapableBeanFactory: -``` +```Java public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory { // 在实例化AnnotationAwareAspectJAutoProxyCreator之前进行解析 @Nullable @@ -55,7 +55,7 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac resolveBeforeInstantiation()方法调用了AbstractAutoProxyCreator()的postProcessBeforeInstantiation()和postProcessAfterInstantiation()。 AbstractAutoProxyCreator.class -``` +```Java import ... public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware { /* @@ -142,7 +142,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport imp ReflectiveAspectJAdvisorFactory的getAdvisors()中主要的工作是:迭代出@AspectJ注解修饰的类的方法,然后拿着这些方法区尝试获取Advisor,最后存在advisors集合里。 -``` +```Java public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable { //Spring将@AspectJ注解的beanName和bean工厂封装为了MetadataAwareAspectInstanceFactory public List getAdvisors(MetadataAwareAspectInstanceFactory aspectInstanceFactory) { @@ -186,7 +186,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto ``` getAdvisorMethods方法中通过反射工具来获取Advisor方法。 -``` +```Java public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFactory implements Serializable { private List getAdvisorMethods(Class aspectClass) { List methods = new ArrayList(); @@ -203,7 +203,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto ``` 视线来到ReflectiveAspectJAdvisorFactory的getAdvisor方法 -``` +```Java @Nullable public Advisor getAdvisor(Method candidateAdviceMethod, MetadataAwareAspectInstanceFactory aspectInstanceFactory, int declarationOrderInAspect, String aspectName) { this.validate(aspectInstanceFactory.getAspectMetadata().getAspectClass()); @@ -243,7 +243,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto 1. 从缓存中获取通知 2. 创建代理 -``` +```Java protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) { if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) { return bean; @@ -269,7 +269,7 @@ public class ReflectiveAspectJAdvisorFactory extends AbstractAspectJAdvisorFacto } ``` -``` +```Java public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator { ... @Nullable @@ -299,7 +299,7 @@ public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyC } ``` -``` +```Java public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator { protected List findCandidateAdvisors() { /* @@ -317,7 +317,7 @@ public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorA } ``` -``` +```Java public class BeanFactoryAspectJAdvisorsBuilder { ... public List buildAspectJAdvisors() { @@ -399,7 +399,7 @@ public class BeanFactoryAspectJAdvisorsBuilder { ![在这里插入图片描述](https://img-blog.csdnimg.cn/20190823164940860.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) 回到方法 -``` +```Java protected List findEligibleAdvisors(Class beanClass, String beanName) { List candidateAdvisors = this.findCandidateAdvisors(); /* @@ -416,7 +416,7 @@ protected List findEligibleAdvisors(Class beanClass, String beanName ``` findCandidateAdvisors()完成的是通知的解析工作,但是并不是所有的通知都适用于当前bean的,还要选出适合的通知。选择逻辑在findAdvisorsTahtCanApply方法里。 -``` +```Java public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator { ... protected List findAdvisorsThatCanApply(List candidateAdvisors, Class beanClass, String beanName) { @@ -434,7 +434,7 @@ public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyC } ``` -``` +```Java public abstract class AopUtils { public static List findAdvisorsThatCanApply(List candidateAdvisors, Class clazz) { if (candidateAdvisors.isEmpty()) { @@ -541,7 +541,7 @@ public abstract class AopUtils { 回到AbstractAutoProxyCreator的wrapIfNecessary方法中。经过this.getAdvicesAndAdvisorsForBean()方法的工作,获取到了可应用的通知对象数组,接下来的工作就是要对这些通知进行代理了。 -``` +```Java public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware { ... protected Object createProxy(Class beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) { @@ -614,7 +614,7 @@ public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport imp } ``` -``` +```Java public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable { public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException { // 如果封装对象本身就是Advisor,则无需做任何处理 @@ -658,7 +658,7 @@ public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Se **获取代理方式** -``` +```Java public class ProxyFactory extends ProxyCreatorSupport { ... public Object getProxy(@Nullable ClassLoader classLoader) { @@ -666,7 +666,7 @@ public class ProxyFactory extends ProxyCreatorSupport { } } ``` -``` +```Java public class ProxyCreatorSupport extends AdvisedSupport { protected final synchronized AopProxy createAopProxy() { if (!this.active) { @@ -678,7 +678,7 @@ public class ProxyCreatorSupport extends AdvisedSupport { } ``` -``` +```Java public class DefaultAopProxyFactory implements AopProxyFactory, Serializable { public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException { // 如果aop配置文件没有配置属性属性,则返回JdkDynamicAopProxy的实例对象 diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224SpringFactoriesLoader.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224SpringFactoriesLoader.md" index d059b10..881b18d 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224SpringFactoriesLoader.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224SpringFactoriesLoader.md" @@ -31,14 +31,14 @@ SpringFactoriesLoader通过loadFactories方法来加载并实例化来自FACTORI ### 2. 上源码  首先,可以看到SpringFactoriesLoader是final类,final修饰的类是不可以被继承,类中的方法都是不可以被覆盖的,且默认都是final修饰的方法,可以猜想到SpringFactoriesLoader类在被设计之初,是不想开发者继承该类并对该类进行扩展。所以,如果在开发中不想让别人对你的类继承或者扩展,那就用final来修饰吧~~ -``` +```Java public final class SpringFactoriesLoader { } ``` 下面看下SpringFactoriesLoader类有哪些成员变量? -``` +```Java /** * 寻找工厂的位置 * 工厂可以存放在多个jar文件中 @@ -53,7 +53,7 @@ public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factor 在spring.factories文件中,有非常多的工厂类,包括了属性源加载器、错误报告器、容器初始化器、容器监听器等,这些工厂类在SpringBoot中都有非常重要的作用,具体的读者可以自行前往查看。 -``` +```Java // 自定义的用于存储工厂的缓存 private static final Map> cache = new ConcurrentReferenceHashMap<>(); @@ -89,7 +89,7 @@ private static final Map> cache = new  loadFactories方法通过类加载器来加载并且实例化FACTORIES_RESOURCE_LOCATION路径文件中定义的工厂实现。在返回工厂之前,都会通过AnnotationAwareOrderComparator这个类来进行排序。如果需要自定义实例化策略,请使用loadFactoryNames去获取所有注册的工厂名称。  loadFactories方法中,入参factoryType表示工厂类的接口或者抽象类;入参classLoader表示加载工厂的类加载器,如果为空则会使用默认的类加载器。 -``` +```Java public static List loadFactories(Class factoryType, @Nullable ClassLoader classLoader) { Assert.notNull(factoryType, "'factoryType' must not be null"); // 类加载器 @@ -114,7 +114,7 @@ public static List loadFactories(Class factoryType, @Nullable ClassLoa } ``` -``` +```Java private static T instantiateFactory(String factoryImplementationName, Class factoryType, ClassLoader classLoader) { try { // 通过classUtils工具类获取工厂实现类的Class对象 @@ -147,7 +147,7 @@ public static List loadFactories(Class factoryType, @Nullable ClassLoa #### 2.2 loadFactoryNames方法  由于loadFactoryNames方法的注释和loadFactories内容一样,所以这里就不写出来了。 -``` +```Java public static List loadFactoryNames(Class factoryType, @Nullable ClassLoader classLoader) { // 获取到factoryType工厂类型 String factoryTypeName = factoryType.getName(); @@ -156,7 +156,7 @@ public static List loadFactories(Class factoryType, @Nullable ClassLoa } ``` -``` +```Java private static Map> loadSpringFactories(@Nullable ClassLoader classLoader) { // 从缓存中获取已经加载过的SpringFactories MultiValueMap result = cache.get(classLoader); @@ -216,4 +216,4 @@ public static List loadFactories(Class factoryType, @Nullable ClassLoa > 觉得作者写的不错的点个赞,关注作者。 > 本文 Github https://github.com/coderbruis/JavaSourceLearning 已收录,更多源码文章以及源码在github中可以学习。 - + diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" index d533a52..2e8757c 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" @@ -8,7 +8,7 @@ SpringBoot的CommandLineRunner是一个启动加载器的核心,CommandLinerRunner是一个接口,该接口定义如下: -``` +```Java @FunctionalInterface public interface CommandLineRunner { @@ -22,7 +22,7 @@ public interface CommandLineRunner { 实例代码: -``` +```Java @Component @Order(1) public class FirstCommandLineRunner implements CommandLineRunner { @@ -47,7 +47,7 @@ public class FirstCommandLineRunner implements CommandLineRunner { ### 2. ApplicationRunner 实现SpringBoot启动加载器的第二种方式,就是通过实现ApplicationRunner,先看下ApplicationRunner的源码: -``` +```Java @FunctionalInterface public interface ApplicationRunner { void run(ApplicationArguments args) throws Exception; @@ -57,7 +57,7 @@ public interface ApplicationRunner { 先看下ApplicationArguments这个接口定义: -``` +```Java public interface ApplicationArguments { // 获取源参数,即SpringBootApplication#run方法中传入的args; 这里的source就是SpringBoot对象 String[] getSourceArgs(); @@ -76,7 +76,7 @@ public interface ApplicationArguments { 实例代码: -``` +```Java @Order(1) @Component public class FirstApplicationRunner implements ApplicationRunner { diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\233\221\345\220\254\345\231\250\344\270\216\344\272\213\344\273\266\346\234\272\345\210\266.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\233\221\345\220\254\345\231\250\344\270\216\344\272\213\344\273\266\346\234\272\345\210\266.md" index 1552d4c..dedae1a 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\233\221\345\220\254\345\231\250\344\270\216\344\272\213\344\273\266\346\234\272\345\210\266.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\233\221\345\220\254\345\231\250\344\270\216\344\272\213\344\273\266\346\234\272\345\210\266.md" @@ -33,7 +33,7 @@ 下面看看ApplicationListener接口定义信息 -``` +```Java /** * Interface to be implemented by application event listeners. * @@ -88,7 +88,7 @@ EventPublishingRunListener有什么作用? #### 1.1 EventPublishingRunListener 下面先看下EventPublishingRunListener源码 -``` +```Java /** * SpringApplicationRunListener 是用于发布 SpringApplicationEvent的。 * SpringApplicationRunListener通过内部的ApplicationEventMulticaster在容器刷新之前来触发事件。 @@ -219,7 +219,7 @@ public class EventPublishingRunListener implements SpringApplicationRunListener, ``` EventPublishingRunListener实现了SpringApplicationRunListener接口,该接口定义了用于监听**SpringApplication生命周期**的一系列接口方法。 -``` +```Java public interface SpringApplicationRunListener { /** @@ -283,7 +283,7 @@ public interface SpringApplicationRunListener { ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623065336310.png) 因此可以知道,在SpringBoot中核心广播器就是SimpleApplicationEventMulticaster,所有管理监听器播放事件的工作都由SimpleApplicationEventMulticaster来完成。下面先来看下接口ApplicationEventMulticaster源码及注释: -``` +```Java /** * ApplicationEventMulticaster接口的实现类用于管理多个ApplicationListener监听器,并对事件进行广播 * @@ -350,7 +350,7 @@ AbstractApplicationEventMulticaster不仅实现了ApplicationEventMulticaster, AbstractApplicationEventMulticaster已经把监听器存储好了,就等着广播器进行事件广播,而广播的方法就是视SimpleApplicationEventMulticaster#multicastEvent方法。 -``` +```Java @Override public void multicastEvent(ApplicationEvent event) { // 广播事件 @@ -378,7 +378,7 @@ AbstractApplicationEventMulticaster已经把监听器存储好了,就等着广 #### 2.1 AbstractApplicationEventMulticaster#getApplicationListeners 既然监听器存放在了播放器里,那么播放器肯定会提供一个获取监听器的方法,那么这个方法就是getApplicationListeners。 **AbstractApplicationEventMulticaster#getApplicationListeners** -``` +```Java protected Collection> getApplicationListeners( ApplicationEvent event, ResolvableType eventType) { @@ -432,11 +432,11 @@ protected Collection> getApplicationListeners( 下图为SpringBoot如何将监听器添加进EventPublishingRunListener中的简易流程图。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200623120430115.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) 除此之外,还有一个重要方法AbstractApplicationEventMulticaster#supportsEvent,该方法有两个重载方法 -``` +```Java supportsEvent( ConfigurableBeanFactory beanFactory, String listenerBeanName, ResolvableType eventType) ``` -``` +```Java supportsEvent(Class listenerType, ResolvableType eventType) ``` @@ -470,13 +470,13 @@ supportsEvent(Class listenerType, ResolvableType eventType) ### 4. 模仿SpringBoot,实现自定义的事件与监听器 首先,定义一个天气事件抽象类 -``` +```Java public abstract class WeatherEvent { public abstract String getWeather(); } ``` 定义两个天气事件 -``` +```Java public class RainEvent extends WeatherEvent{ @Override public String getWeather() { @@ -484,7 +484,7 @@ public class RainEvent extends WeatherEvent{ } } ``` -``` +```Java public class SnowEvent extends WeatherEvent{ @Override public String getWeather() { @@ -494,7 +494,7 @@ public class SnowEvent extends WeatherEvent{ ``` 接着定义一个事件监听器 -``` +```Java public interface WeatherListener { // 类似于SpringBoot监听器的onApplicationEvent方法 void onWeatherEvent(WeatherEvent event); @@ -502,7 +502,7 @@ public interface WeatherListener { ``` 有了监听器接口,那么就要定义实现类 -``` +```Java @Component public class RainListener implements WeatherListener{ @Override @@ -513,7 +513,7 @@ public class RainListener implements WeatherListener{ } } ``` -``` +```Java @Component public class SnowListener implements WeatherListener { @Override @@ -527,7 +527,7 @@ public class SnowListener implements WeatherListener { 可以看到,SnowListener和RainListener类的onWeatherEvent方法会依据对应的天气Event进行过滤。 定义完了监听器以及事件之后,就还差广播器以及调用广播器播放事件的XXRunListener了。先定义一个事件广播器,包含了基础的添加监听器、移除监听器、播放事件的功能。 -``` +```Java public interface EventMulticaster { void multicastEvent(WeatherEvent event); void addListener(WeatherListener weatherListener); @@ -535,7 +535,7 @@ public interface EventMulticaster { } ``` 抽象广播器类 -``` +```Java @Component public abstract class AbstractEventMulticaster implements EventMulticaster{ @@ -569,7 +569,7 @@ public abstract class AbstractEventMulticaster implements EventMulticaster{ ``` 定义完了广播器,就运行广播器的XXRunListener了,下面定义一个WeatherRunListener,用于播放感兴趣的事件。 -``` +```Java @Component public class WeatherRunListener { diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" index fb79859..dbff5b4 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\347\263\273\347\273\237\345\210\235\345\247\213\345\214\226\345\231\250.md" @@ -33,13 +33,13 @@ */ ``` - + 注释意思可以总结为以下几点: 1. ApplicationContextInitializer是一个用于在ConfigurableApplicationContext#refresh方法刷新之前,进行回调初始化ConfigurableApplicationContext的一个回调接口。 2. ApplicationContextInitializer通常用于对WEB环境上下文进行编程式地初始化,例如通过ConfigurableApplicationContext#getEnvironment方法获取容器环境来注册属性源以及激活容器配置。 3. ApplicationContextInitializer支持@Order注解,在调用初始化器之前系统会对其进行排序。 -``` +```Java public interface ApplicationContextInitializer { /** @@ -76,7 +76,7 @@ SpringBoot框架已经将spring.factories对应所有的初始化器加载到了 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200608120932643.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70#pic_center) applyInitializers方法的注释已经注明了方法的作用,即:在SpringIOC容器进行refresh刷新之前,将所有的初始化器应用于SpringIOC容器。传入的context此时还没有进行刷新。 -``` +```Java protected void applyInitializers(ConfigurableApplicationContext context) { // getInitializers()方法会从SpringApplication中获取所有的已实例化的初始化器 for (ApplicationContextInitializer initializer : getInitializers()) { @@ -96,7 +96,7 @@ applyInitializers方法的注释已经注明了方法的作用,即:在Spring ### 2. 自定义ApplicationContextInitializer 自定义一个系统初始化器首先当然得实现ApplicationContextInitializer接口,然后将逻辑写在initialize方法里。 -``` +```Java @Order(1) public class FirstInitializer implements ApplicationContextInitializer { // 下面将在initialize方法中获取ConfigurableEnviroment对象,并自定义一个map存入其中。 @@ -120,7 +120,7 @@ org.springframework.context.ApplicationContextInitializer=com.bruis.learnsb.init ``` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200608144657719.png#pic_center) 这样,SpringBoot就能识别到FirstInitializer这个自定义初始化器了。下面定义一个service并实现ApplicationContextAware,用于注入ApplicationContext对象。 -``` +```Java @Component public class TestService implements ApplicationContextAware { @@ -144,7 +144,7 @@ public class TestService implements ApplicationContextAware { ``` 然后写一个Test类,测试一下: -``` +```Java @RunWith(SpringRunner.class) @SpringBootTest public class SpringBeanTest { @@ -168,7 +168,7 @@ context.initializer.classes=com.bruis.learnsb.initializer.FirstInitializer ``` 2. SpringApplication#addInitializers -``` +```Java @SpringBootApplication public class LearnsbApplication { diff --git "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 \345\210\235\350\257\206SpringSecurity.md" "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 \345\210\235\350\257\206SpringSecurity.md" index 9f61fff..c757cdc 100644 --- "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 \345\210\235\350\257\206SpringSecurity.md" +++ "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\200\357\274\211\342\200\224\342\200\224 \345\210\235\350\257\206SpringSecurity.md" @@ -79,7 +79,7 @@ SpringBoot集成SpringSecurity需要配置几个配置文件,并且需要几 #### 3.1 @EnableWebSecurity @EnableWebSecurity是Spring Security用于启用Web安全的注解。典型的用法是该注解用在某个Web安全配置类上(实现了接口WebSecurityConfigurer或者继承自WebSecurityConfigurerAdapter)。 -``` +```Java @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @@ -124,7 +124,7 @@ Spring Security默认是禁用注解的,要想开启注解,需要在继承We #### 4.1 认证 在SpringSecurity中,用于认证的主要接口是AuthenticationManager,它只有一个方法: -``` +```Java public interface AuthenticationManager { Authentication authenticate(Authentication authentication) throws AuthenticationException; @@ -135,7 +135,7 @@ AuthenticationManger最普遍的实现类是ProviderManager,而ProviderManager ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714010510964.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714010535442.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70) AuthenticationProvider接口和AuthenticationManager相似,但是它有一个额外的方法允许查询它支持的Authentication方式: -``` +```Java public interface AuthenticationProvider { Authentication authenticate(Authentication authentication) throws AuthenticationException; @@ -150,7 +150,7 @@ public interface AuthenticationProvider { 一旦认证成功,我们就可以进行授权了,它核心的策略就是AccessDecisionManager。同样的,它将授权逻辑全部委托给AccessDecisionVoter来实现。 一个AccessDecisionVoter考虑一个Authentication(代表一个Principal)和一个被ConfigAttributes装饰的安全对象,这里的ConfigAttributes就是一个包含了URL以及这个URL该有权限的对象的集合。 -``` +```Java boolean supports(ConfigAttribute attribute); boolean supports(Class clazz); diff --git "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224 WebSecurity\345\273\272\351\200\240\346\240\270\345\277\203\351\200\273\350\276\221.md" "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224 WebSecurity\345\273\272\351\200\240\346\240\270\345\277\203\351\200\273\350\276\221.md" index 3d6cfb6..3d88362 100644 --- "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224 WebSecurity\345\273\272\351\200\240\346\240\270\345\277\203\351\200\273\350\276\221.md" +++ "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\270\211\357\274\211\342\200\224\342\200\224 WebSecurity\345\273\272\351\200\240\346\240\270\345\277\203\351\200\273\350\276\221.md" @@ -21,14 +21,14 @@ SpringSecurity通过SecurityConfigurer来建造FilterChainProxy,建造前还 在AbstractConfiguredSecurityBuilder类中,看下安全配置类的定义:‘ -``` +```Java private final LinkedHashMap>, List>> configurers = new LinkedHashMap>, List>>(); ``` 这是定义的安全配置器的子类Map集合,这个configurers就是用于初始化以及配置FilterChainProxy中的filters用的。Map集合中,Key是SecurityConfigurer的子类的Class类型,Value是SecurityConfigurer的list集合。 作为一个成员变量,自然会有方法从外部注入安全配置类。在AbstractConfiguredSecurityBuilder的类中,定义了add方法。 -``` +```Java private > void add(C configurer) throws Exception { Assert.notNull(configurer, "configurer cannot be null"); // 获取安全配置类的Class类型 @@ -64,7 +64,7 @@ private final LinkedHashMap>, List> C apply(C configurer) throws Exception { @@ -82,7 +82,7 @@ private final LinkedHashMap>, List> C getOrApply( C configurer) throws Exception { // 从configurers集合中获取安全配置类 @@ -106,7 +106,7 @@ getOrApply方法主要是从configurers集合中获取配置类,如果存在 找了一圈,发现configure的实现是在ExpressionUrlAuthorizationConfigurer的抽象父类AbstractInterceptUrlConfigurer定义的。 -``` +```Java @Override public void configure(H http) throws Exception { // 创建元数据,该抽象方法由ExpressionUrlAuthorizationConfigurer定义,返回一个ExpressionBasedFilterInvocationSecurityMetadataSource对象 @@ -138,7 +138,7 @@ getOrApply方法主要是从configurers集合中获取配置类,如果存在 ### 2. AbstractConfiguredSecurityBuilder的doBuild()方法 随着configurers集合元素的注入,下面就是进行建造工作,调用doBuild()方法。 -``` +```Java @Override protected final O doBuild() throws Exception { synchronized (configurers) { @@ -173,14 +173,14 @@ getOrApply方法主要是从configurers集合中获取配置类,如果存在 ``` beforeInit()和beforeConfigure()是一个空方法体,没有逻辑。 -``` +```Java protected void beforeInit() throws Exception { } protected void beforeConfigure() throws Exception { } ``` -``` +```Java private void init() throws Exception { // 调用getConfigurers()方法获取this.configurers的所有value值,并以List集合的形式返回 Collection> configurers = getConfigurers(); @@ -201,7 +201,7 @@ beforeInit()和beforeConfigure()是一个空方法体,没有逻辑。 **接着就是configure()方法的调用** -``` +```Java private void configure() throws Exception { // 调用getConfigurers()方法获取this.configurers的所有value值,并以List集合的形式返回 Collection> configurers = getConfigurers(); @@ -217,7 +217,7 @@ beforeInit()和beforeConfigure()是一个空方法体,没有逻辑。 经过init()和configure()方法的执行,以及可以开始进行建造工作了,因而调用performBuild()方法执行建造过程。 -``` +```Java protected abstract O performBuild() throws Exception; ``` 可以看到在AbstractConfiguredSecurityBuilder中,performBuild是以抽象方法的形式存在的,所以实现逻辑都在其子类中。 @@ -242,7 +242,7 @@ WebSecurity用于建造FilterChainProxy,WebSecurity是包含HttpSecurity的一 ### 3. WebSecurity中的performBuild()方法 WebSecurity重写了AbstractConfiguredSecurityBuilder的perfomBuild()方法,核心逻辑如下: -``` +```Java @Override protected Filter performBuild() throws Exception { Assert.state( diff --git "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \345\256\211\345\205\250\350\277\207\346\273\244\345\231\250FilterChainProxy.md" "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \345\256\211\345\205\250\350\277\207\346\273\244\345\231\250FilterChainProxy.md" index f3d7189..2bd7243 100644 --- "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \345\256\211\345\205\250\350\277\207\346\273\244\345\231\250FilterChainProxy.md" +++ "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 \345\256\211\345\205\250\350\277\207\346\273\244\345\231\250FilterChainProxy.md" @@ -10,7 +10,7 @@ - [总结](#总结) - [参考](#参考) - [相关文章](#相关文章) - + ## 前言 相信了解过SpringSecurity或者是OAuth2的读者,会发现网上会有非常多的相关文章,或是纯概念的,或是带有demo的,无论是哪种类型的文章,本人去阅读之后,对于整个框架的概念还是一知半解,也仅仅是实现了某些功能、某些效果而已,若遇到某些问题时无从下手,只能去百度去Google。这是因为对于SpringSecurity和OAuth2的知识没有一个整体概念的把握,知识体系没有形成系统,遂决定写一个关于SpringSecurity和OAuth2的系列专栏,在建造自己知识体系的同时还希望能帮助有同样困惑的同学。 @@ -30,7 +30,7 @@ 首先,WebSecurityConfiguration实现了ImportAware和BeanClassLoaderAware接口,分别实现了setImportMetadata()和setBeanClassLoader() setImportMetadata()方法的作用是注入注解元数据。 -``` +```Java public void setImportMetadata(AnnotationMetadata importMetadata) { // 从注入的importMetadata中获取@EnableWebSecurity注解map值 Map enableWebSecurityAttrMap = importMetadata @@ -47,7 +47,7 @@ setImportMetadata()方法的作用是注入注解元数据。 } ``` setBeanClassLoader方法作用就是注入类加载器ClassLoader。 -``` +```Java public void setBeanClassLoader(ClassLoader classLoader) { this.beanClassLoader = classLoader; } @@ -57,7 +57,7 @@ setBeanClassLoader方法作用就是注入类加载器ClassLoader。 答案就在WebSecurityConfiguration的springSecurityFilterChain()方法中 -``` +```Java // AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME的值是:springSecurityFilterChain // 所以springSecurityFilterChain()的作用就是想Spring容器中注入一个名为springSecurityChain的bean。 @Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) @@ -78,7 +78,7 @@ setBeanClassLoader方法作用就是注入类加载器ClassLoader。 ### 2. WebSecurityConfiguration类 在深入springSecurityFilterChain()方法底层原理之前,需要先了解WebSecurityConfiguration中几个重要的成员变量。 -``` +```Java @Configuration public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware { @@ -111,7 +111,7 @@ public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAwa 我们先来看下WebSecurity的类结构: -``` +```Java public final class WebSecurity extends AbstractConfiguredSecurityBuilder implements SecurityBuilder, ApplicationContextAware { @@ -128,14 +128,14 @@ public final class WebSecurity extends ### 4. AbstractConfiguredSecurityBuilder类 由其类名:AbstractConfiguredSecurityBuilder就可以知道,该类是一个抽象类,作为抽象类,必然会抽象出abstract方法让子类去实现。浏览AbstractConfiguredSecurityBuilder的方法定义,可以看到它内部只定义了一个抽象方法: -``` +```Java protected abstract O performBuild() throws Exception; ``` 这个方法会在建造FilterChainProxy时有使用到,这里先留个印象。 回到AbstractConfiguredSecurityBuilder类定义 -``` +```Java public abstract class AbstractConfiguredSecurityBuilder> extends AbstractSecurityBuilder { // 省略 @@ -147,7 +147,7 @@ public abstract class AbstractConfiguredSecurityBuilder { @@ -155,7 +155,7 @@ public interface SecurityBuilder { } ``` -``` +```Java // 抽象安全建造者 public abstract class AbstractSecurityBuilder implements SecurityBuilder { private AtomicBoolean building = new AtomicBoolean(); @@ -177,7 +177,7 @@ public abstract class AbstractSecurityBuilder implements SecurityBuilder { 所以B extends SecurityBuilder就是指B是SecurityBuilder的子类,用于建造O。 从WebSecurity中的类定义可以发现 -``` +```Java AbstractConfiguredSecurityBuilder ``` @@ -189,7 +189,7 @@ AbstractConfiguredSecurityBuilder作用就是通过WebSecurity这个建造者建 再来看下AbstractConfiguredSecurityBuilder的成员变量。 -``` +```Java public abstract class AbstractConfiguredSecurityBuilder> extends AbstractSecurityBuilder { private final Log logger = LogFactory.getLog(getClass()); @@ -220,7 +220,7 @@ SecurityConfigurer是一个接口,它就是指的安全配置器,看下它 - 安全建造者(SecurityBuilder)在初始化时调用init方法,同时会初始化所有的SecurityConfigurer - 安全建造者(SecurityBuilder)在调用configure方法时,同时会调用所有SecurityConfigurer的configure -``` +```Java public interface SecurityConfigurer> { void init(B builder) throws Exception; @@ -239,7 +239,7 @@ SecurityConfigurer> 这个该怎么理解呢

-``` +```Java private final LinkedHashMap>, List>> configurers = new LinkedHashMap<>(); ``` 所以configurers就是以建造者为key,各种配置类为value的一个LinkedHashMap。 @@ -253,7 +253,7 @@ private final LinkedHashMap>, List objectPostProcessor, @@ -331,7 +331,7 @@ performBuild()方法是AbstractConfiguredSecurityBuilder提供的抽象方法, 方法中的webSecurityConfigurers是通过了@Value注解来注入的bean集合,@Value表达式中又包含了一个autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()的调用。 进入AutowiredWebSecurityConfigurersIgnoreParents类,查看其方法getWebSecurityConfigurers()方法。 -``` +```Java public List> getWebSecurityConfigurers() { // 初始化webSecurityConfigurers集合 List> webSecurityConfigurers = new ArrayList<>(); diff --git "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\345\233\233\357\274\211\342\200\224\342\200\224 FilterChainProxy\350\277\207\346\273\244\345\231\250\351\223\276\344\270\255\347\232\204\345\207\240\344\270\252\351\207\215\350\246\201\347\232\204\350\277\207\346\273\244\345\231\250.md" "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\345\233\233\357\274\211\342\200\224\342\200\224 FilterChainProxy\350\277\207\346\273\244\345\231\250\351\223\276\344\270\255\347\232\204\345\207\240\344\270\252\351\207\215\350\246\201\347\232\204\350\277\207\346\273\244\345\231\250.md" index dc1387b..fb4c0b5 100644 --- "a/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\345\233\233\357\274\211\342\200\224\342\200\224 FilterChainProxy\350\277\207\346\273\244\345\231\250\351\223\276\344\270\255\347\232\204\345\207\240\344\270\252\351\207\215\350\246\201\347\232\204\350\277\207\346\273\244\345\231\250.md" +++ "b/note/SpringSecurity/\344\273\216\351\233\266\345\274\200\345\247\213\347\263\273\347\273\237\345\255\246\344\271\240SpringSecurity\345\222\214OAuth2\357\274\210\345\233\233\357\274\211\342\200\224\342\200\224 FilterChainProxy\350\277\207\346\273\244\345\231\250\351\223\276\344\270\255\347\232\204\345\207\240\344\270\252\351\207\215\350\246\201\347\232\204\350\277\207\346\273\244\345\231\250.md" @@ -29,7 +29,7 @@ #### 1.1 源码分析 -``` +```Java public class SecurityContextPersistenceFilter extends GenericFilterBean { static final String FILTER_APPLIED = "__spring_security_scpf_applied"; @@ -125,7 +125,7 @@ public class SecurityContextPersistenceFilter extends GenericFilterBean { #### 2.1 源码分析 先判断看下ExceptionTranslationFilter的成员变量 -``` +```Java public class ExceptionTranslationFilter extends GenericFilterBean { // AccessDeniedException处理器 @@ -164,7 +164,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { #### 2.2 doFilter源码分析 -``` +```Java public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; @@ -216,7 +216,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { ``` -``` +```Java // SpringSecurityException异常处理的核心逻辑 private void handleSpringSecurityException(HttpServletRequest request, HttpServletResponse response, FilterChain chain, RuntimeException exception) @@ -261,7 +261,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { } ``` -``` +```Java protected void sendStartAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, AuthenticationException reason) throws ServletException, IOException { @@ -286,7 +286,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { 进入其configure方法查看 -``` +```Java @Override public void configure(H http) throws Exception { // 获取authenticationEntryPoint @@ -307,7 +307,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { 下面接着查看一下getAuthenticationEntryPoint()方法 -``` +```Java AuthenticationEntryPoint getAuthenticationEntryPoint(H http) { AuthenticationEntryPoint entryPoint = this.authenticationEntryPoint; // 由于entryPoint为空,所以调用createDefaultEntryPoint去创建entryPoint @@ -318,7 +318,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { } ``` -``` +```Java private AuthenticationEntryPoint createDefaultEntryPoint(H http) { // 如果entryPointMappings为空,则返回Http403ForbiddenEntryPoint if (this.defaultEntryPointMappings.isEmpty()) { @@ -341,7 +341,7 @@ public class ExceptionTranslationFilter extends GenericFilterBean { ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200819101823377.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70#pic_center) 可以看到,HTTP403ForbiddenEntryPiont这个类代码非常少 -``` +```Java public class Http403ForbiddenEntryPoint implements AuthenticationEntryPoint { private static final Log logger = LogFactory.getLog(Http403ForbiddenEntryPoint.class); @@ -361,7 +361,7 @@ public class Http403ForbiddenEntryPoint implements AuthenticationEntryPoint { 这里,还讲解一下另外一个类LoginURLAuthenticationEntryPoint的方法commence。 -``` +```Java public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { // 重定向url From 3ecfc4528a2d7026a43a9d25651ee42f70ca1693 Mon Sep 17 00:00:00 2001 From: "haiyang.luo" Date: Fri, 15 Jan 2021 15:44:37 +0800 Subject: [PATCH 03/68] =?UTF-8?q?BIO=E5=BA=95=E5=B1=82=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/learnjava/io/bio/BIO.java | 47 +++++++++++++++++ ...25\345\261\202\345\216\237\347\220\206.md" | 52 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/io/bio/BIO.java create mode 100644 "note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" diff --git a/JdkLearn/src/main/java/com/learnjava/io/bio/BIO.java b/JdkLearn/src/main/java/com/learnjava/io/bio/BIO.java new file mode 100644 index 0000000..4226be5 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/io/bio/BIO.java @@ -0,0 +1,47 @@ +package com.learnjava.io.bio; + +import java.io.InputStream; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author lhy + * + * 在windows服务器下,可以使用telnet来合serversocket建立连接 + */ +public class BIO { + public static void main(String[] args) throws Exception { + ServerSocket serverSocket = new ServerSocket(666); + System.out.println("Server started..."); + while (true) { + System.out.println("socket accepting..."); + Socket socket = serverSocket.accept(); + new Thread(new Runnable() { + @Override + public void run() { + try { + byte[] bytes = new byte[1024]; + InputStream inputStream = socket.getInputStream(); + while (true) { + System.out.println("reading..."); + int read = inputStream.read(bytes); + if (read != -1) { + System.out.println(new String(bytes, 0, read)); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }).start(); + } + } +} diff --git "a/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" "b/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" new file mode 100644 index 0000000..555f7cb --- /dev/null +++ "b/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" @@ -0,0 +1,52 @@ +## 从linux kernel内核出发,IO底层原理 + +### 1. BIO + +``` +import java.io.InputStream; +import java.net.ServerSocket; +import java.net.Socket; + +/** + * @author lhy + * + * 在windows服务器下,可以使用telnet来合serversocket建立连接 + */ +public class BIO { + public static void main(String[] args) throws Exception { + ServerSocket serverSocket = new ServerSocket(666); + System.out.println("Server started..."); + while (true) { + System.out.println("socket accepting..."); + Socket socket = serverSocket.accept(); + new Thread(new Runnable() { + @Override + public void run() { + try { + byte[] bytes = new byte[1024]; + InputStream inputStream = socket.getInputStream(); + while (true) { + System.out.println("reading..."); + int read = inputStream.read(bytes); + if (read != -1) { + System.out.println(new String(bytes, 0, read)); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }).start(); + } + } +} +``` + From 3021ea85fe7d556231be4904895bc667aacbc3c2 Mon Sep 17 00:00:00 2001 From: "haiyang.luo" Date: Sat, 16 Jan 2021 23:34:55 +0800 Subject: [PATCH 04/68] =?UTF-8?q?[U]=20=E6=9B=B4=E6=96=B0IO=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E5=8E=9F=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...272\225\345\261\202\345\216\237\347\220\206.md" | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git "a/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" "b/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" index 555f7cb..b66a558 100644 --- "a/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" +++ "b/note/Netty/IO\345\272\225\345\261\202\345\216\237\347\220\206.md" @@ -50,3 +50,17 @@ public class BIO { } ``` +#### 1.1 从kernel内核的角度来分析BIO的运行机制 + +### 2. IO多路复用 + +#### 2.1 select + +#### 2.2 poll + +#### 2.3 epoll + +### 3. 零拷贝 + + + From a75678d3ea998f3daa982c5ba7321cc21c756124 Mon Sep 17 00:00:00 2001 From: "haiyang.luo" Date: Sun, 17 Jan 2021 23:54:02 +0800 Subject: [PATCH 05/68] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0=E5=BC=B1?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../reference/WeakReferenceTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java diff --git a/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java new file mode 100644 index 0000000..ad28477 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java @@ -0,0 +1,34 @@ +package com.learnjava.reference; + +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; +import java.lang.ref.WeakReference; + +public class WeakReferenceTest { + public static void main(String[] args) throws Exception { + test02(); + } + + private static void test02() throws InterruptedException { + ReferenceQueue refQueue = new ReferenceQueue(); + + // 10 mb + byte[] buffer = new byte[1024 * 1024 * 10]; + WeakReference weakReference = new WeakReference(buffer, refQueue); + // 失去强引用关联 + buffer = null; + + Reference ref0 = refQueue.poll(); + System.out.println("gc 执行之前, refQueue中是否有数据?" + (ref0 != null ? "有" : "没有")); + System.out.println("gc 执行之前, ref引用的对象:" + weakReference.get()); + + System.gc(); + // 确保gc程序执行 + Thread.sleep(1000); + + System.out.println("gc 执行之前, ref引用的对象:" + weakReference.get()); + + Reference ref = refQueue.poll(); + System.out.println("referenceQueue 中获取的 ref与 weakReference中的是否一致?" + (ref == weakReference)); + } +} From 0db96f342a382391802ad8d5fcca31bc9a1d8a0a Mon Sep 17 00:00:00 2001 From: "haiyang.luo" Date: Wed, 24 Feb 2021 18:35:32 +0800 Subject: [PATCH 06/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=BD=AF=E5=BC=95?= =?UTF-8?q?=E7=94=A8=E3=80=81=E8=99=9A=E5=BC=95=E7=94=A8test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learnjava/reference/PhantomRefTest.java | 35 ++++++++++++++++++ .../reference/SoftReferenceTest.java | 35 ++++++++++++++++++ .../reference/WeakReferenceTest.java | 36 ++++++++++++++++++- 3 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/reference/PhantomRefTest.java create mode 100644 JdkLearn/src/main/java/com/learnjava/reference/SoftReferenceTest.java diff --git a/JdkLearn/src/main/java/com/learnjava/reference/PhantomRefTest.java b/JdkLearn/src/main/java/com/learnjava/reference/PhantomRefTest.java new file mode 100644 index 0000000..426ef67 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/reference/PhantomRefTest.java @@ -0,0 +1,35 @@ +package com.learnjava.reference; + +import java.lang.ref.PhantomReference; +import java.lang.ref.Reference; +import java.lang.ref.ReferenceQueue; + +public class PhantomRefTest { + + public static void main(String[] args) throws InterruptedException { + ReferenceQueue referenceQueue = new ReferenceQueue(); + + // 10mb + byte[] buffer = new byte[1024 * 1024 * 10]; + + PhantomReference phantomReference = new PhantomReference(buffer, referenceQueue); + + // 字节数组对象,失去了强引用 + buffer = null; + + Reference ref0 = referenceQueue.poll(); + + System.out.println("gc 执行之前, refQueue中是否有数据?" + (ref0 != null ? "有" : "没有")); + System.out.println("gc 执行之前, ref引用的对象:" + phantomReference.get()); + + System.gc(); + // 确保gc程序执行 + Thread.sleep(1000); + + System.out.println("gc 执行之后, ref引用的对象:" + phantomReference.get()); + + Reference ref = referenceQueue.poll(); + System.out.println("gc 执行之后, refQueue中是否有数据?" + (ref != null ? "有" : "没有")); + System.out.println("referenceQueue 中获取的 ref与 weakReference中的是否一致?" + (ref == phantomReference)); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/reference/SoftReferenceTest.java b/JdkLearn/src/main/java/com/learnjava/reference/SoftReferenceTest.java new file mode 100644 index 0000000..38e706e --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/reference/SoftReferenceTest.java @@ -0,0 +1,35 @@ +package com.learnjava.reference; + +import java.lang.ref.Reference; +import java.lang.ref.SoftReference; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * 软引用 + */ +public class SoftReferenceTest { + public static void main(String[] args) throws InterruptedException { + List refList = new ArrayList(); + + for (int i = 0; i < 1000; i++) { + // 10mb + byte[] buffer = new byte[1024 * 1024 * 10]; + + SoftReference softReference = new SoftReference(buffer); + + refList.add(softReference); + } + + System.gc(); + Thread.sleep(1000); + + Iterator it = refList.iterator(); + + while (it.hasNext()) { + Reference ref = it.next(); + System.out.println("当前ref引用的对象:" + ref.get()); + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java index ad28477..bbbb766 100644 --- a/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java +++ b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java @@ -1,14 +1,47 @@ package com.learnjava.reference; +import com.sun.webkit.graphics.Ref; + import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +/** + * soft软引用 gc堆内存不够时,可能会回收 + * weak弱引用 gc时,内存一定会回收不可用对象 + * phantom虚引用 + */ public class WeakReferenceTest { public static void main(String[] args) throws Exception { +// test01(); test02(); } + private static void test01() throws InterruptedException { + List refList = new ArrayList(); + + for (int i = 0; i < 1000; i++) { + // 10mb + byte[] buffer = new byte[1024 * 1024 * 10]; + + WeakReference weakReference = new WeakReference(buffer); + + refList.add(weakReference); + } + + // 将buffer直接全部回收了 + System.gc(); + Thread.sleep(1000); + Iterator iterator = refList.iterator(); + while (iterator.hasNext()) { + Reference ref = iterator.next(); + System.out.println("当前ref引用的对象:" + ref.get()); + } + } + private static void test02() throws InterruptedException { ReferenceQueue refQueue = new ReferenceQueue(); @@ -26,9 +59,10 @@ private static void test02() throws InterruptedException { // 确保gc程序执行 Thread.sleep(1000); - System.out.println("gc 执行之前, ref引用的对象:" + weakReference.get()); + System.out.println("gc 执行之后, ref引用的对象:" + weakReference.get()); Reference ref = refQueue.poll(); + System.out.println("gc 执行之后, refQueue中是否有数据?" + (ref != null ? "有" : "没有")); System.out.println("referenceQueue 中获取的 ref与 weakReference中的是否一致?" + (ref == weakReference)); } } From 59ee2dc8f6f5095d02cc1d4c7dd35b6f9d3201a7 Mon Sep 17 00:00:00 2001 From: "haiyang.luo" Date: Fri, 26 Feb 2021 12:08:23 +0800 Subject: [PATCH 07/68] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0Java=E9=9B=B6?= =?UTF-8?q?=E6=8B=B7=E8=B4=9D=E5=AE=9E=E7=8E=B0case?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/nio/MappedByteBufferTest.java | 51 +++++++++++++++++-- .../\351\233\266\346\213\267\350\264\235.md" | 15 +++++- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/JdkLearn/src/main/java/com/learnjava/io/nio/MappedByteBufferTest.java b/JdkLearn/src/main/java/com/learnjava/io/nio/MappedByteBufferTest.java index 4097936..75cf208 100644 --- a/JdkLearn/src/main/java/com/learnjava/io/nio/MappedByteBufferTest.java +++ b/JdkLearn/src/main/java/com/learnjava/io/nio/MappedByteBufferTest.java @@ -1,5 +1,8 @@ package com.learnjava.io.nio; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; @@ -17,13 +20,55 @@ public static void main(String[] args) throws Exception { MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, 5); - mappedByteBuffer.put(0, (byte)'H'); - mappedByteBuffer.put(3, (byte)'9'); + mappedByteBuffer.put(0, (byte) 'H'); + mappedByteBuffer.put(3, (byte) '9'); // IndexOutOfBoundsException - mappedByteBuffer.put(5, (byte)'Y'); + mappedByteBuffer.put(5, (byte) 'Y'); randomAccessFile.close(); System.out.println("change success"); } + + /** + * + * @param from + * @param to + * @throws IOException + */ + public static void mmap4zeroCopy(String from, String to) throws IOException { + FileChannel source = null; + FileChannel destination = null; + try { + source = new RandomAccessFile(from, "r").getChannel(); + destination = new RandomAccessFile(to, "rw").getChannel(); + MappedByteBuffer inMappedBuf = + source.map(FileChannel.MapMode.READ_ONLY, 0, source.size()); + destination.write(inMappedBuf); + } finally { + if (source != null) { + source.close(); + } + if (destination != null) { + destination.close(); + } + } + } + + public static void sendfile4zeroCopy(String from, String to) throws IOException{ + FileChannel source = null; + FileChannel destination = null; + try { + source = new FileInputStream(from).getChannel(); + destination = new FileOutputStream(to).getChannel(); + source.transferTo(0, source.size(), destination); + } finally { + if (source != null) { + source.close(); + } + if (destination != null) { + destination.close(); + } + } + } } diff --git "a/note/Netty/\351\233\266\346\213\267\350\264\235.md" "b/note/Netty/\351\233\266\346\213\267\350\264\235.md" index 6d41d8a..151082b 100644 --- "a/note/Netty/\351\233\266\346\213\267\350\264\235.md" +++ "b/note/Netty/\351\233\266\346\213\267\350\264\235.md" @@ -4,7 +4,20 @@ ## 正文 -### 1. mmap和sendFile零拷贝 +### 1. 再看IO + +在深入零拷贝机制之前,先来了解下传统BIO通信底层发生了什么,为什么会这么“消耗资源”。Linux服务器是现在绝大多数系统的首选,它的优点就不再赘述,下面的分析都基于Linux环境来进行。作为一台服务器,最常见的功能就是 +获取客户端发送过来的请求,然后再去查数据库DB获取到想要的数据,再将数据以一定的业务逻辑处理后传回给客户端,这一过程主要会调用Linux内核的以下两个函数: + +``` +read(file, tmp_buf, len); + +write(socket, tmp_buf, len); +``` + + + +### 2. mmap和sendFile零拷贝 在Java程序中,常用的零拷贝有mmap(内存映射)和sendFile。让我们回到IO底层,在Java中,一次IO操作在操作系统底层都做了哪些工作。 From 33975aa25bef12c6da3a098f03529ba1148f2e88 Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 23 Apr 2021 18:06:59 +0800 Subject: [PATCH 08/68] =?UTF-8?q?Lambda=20stream=E6=B5=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/learnjava/lambda/LambdaDemo01.java | 37 +++++++++++++++++ .../learnjava/lambda/LambdaDemoForList.java | 40 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemo01.java create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemo01.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemo01.java new file mode 100644 index 0000000..ae7e1d4 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemo01.java @@ -0,0 +1,37 @@ +package com.learnjava.lambda; + +/** + * @author bruis + * lambda表达式 + */ +public class LambdaDemo01 { + + /** + * 打印内部类 + */ + interface Printer { + void print(String content); +// void print(String content, String operator); + } + + public static void printSomething(String content, Printer printer) { + printer.print(content); + } + + public static void main(String[] args) { +// Printer printer = (String content) -> { +// System.out.println(content); +// }; + +// 去掉参数类型,只有一个参数时可以去掉括号 +// Printer printer = (content) -> { +// System.out.println(content); +// }; + +// 只有一个参数提 +// Printer printer = val -> System.out.println(val); + + Printer printer = System.out::println; + printSomething("hello lambda", printer); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java new file mode 100644 index 0000000..72671f8 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java @@ -0,0 +1,40 @@ +package com.learnjava.lambda; + +import jdk.nashorn.internal.objects.annotations.Constructor; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author bruis + * Lambda的List demo + */ +public class LambdaDemoForList { + + public static void main(String[] args) { + test01(); + } + + public static void test01() { + List nameStrList = Arrays.asList("abc", "efg", "hig", "hii", "klm"); + + List result = nameStrList + .stream() + .filter(s -> s.startsWith("h")) + .map(String::toUpperCase) + .map(MyStringUtils::myToUpperCase) + .collect(Collectors.toList()); + + for (String name : result) { + System.out.println(name); + } + } + + private static class MyStringUtils { + + public static String myToUpperCase(String str) { + return str.toUpperCase(); + } + } +} From aa96e87959800dd25946c6e36f7499478c244218 Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 23 Apr 2021 18:45:09 +0800 Subject: [PATCH 09/68] =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lambda/LambdaComparatorDemo.java | 75 +++++++++++++++++++ .../learnjava/lambda/LambdaDemoForList.java | 56 +++++++++++++- .../learnjava/lambda/StreamParallelDemo.java | 10 +++ 3 files changed, 137 insertions(+), 4 deletions(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/StreamParallelDemo.java diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java new file mode 100644 index 0000000..8e3a71a --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java @@ -0,0 +1,75 @@ +package com.learnjava.lambda; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Stream; + +public class LambdaComparatorDemo { + + public static String[] arrays = {"Milan", "london", "San Francisco", "Tokyo", "New Delhi"}; + + public static void main(String[] args) { + test01(); + } + + /** + * List字符串排序 + */ + public static void test01() { + List cities = Arrays.asList(arrays); + + System.out.println(cities); + + // CASE_INSENSITIVE_ORDER 是一个排序器Comparator接口,意思是不区分大小写进行排序 + cities.sort(String.CASE_INSENSITIVE_ORDER); + System.out.println(cities); + + // 自然排序 + cities.sort(Comparator.naturalOrder()); + System.out.println(cities); + + // 可以将排序器放在Stream管道流中 + Stream.of(arrays) + .sorted(Comparator.naturalOrder()) + .forEach(System.out::println); + } + + + + + + + + + + + + + + + + + + + + + + + + @Data + @AllArgsConstructor + public class Employee { + + private Integer id; + // 年龄 + private Integer age; + // 性别 + private String gender; + private String firstName; + private String lastName; + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java index 72671f8..e1aa8e6 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaDemoForList.java @@ -1,10 +1,9 @@ package com.learnjava.lambda; -import jdk.nashorn.internal.objects.annotations.Constructor; - import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @author bruis @@ -12,10 +11,59 @@ */ public class LambdaDemoForList { + public static String[] arrays = {"Monkey", "Lion", "Giraffe", "Lemur"}; + + public static String[] arrays2 = {"Monkey", "Lion", "Giraffe", "Lemur", "Lion"}; + public static void main(String[] args) { - test01(); +// test01(); +// test02(); + test03(); + } + + /** + * 去重Distinct + 排序Sort + */ + public static void test03() { + // 去重 + List uniqueAnimals = Stream.of(arrays2) + .distinct() + .collect(Collectors.toList()); + System.out.println(uniqueAnimals); + // 排序 + List sortedAnimals = Stream.of(arrays) + // 对字母是按照自然顺序进行排序的 + .sorted() + .collect(Collectors.toList()); + System.out.println(sortedAnimals); } + /** + * Limit + Skip 数据截取 + */ + public static void test02() { + + /** + * 截取前两位字符串 + */ + List limitN = Stream.of(arrays) + .limit(2) + .collect(Collectors.toList()); + + /** + * 过滤掉前两位元素 + */ + List skipN = Stream.of(arrays) + .skip(2) + .collect(Collectors.toList()); + + System.out.println(limitN); + System.out.println(skipN); + } + + /** + * 过滤 + map处理 + */ public static void test01() { List nameStrList = Arrays.asList("abc", "efg", "hig", "hii", "klm"); @@ -23,6 +71,7 @@ public static void test01() { .stream() .filter(s -> s.startsWith("h")) .map(String::toUpperCase) + // 调用自定义的方法 .map(MyStringUtils::myToUpperCase) .collect(Collectors.toList()); @@ -32,7 +81,6 @@ public static void test01() { } private static class MyStringUtils { - public static String myToUpperCase(String str) { return str.toUpperCase(); } diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/StreamParallelDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/StreamParallelDemo.java new file mode 100644 index 0000000..93c120c --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/StreamParallelDemo.java @@ -0,0 +1,10 @@ +package com.learnjava.lambda; + +/** + * + * 串行、并行 todo + * + * @author bruis + */ +public class StreamParallelDemo { +} From 87259bd15c397364b610aff653c15ded626be61f Mon Sep 17 00:00:00 2001 From: Bruis Date: Sat, 24 Apr 2021 09:44:55 +0800 Subject: [PATCH 10/68] =?UTF-8?q?=E6=8E=92=E5=BA=8F2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lambda/LambdaComparatorDemo.java | 80 ++++++++++++++++++- 1 file changed, 78 insertions(+), 2 deletions(-) diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java index 8e3a71a..1764c01 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java @@ -13,7 +13,9 @@ public class LambdaComparatorDemo { public static String[] arrays = {"Milan", "london", "San Francisco", "Tokyo", "New Delhi"}; public static void main(String[] args) { - test01(); +// test01(); +// test02(); + test03(); } /** @@ -38,6 +40,69 @@ public static void test01() { .forEach(System.out::println); } + /** + * 对整数数组进行排序 + */ + public static void test02() { + List numbers = Arrays.asList(6, 2, 4, 3, 1, 9); + System.out.println(numbers); + + // 自然排序(升序) + numbers.sort(Comparator.naturalOrder()); + System.out.println(numbers); + + // 降序 + numbers.sort(Comparator.reverseOrder()); + System.out.println(numbers); + } + + /** + * 对对象进行排序 + */ + public static void test03() { + Employee e1 = new Employee(1,23,"M","Rick","Beethovan"); + Employee e2 = new Employee(2,13,"F","Martina","Hengis"); + Employee e3 = new Employee(3,43,"M","Ricky","Martin"); + Employee e4 = new Employee(4,26,"M","Jon","Lowman"); + Employee e5 = new Employee(5,19,"F","Cristine","Maria"); + Employee e6 = new Employee(6,15,"M","David","Feezor"); + Employee e7 = new Employee(7,68,"F","Melissa","Roy"); + Employee e8 = new Employee(8,79,"M","Alex","Gussin"); + Employee e9 = new Employee(9,15,"F","Neetu","Singh"); + Employee e10 = new Employee(10,45,"M","Naveen","Jain"); + + List employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); + + // 根据employee的年龄进行自然排序 + employees.sort(Comparator.comparing(Employee::getAge)); + employees.forEach(System.out::println); + + System.out.println(); + + // 根据employee的年龄进行降序排序 + employees.sort(Comparator.comparing(Employee::getAge).reversed()); + employees.forEach(System.out::println); + + System.out.println(); + + // 先对性别排序,然后对年龄进行排序 + employees.sort( + Comparator.comparing(Employee::getGender) + .thenComparing(Employee::getAge) + // 性别,年龄都进行倒序排序 + .reversed() + ); + employees.forEach(System.out::println); + + // 自定义排序器 + employees.sort((em1, em2) -> { + if (em1.getAge().equals(em2.getAge())) { + return 0; + } + return em1.getAge() - em2.getAge() > 0 ? -1 : 1; + }); + employees.forEach(System.out::println); + } @@ -62,7 +127,7 @@ public static void test01() { @Data @AllArgsConstructor - public class Employee { + public static class Employee { private Integer id; // 年龄 @@ -71,5 +136,16 @@ public class Employee { private String gender; private String firstName; private String lastName; + + @Override + public String toString() { + return "Employee{" + + "id=" + id + + ", age=" + age + + ", gender='" + gender + '\'' + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + '}'; + } } } From e85e3c984ac1ebcda09e444549d8a29742f92e29 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sat, 24 Apr 2021 15:08:21 +0800 Subject: [PATCH 11/68] lambda map --- .../lambda/LambdaComparatorDemo.java | 40 ++++--- .../com/learnjava/lambda/LambdaMapDemo.java | 42 +++++++ .../learnjava/lambda/LambdaReduceDemo.java | 104 ++++++++++++++++++ .../com/learnjava/lambda/StreamMatchDemo.java | 49 +++++++++ 4 files changed, 222 insertions(+), 13 deletions(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaReduceDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/StreamMatchDemo.java diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java index 1764c01..c618163 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java @@ -2,16 +2,36 @@ import lombok.AllArgsConstructor; import lombok.Data; +import sun.java2d.pipe.SpanShapeRenderer; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Comparator; +import java.util.Date; import java.util.List; +import java.util.function.Predicate; import java.util.stream.Stream; public class LambdaComparatorDemo { public static String[] arrays = {"Milan", "london", "San Francisco", "Tokyo", "New Delhi"}; + public static List employees; + + static { + Employee e1 = new Employee(1,23,"M","Rick","Beethovan", "2021-04-01"); + Employee e2 = new Employee(2,13,"F","Martina","Hengis", "2021-04-02"); + Employee e3 = new Employee(3,43,"M","Ricky","Martin","2021-04-03" ); + Employee e4 = new Employee(4,26,"M","Jon","Lowman", "2021-04-04"); + Employee e5 = new Employee(5,19,"F","Cristine","Maria", "2021-04-05"); + Employee e6 = new Employee(6,15,"M","David","Feezor", "2021-04-06"); + Employee e7 = new Employee(7,68,"F","Melissa","Roy", "2021-04-07"); + Employee e8 = new Employee(8,79,"M","Alex","Gussin", "2021-04-08"); + Employee e9 = new Employee(9,15,"F","Neetu","Singh", "2021-04-09"); + Employee e10 = new Employee(10,45,"M","Naveen","Jain", "2021-04-10"); + employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); + } + public static void main(String[] args) { // test01(); // test02(); @@ -60,19 +80,6 @@ public static void test02() { * 对对象进行排序 */ public static void test03() { - Employee e1 = new Employee(1,23,"M","Rick","Beethovan"); - Employee e2 = new Employee(2,13,"F","Martina","Hengis"); - Employee e3 = new Employee(3,43,"M","Ricky","Martin"); - Employee e4 = new Employee(4,26,"M","Jon","Lowman"); - Employee e5 = new Employee(5,19,"F","Cristine","Maria"); - Employee e6 = new Employee(6,15,"M","David","Feezor"); - Employee e7 = new Employee(7,68,"F","Melissa","Roy"); - Employee e8 = new Employee(8,79,"M","Alex","Gussin"); - Employee e9 = new Employee(9,15,"F","Neetu","Singh"); - Employee e10 = new Employee(10,45,"M","Naveen","Jain"); - - List employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); - // 根据employee的年龄进行自然排序 employees.sort(Comparator.comparing(Employee::getAge)); employees.forEach(System.out::println); @@ -136,6 +143,7 @@ public static class Employee { private String gender; private String firstName; private String lastName; + private String date; @Override public String toString() { @@ -145,7 +153,13 @@ public String toString() { ", gender='" + gender + '\'' + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + + ", date='" + date + '\'' + '}'; } + + // 年龄大于70的谓语 + static Predicate ageGreaterThan70 = e -> e.getAge() > 70; + + static Predicate ageLessThan18 = e -> e.getAge() < 18; } } diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java new file mode 100644 index 0000000..67a47f3 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java @@ -0,0 +1,42 @@ +package com.learnjava.lambda; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author bruis + * 操作Map + */ +public class LambdaMapDemo { + + public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + + public static void main(String[] args) { + test01(); + } + + /** + * 需求,将employee集合中的元素根据date进行排序 + */ + public static void test01() { + List sortedByDate = LambdaComparatorDemo.employees + .stream() + .sorted((a, b) -> { + int result; + try { + result = getDate(b.getDate()).compareTo(getDate(a.getDate())); + } catch (Exception e) { + result = 0; + } + return result; + }) + .collect(Collectors.toList()); + System.out.println(sortedByDate); + } + + public static Date getDate(String date) throws Exception { + return format.parse(date); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaReduceDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaReduceDemo.java new file mode 100644 index 0000000..b656747 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaReduceDemo.java @@ -0,0 +1,104 @@ +package com.learnjava.lambda; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +/** + * @author bruis + * 累加器 + */ +public class LambdaReduceDemo { + + public static void main(String[] args) { +// test01(); +// test02(); + test03(); + } + + /** + * 对整形进行操作 + */ + public static void test01() { + List numbers = Arrays.asList(1, 2, 3, 4, 5); + Integer reduce = numbers + .stream() + .reduce(0, LambdaReduceDemo::mySum); +// .reduce(0, Integer::sum); +// .reduce(0, (total, element) -> total + element); + System.out.println(reduce); + } + + /** + * 对字符串进行操作 + */ + public static void test02() { + List letters = Arrays.asList("a", "b", "c", "d", "e"); + String reduce = letters + .stream() + .reduce("", String::concat); +// .reduce("", (totol, element) -> totol.concat(element)); + System.out.println(reduce); + } + + /** + * 操作Employee集合元素,将所有员工的年龄通过reduce累加起来 + * + * U identity, BiFunction accumulator, BinaryOperator combiner + * reduce的三个参数: + * 1)初始值; + * 2)累加器(可自己实现逻辑) + * 3) 合并器(parallelStream模式时的合并) + * + */ + public static void test03() { + // 将Employee集合元素转化为Integer集合元素(流) + // map的操作就是将a类型元素转化为b类型元素 + Stream integerStream = LambdaComparatorDemo + .employees + .stream() + .map(LambdaComparatorDemo.Employee::getAge); + + // 求所有员工的年龄 + Integer totalAge = integerStream.reduce(0, Integer::sum); + System.out.println(totalAge); + + // 数据量大的话,可以用并行计算 + // 先讲员工集合转化为“并行流” + Stream parallelStream = LambdaComparatorDemo + .employees + .parallelStream() + .map(LambdaComparatorDemo.Employee::getAge); + + // 相比于普通的单个流,parallelStream多了个合并器,将多个CPU计算的结果再合并到同一个流 + Integer reduce = parallelStream.reduce(0, Integer::sum, Integer::sum); + System.out.println(reduce); + + // 可以不用map将employee转化为Integer对象,可以直接reduce操作,最后通过Integer::sum这个合并器来将结果合并为Integer类型 + Integer total = LambdaComparatorDemo + .employees + .stream() + .reduce(0, (subTotal, emp) -> subTotal + emp.getAge(), Integer::sum); + System.out.println(total); + + Integer total2 = LambdaComparatorDemo + .employees + .stream() + .reduce(0, LambdaReduceDemo::mySum2, Integer::sum); + System.out.println(total2); + } + + /** + * 可作为BiFunction,传入到reduce作为入参 + * @param a + * @param b + * @return + */ + public static Integer mySum(int a, int b) { + return a + b; + } + + public static Integer mySum2(int a, LambdaComparatorDemo.Employee employee) { + return a + employee.getAge(); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/StreamMatchDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/StreamMatchDemo.java new file mode 100644 index 0000000..3962b48 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/StreamMatchDemo.java @@ -0,0 +1,49 @@ +package com.learnjava.lambda; + +import java.util.Optional; + +/** + * @author bruis + */ +public class StreamMatchDemo { + + public static void main(String[] args) { +// test01(); + test02(); + } + + /** + * 判断是否有年龄大于70的员工 + */ + public static void test01() { + boolean isExistAgeThan70 = LambdaComparatorDemo.employees + .stream() + // 使用了Employee的谓语语句(这种写法方便复用) + .anyMatch(LambdaComparatorDemo.Employee.ageGreaterThan70); +// .anyMatch(e -> e.getAge() > 70); + System.out.println(isExistAgeThan70); + + boolean isExistAgeLessThan18 = LambdaComparatorDemo.employees + .stream() + .noneMatch(LambdaComparatorDemo.Employee.ageLessThan18); + + System.out.println(isExistAgeLessThan18); + } + + /** + * 元素查找与Optional + */ + public static void test02() { + + Optional employeeOptional = LambdaComparatorDemo.employees + .stream() + .filter(e -> e.getAge() > 400) + .findFirst(); + + // Optional#get 会报空 +// System.out.println(employeeOptional.get()); + LambdaComparatorDemo.Employee employee = employeeOptional.orElse(null); + System.out.println(employee == null); + } + +} From e8529cc6d5718debf76bb2227d91c36c5d2bc2c4 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 25 Apr 2021 17:51:41 +0800 Subject: [PATCH 12/68] =?UTF-8?q?Map=E7=9B=B8=E5=85=B3=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lambda/LambdaComparatorDemo.java | 8 +- .../com/learnjava/lambda/LambdaMapDemo.java | 101 +++++++++++++++++- 2 files changed, 102 insertions(+), 7 deletions(-) diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java index c618163..1db2858 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaComparatorDemo.java @@ -21,11 +21,11 @@ public class LambdaComparatorDemo { static { Employee e1 = new Employee(1,23,"M","Rick","Beethovan", "2021-04-01"); Employee e2 = new Employee(2,13,"F","Martina","Hengis", "2021-04-02"); - Employee e3 = new Employee(3,43,"M","Ricky","Martin","2021-04-03" ); - Employee e4 = new Employee(4,26,"M","Jon","Lowman", "2021-04-04"); - Employee e5 = new Employee(5,19,"F","Cristine","Maria", "2021-04-05"); + Employee e3 = new Employee(3,43,"M","Ricky","Martin","2021-04-09" ); + Employee e4 = new Employee(4,26,"M","Jon","Lowman", "2021-04-10"); + Employee e5 = new Employee(5,19,"F","Cristine","Maria", "2021-04-01"); Employee e6 = new Employee(6,15,"M","David","Feezor", "2021-04-06"); - Employee e7 = new Employee(7,68,"F","Melissa","Roy", "2021-04-07"); + Employee e7 = new Employee(7,68,"F","Melissa","Roy", "2021-04-06"); Employee e8 = new Employee(8,79,"M","Alex","Gussin", "2021-04-08"); Employee e9 = new Employee(9,15,"F","Neetu","Singh", "2021-04-09"); Employee e10 = new Employee(10,45,"M","Naveen","Jain", "2021-04-10"); diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java index 67a47f3..ef7b2be 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java @@ -1,8 +1,8 @@ package com.learnjava.lambda; import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -14,7 +14,10 @@ public class LambdaMapDemo { public static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); public static void main(String[] args) { - test01(); +// test01(); +// test02(); +// test03(); + test04(); } /** @@ -23,6 +26,7 @@ public static void main(String[] args) { public static void test01() { List sortedByDate = LambdaComparatorDemo.employees .stream() + .sorted() .sorted((a, b) -> { int result; try { @@ -36,6 +40,97 @@ public static void test01() { System.out.println(sortedByDate); } + /** + * HashMap的merge方法,如果key相同,则通过merge来对key相同的袁术进行处理 + */ + public static void test02() { + String key = "money"; + Map map = new HashMap(){{put(key, 100);}}; + + // 第三个参数时BiFunction,聚合函数(可以这么理解) + map.merge(key,100,(oldValue, newValue) -> oldValue + newValue); +// map.merge(key, 100,Integer::sum); + System.out.println(map); + } + + /** + * 对map进行排序 + */ + public static void test03() { + Map codes = new HashMap<>(); + codes.put("2021-04-01", 1); + codes.put("2021-04-15", 49); + codes.put("2021-04-10", 33); + codes.put("2021-04-05", 86); + codes.put("2021-04-20", 92); + + // 先将Map转化为List,通过collect处理后再转为Map + Map sortedMap = codes.entrySet() + .stream() +// .sorted((c1, c2) -> c2.getValue().compareTo(c1.getValue())) +// .sorted(Map.Entry.comparingByValue()) + .sorted((c1, c2) -> c2.getKey().compareTo(c1.getKey())) + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (oldVal, newVal) -> oldVal, + LinkedHashMap::new + ) + ); + + sortedMap.entrySet().forEach(System.out::println); + + } + + /** + * 将list转为map,并用其中一个value作为key + */ + public static void test04() { + LinkedHashMap collect = LambdaComparatorDemo.employees + .stream() + .collect( + Collectors.toMap( + LambdaComparatorDemo.Employee::getDate, + // 这样是返回本身对象的一个表达式,还可以用Function.identity() + // Function.indentity() 就是 t -> t +// employee -> employee, + Function.identity(), + (oldVal, newVal) -> { + // 重复的key就将年纪相加,然后FirstName通过--->加起来 + oldVal.setAge(oldVal.getAge() + newVal.getAge()); + oldVal.setFirstName(oldVal + .getFirstName() + .concat("--->") + .concat(newVal.getFirstName())); + return oldVal; + }, + LinkedHashMap::new + ) + ); + // 这样打印出的map元素不好观察 +// System.out.println(collect); +// collect.entrySet().forEach(System.out::println); + + LinkedHashMap sortedCollect = collect + .entrySet() + .stream() + .sorted((a, b) -> b.getKey().compareTo(a.getKey())) + .collect( + Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + // 上面已经对重复key做处理了,这里就直接范围oldVal就行 + (oldVal, newVal) -> oldVal, + LinkedHashMap::new + ) + ); + + // 根据日期排序 + sortedCollect.entrySet() + .forEach(System.out::println); + } + public static Date getDate(String date) throws Exception { return format.parse(date); } From 9e01a70c8da658f4115984b31c0faa64e4ad1953 Mon Sep 17 00:00:00 2001 From: Bruis Date: Mon, 26 Apr 2021 10:44:47 +0800 Subject: [PATCH 13/68] =?UTF-8?q?[A]=20jdk=E9=9D=99=E6=80=81=E3=80=81?= =?UTF-8?q?=E5=8A=A8=E6=80=81dialing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dynamicproxy/DemoInvokerHandler.java | 53 +++++++++++++++++++ .../proxy/staticproxy/JdkStaticProxy.java | 16 ++++++ .../proxy/staticproxy/RealSubject.java | 10 ++++ .../learnjava/proxy/staticproxy/Subject.java | 5 ++ .../proxy/staticproxy/SubjectProxy.java | 22 ++++++++ 5 files changed, 106 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/proxy/dynamicproxy/DemoInvokerHandler.java create mode 100644 JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/JdkStaticProxy.java create mode 100644 JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/RealSubject.java create mode 100644 JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/Subject.java create mode 100644 JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/SubjectProxy.java diff --git a/JdkLearn/src/main/java/com/learnjava/proxy/dynamicproxy/DemoInvokerHandler.java b/JdkLearn/src/main/java/com/learnjava/proxy/dynamicproxy/DemoInvokerHandler.java new file mode 100644 index 0000000..c04119e --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/proxy/dynamicproxy/DemoInvokerHandler.java @@ -0,0 +1,53 @@ +package com.learnjava.proxy.dynamicproxy; + +import com.learnjava.proxy.staticproxy.RealSubject; +import com.learnjava.proxy.staticproxy.Subject; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * @author bruis + * + * jdk动态代理 + * + */ +public class DemoInvokerHandler implements InvocationHandler { + + // 真正的业务对象 + private Object realSubject; + + public DemoInvokerHandler(Object realSubject) { + this.realSubject = realSubject; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("代理预处理操作"); + + // 调用真正的代理对象逻辑 + Object result = method.invoke(realSubject, args); + + System.out.println("代理后处理操作"); + return result; + } + + /** + * 创建代理对象并返回 + * @return + */ + public Object getProxy() { + return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), + realSubject.getClass().getInterfaces(), this); + } + + public static void main(String[] args) { + RealSubject realSubject = new RealSubject(); + DemoInvokerHandler invokerHandler = new DemoInvokerHandler(realSubject); + Subject proxy = (Subject) invokerHandler.getProxy(); + + // 拿到业务对象,执行业务逻辑,此时业务逻辑已经被代理对象代理了 + proxy.operation(); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/JdkStaticProxy.java b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/JdkStaticProxy.java new file mode 100644 index 0000000..885687d --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/JdkStaticProxy.java @@ -0,0 +1,16 @@ +package com.learnjava.proxy.staticproxy; + +/** + * @author bruis + * + * JDK静态代理 + * + * 特点: + * 1. 静态代理模式需要在编译模式为每个业务类创建代理类Proxy,当需要代理的类很多时,就会出现大量的Proxy类 + * + */ +public class JdkStaticProxy { + + + +} diff --git a/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/RealSubject.java b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/RealSubject.java new file mode 100644 index 0000000..600ccc1 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/RealSubject.java @@ -0,0 +1,10 @@ +package com.learnjava.proxy.staticproxy; + +public class RealSubject implements Subject { + + @Override + public void operation() { + System.out.println("这是真正的业务类"); + } + +} diff --git a/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/Subject.java b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/Subject.java new file mode 100644 index 0000000..d48cf48 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/Subject.java @@ -0,0 +1,5 @@ +package com.learnjava.proxy.staticproxy; + +public interface Subject { + public void operation(); +} diff --git a/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/SubjectProxy.java b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/SubjectProxy.java new file mode 100644 index 0000000..f151e73 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/proxy/staticproxy/SubjectProxy.java @@ -0,0 +1,22 @@ +package com.learnjava.proxy.staticproxy; + +public class SubjectProxy implements Subject { + + private RealSubject realSubject; + + public SubjectProxy() { + realSubject = new RealSubject(); + } + + @Override + public void operation() { + System.out.println("代理预处理逻辑"); + realSubject.operation(); + System.out.println("代理后处理逻辑"); + } + + public static void main(String[] args) { + SubjectProxy proxy = new SubjectProxy(); + proxy.operation(); + } +} From b81101d9e499c5ea1ccf7f6048375fc48a1585f3 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 23 May 2021 10:40:41 +0800 Subject: [PATCH 14/68] add netty demo --- JdkLearn/pom.xml | 7 ++ .../{nettysource => io/netty/bio}/Client.java | 2 +- .../netty/bio}/ClientHandler.java | 2 +- .../{nettysource => io/netty/bio}/Server.java | 2 +- .../netty/bio}/ServerBoot.java | 2 +- .../com/learnjava/io/netty/demo01/Server.java | 53 +++++++++++++ .../io/netty/demo01/ServerHandler.java | 74 +++++++++++++++++++ .../learnjava/io/nio/demo01/NioClinet.java | 40 ++++++++++ .../learnjava/io/nio/demo01/NioServer.java | 57 ++++++++++++++ .../com/learnjava/lambda/LambdaMapDemo.java | 17 +++-- 10 files changed, 245 insertions(+), 11 deletions(-) rename JdkLearn/src/main/java/com/learnjava/{nettysource => io/netty/bio}/Client.java (97%) rename JdkLearn/src/main/java/com/learnjava/{nettysource => io/netty/bio}/ClientHandler.java (96%) rename JdkLearn/src/main/java/com/learnjava/{nettysource => io/netty/bio}/Server.java (96%) rename JdkLearn/src/main/java/com/learnjava/{nettysource => io/netty/bio}/ServerBoot.java (84%) create mode 100644 JdkLearn/src/main/java/com/learnjava/io/netty/demo01/Server.java create mode 100644 JdkLearn/src/main/java/com/learnjava/io/netty/demo01/ServerHandler.java create mode 100644 JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioClinet.java create mode 100644 JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioServer.java diff --git a/JdkLearn/pom.xml b/JdkLearn/pom.xml index d196fc9..d44e0fb 100644 --- a/JdkLearn/pom.xml +++ b/JdkLearn/pom.xml @@ -20,6 +20,13 @@ + + + io.netty + netty-all + 4.1.6.Final + + org.springframework.boot diff --git a/JdkLearn/src/main/java/com/learnjava/nettysource/Client.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Client.java similarity index 97% rename from JdkLearn/src/main/java/com/learnjava/nettysource/Client.java rename to JdkLearn/src/main/java/com/learnjava/io/netty/bio/Client.java index 5514bee..f84b58e 100644 --- a/JdkLearn/src/main/java/com/learnjava/nettysource/Client.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Client.java @@ -1,4 +1,4 @@ -package com.learnjava.nettysource; +package com.learnjava.io.netty.bio; import java.io.IOException; import java.net.Socket; diff --git a/JdkLearn/src/main/java/com/learnjava/nettysource/ClientHandler.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ClientHandler.java similarity index 96% rename from JdkLearn/src/main/java/com/learnjava/nettysource/ClientHandler.java rename to JdkLearn/src/main/java/com/learnjava/io/netty/bio/ClientHandler.java index d0ddba9..d2d6b88 100644 --- a/JdkLearn/src/main/java/com/learnjava/nettysource/ClientHandler.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ClientHandler.java @@ -1,4 +1,4 @@ -package com.learnjava.nettysource; +package com.learnjava.io.netty.bio; import java.io.IOException; import java.io.InputStream; diff --git a/JdkLearn/src/main/java/com/learnjava/nettysource/Server.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java similarity index 96% rename from JdkLearn/src/main/java/com/learnjava/nettysource/Server.java rename to JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java index 834f41b..92ac5b2 100644 --- a/JdkLearn/src/main/java/com/learnjava/nettysource/Server.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java @@ -1,4 +1,4 @@ -package com.learnjava.nettysource; +package com.learnjava.io.netty.bio; import java.io.IOException; import java.net.ServerSocket; diff --git a/JdkLearn/src/main/java/com/learnjava/nettysource/ServerBoot.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java similarity index 84% rename from JdkLearn/src/main/java/com/learnjava/nettysource/ServerBoot.java rename to JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java index 9348e09..d67e55d 100644 --- a/JdkLearn/src/main/java/com/learnjava/nettysource/ServerBoot.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java @@ -1,4 +1,4 @@ -package com.learnjava.nettysource; +package com.learnjava.io.netty.bio; /** diff --git a/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/Server.java b/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/Server.java new file mode 100644 index 0000000..7c1d994 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/Server.java @@ -0,0 +1,53 @@ +package com.learnjava.io.netty.demo01; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.AttributeKey; + +/** + * @author lhy + * @date 2021/5/21 + */ +public class Server { + + public static void main(String[] args) throws Exception { + + /** + * EventLoopGroup: + * NioEventLoopGruop + * NioEventLoop + */ + + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap bootstrap = new ServerBootstrap(); + bootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.TCP_NODELAY, true) + .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") + .handler(new ServerHandler()) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { +// ch.pipeline().addLast(new AuthHandler()); + //.. + + } + }); + + ChannelFuture future = bootstrap.bind(8888).sync(); + + future.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/ServerHandler.java b/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/ServerHandler.java new file mode 100644 index 0000000..7123116 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/demo01/ServerHandler.java @@ -0,0 +1,74 @@ +package com.learnjava.io.netty.demo01; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author lhy + * @date 2021/5/22 + */ +public class ServerHandler extends ChannelInboundHandlerAdapter { + public ServerHandler() { + super(); + } + + @Override + public void channelRegistered(ChannelHandlerContext ctx) throws Exception { + super.channelRegistered(ctx); + } + + @Override + public void channelUnregistered(ChannelHandlerContext ctx) throws Exception { + super.channelUnregistered(ctx); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + super.channelActive(ctx); + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + super.channelInactive(ctx); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + super.channelRead(ctx, msg); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { + super.channelReadComplete(ctx); + } + + @Override + public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { + super.userEventTriggered(ctx, evt); + } + + @Override + public void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception { + super.channelWritabilityChanged(ctx); + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + super.exceptionCaught(ctx, cause); + } + + @Override + public boolean isSharable() { + return super.isSharable(); + } + + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + super.handlerAdded(ctx); + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + super.handlerRemoved(ctx); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioClinet.java b/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioClinet.java new file mode 100644 index 0000000..aab903b --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioClinet.java @@ -0,0 +1,40 @@ +package com.learnjava.io.nio.demo01; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; +import java.util.Date; +import java.util.Scanner; + +/** + * @author lhy + * @date 2021/5/22 + */ +public class NioClinet { + + public static void main(String[] args) throws Exception { + + // 获取通道 + SocketChannel channel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9999)); + // 切换至非阻塞模式 + channel.configureBlocking(false); + // 分配缓冲区大小 + ByteBuffer buffer = ByteBuffer.allocate(1024); + + Scanner scan = new Scanner(System.in); + + while (scan.hasNext()) { + String next = scan.next(); + // 向缓冲区里写入数据 + buffer.put( (new Date().toString() + "\n" + next).getBytes()); + buffer.flip(); + + // 向通道里写入带有数据的缓冲区对象, 表示向服务器发送数据 + channel.write( buffer); + buffer.clear(); + } + + // 关闭通道 + channel.close(); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioServer.java b/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioServer.java new file mode 100644 index 0000000..7ea41ec --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/io/nio/demo01/NioServer.java @@ -0,0 +1,57 @@ +package com.learnjava.io.nio.demo01; + +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; + +/** + * @author lhy + * @date 2021/5/22 + */ +public class NioServer { + public static void main(String[] args) throws Exception { + // 获取服务端通道 + ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); + // 切换为非阻塞模式 + serverSocketChannel.configureBlocking(false); + // 绑定链接 + Selector selector = Selector.open(); + // 将通道注册在selector上,并绑定为读事件 + serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); + // 选择器轮训,阻塞 + while (selector.select() > 0) { + Iterator it = selector.selectedKeys().iterator(); + + // 判断是否有事件进来 + while (it.hasNext()) { + // 获取就绪的事件 + SelectionKey selectionKey = it.next(); + + // 读事件 + if (selectionKey.isAcceptable()) { + // 就绪的客户端连接事件 + SocketChannel acceptChannel = serverSocketChannel.accept(); + acceptChannel.configureBlocking(false); + acceptChannel.register(selector, SelectionKey.OP_READ); + } else if (selectionKey.isReadable()) { + // 读就绪事件 + SocketChannel readAcceptChannel = serverSocketChannel.accept(); + ByteBuffer allocateBuffer = ByteBuffer.allocate(1024); + + int len = 0; + while ((len = readAcceptChannel.read(allocateBuffer)) > 0) { + allocateBuffer.flip(); + System.out.println(new String(allocateBuffer.array(), 0, len)); + allocateBuffer.clear(); + } + } + } + + // 取消选择键selectionKey + it.remove(); + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java index ef7b2be..f158fb0 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java @@ -16,8 +16,8 @@ public class LambdaMapDemo { public static void main(String[] args) { // test01(); // test02(); -// test03(); - test04(); + test03(); +// test04(); } /** @@ -58,11 +58,14 @@ public static void test02() { */ public static void test03() { Map codes = new HashMap<>(); - codes.put("2021-04-01", 1); - codes.put("2021-04-15", 49); - codes.put("2021-04-10", 33); - codes.put("2021-04-05", 86); - codes.put("2021-04-20", 92); + codes.put("2021-03", 1); + codes.put("2021-02", 49); + codes.put("2021-05", 33); +// codes.put("2021-04-01", 1); +// codes.put("2021-04-15", 49); +// codes.put("2021-04-10", 33); +// codes.put("2021-04-05", 86); +// codes.put("2021-04-20", 92); // 先将Map转化为List,通过collect处理后再转为Map Map sortedMap = codes.entrySet() From fa8ab0229121668607a797f420330e166ede4511 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 4 Jul 2021 23:06:26 +0800 Subject: [PATCH 15/68] add netty channelPipeline demo --- Spring-Netty/learnnetty.iml | 2 +- Spring-Netty/pom.xml | 2 +- .../channelpipeline/BusinessException.java | 8 ++++ .../channelpipeline/InBoundHandlerA.java | 16 +++++++ .../channelpipeline/InBoundHandlerB.java | 20 ++++++++ .../channelpipeline/InBoundHandlerC.java | 16 +++++++ .../channelpipeline/OutBoundHandlerA.java | 17 +++++++ .../channelpipeline/OutBoundHandlerB.java | 27 +++++++++++ .../channelpipeline/OutBoundHandlerC.java | 18 +++++++ .../netty/channelpipeline/Server.java | 48 +++++++++++++++++++ 10 files changed, 172 insertions(+), 2 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/BusinessException.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerA.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerB.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerC.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerA.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerB.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerC.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/Server.java diff --git a/Spring-Netty/learnnetty.iml b/Spring-Netty/learnnetty.iml index c0fa6ab..3dc1096 100644 --- a/Spring-Netty/learnnetty.iml +++ b/Spring-Netty/learnnetty.iml @@ -92,6 +92,6 @@ - + \ No newline at end of file diff --git a/Spring-Netty/pom.xml b/Spring-Netty/pom.xml index 3cfc328..14ee73a 100644 --- a/Spring-Netty/pom.xml +++ b/Spring-Netty/pom.xml @@ -16,7 +16,7 @@ 1.8 - 4.1.42.Final + 4.1.6.Final diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/BusinessException.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/BusinessException.java new file mode 100644 index 0000000..e9e5caf --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/BusinessException.java @@ -0,0 +1,8 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +public class BusinessException extends Exception { + + public BusinessException(String message) { + super(message); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerA.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerA.java new file mode 100644 index 0000000..31004a3 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerA.java @@ -0,0 +1,16 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author + */ +public class InBoundHandlerA extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerA: " + msg); + ctx.fireChannelRead(msg); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerB.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerB.java new file mode 100644 index 0000000..270d84f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerB.java @@ -0,0 +1,20 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author + */ +public class InBoundHandlerB extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerB: " + msg); + ctx.fireChannelRead(msg); + } + + @Override + public void channelActive(ChannelHandlerContext ctx) { + ctx.channel().pipeline().fireChannelRead("hello world"); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerC.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerC.java new file mode 100644 index 0000000..e4dcd7e --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/InBoundHandlerC.java @@ -0,0 +1,16 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.util.ReferenceCountUtil; + +/** + * @author + */ +public class InBoundHandlerC extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerC: " + msg); + ctx.fireChannelRead(msg); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerA.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerA.java new file mode 100644 index 0000000..4711fd5 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerA.java @@ -0,0 +1,17 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelPromise; + +/** + * @author + */ +public class OutBoundHandlerA extends ChannelOutboundHandlerAdapter { + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerA: " + msg); + ctx.write(msg, promise); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerB.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerB.java new file mode 100644 index 0000000..05a74fd --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerB.java @@ -0,0 +1,27 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelPromise; + +import java.util.concurrent.TimeUnit; + +/** + * @author + */ +public class OutBoundHandlerB extends ChannelOutboundHandlerAdapter { + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerB: " + msg); + ctx.write(msg, promise); + } + + + @Override + public void handlerAdded(final ChannelHandlerContext ctx) { + ctx.executor().schedule(() -> { + ctx.channel().write("ctx.channel().write -> hello world"); + ctx.write("hello world"); + }, 3, TimeUnit.SECONDS); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerC.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerC.java new file mode 100644 index 0000000..6b49e11 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/OutBoundHandlerC.java @@ -0,0 +1,18 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelOutboundHandlerAdapter; +import io.netty.channel.ChannelPromise; + +/** + * @author + */ +public class OutBoundHandlerC extends ChannelOutboundHandlerAdapter { + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerC: " + msg); + ctx.write(msg, promise); +// throw new BusinessException("from OutBoundHandlerC"); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/Server.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/Server.java new file mode 100644 index 0000000..dbcd6f7 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/channelpipeline/Server.java @@ -0,0 +1,48 @@ +package com.bruis.learnnetty.netty.channelpipeline; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.util.AttributeKey; + +/** + * @author + */ +public final class Server { + + public static void main(String[] args) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.TCP_NODELAY, true) + .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new OutBoundHandlerA()); + ch.pipeline().addLast(new OutBoundHandlerB()); + ch.pipeline().addLast(new OutBoundHandlerC()); +// ch.pipeline().addLast(new InBoundHandlerA()); +// ch.pipeline().addLast(new InBoundHandlerB()); +// ch.pipeline().addLast(new InBoundHandlerC()); + } + }); + + ChannelFuture f = b.bind(8888).sync(); + + f.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} \ No newline at end of file From f663c8b85ff96c4f15d54ce5cabe3bbc05cce1ee Mon Sep 17 00:00:00 2001 From: Bruis Date: Sat, 10 Jul 2021 23:08:25 +0800 Subject: [PATCH 16/68] add RocketMQ demo --- .gitignore | 2 + README.md | 8 ++- rocketmqdemo/pom.xml | 47 +++++++++++++ .../rocketmqdemo/RocketmqdemoApplication.java | 13 ++++ .../bruis/rocketmqdemo/demo01/Consumer.java | 67 +++++++++++++++++++ .../bruis/rocketmqdemo/demo01/Producer.java | 45 +++++++++++++ .../src/main/resources/application.properties | 1 + .../RocketmqdemoApplicationTests.java | 13 ++++ 8 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 rocketmqdemo/pom.xml create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/RocketmqdemoApplication.java create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Consumer.java create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java create mode 100644 rocketmqdemo/src/main/resources/application.properties create mode 100644 rocketmqdemo/src/test/java/com/bruis/rocketmqdemo/RocketmqdemoApplicationTests.java diff --git a/.gitignore b/.gitignore index 92966c2..3540bb2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ Spring-Netty/Spring-Netty.iml Spring-Netty/learnnetty.iml Spring-Security/SpringSecurityDemo.iml Spring-Security/springsecurity.iml +rocketmqdemo/rocketmqdemo.iml # target JdkLearn/target @@ -18,6 +19,7 @@ Spring-AOP/target Spring-Boot/target Spring-Netty/target Spring-Security/target +rocketmqdemo/target # .DO_Store .DS_Store diff --git a/README.md b/README.md index e81f9d9..cba1d05 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,9 @@ Java流行框架源码分析,学习以及总结。项目持续更新中,不 ✅ Dubbo源码 -Netty源码 +✅ Netty源码 + +✅ RocketMQ源码 MyBatis源码 @@ -120,6 +122,10 @@ SpringCloud源码 - Dubbo底层源码学习(五)—— Dubbo的注册中心重试机制 - [Dubbo底层源码学习(六)—— Dubbo的服务暴露](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Dubbo/Dubbo%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E2%80%94%E2%80%94%E6%9C%8D%E5%8A%A1%E6%9A%B4%E9%9C%B2.md) - Dubbo底层源码学习(七)—— Dubbo的服务消费 + +- Netty底层源码解析 + +- RocketMQ底层源码解析 持续更新中... diff --git a/rocketmqdemo/pom.xml b/rocketmqdemo/pom.xml new file mode 100644 index 0000000..1b307fd --- /dev/null +++ b/rocketmqdemo/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + com.bruis + rocketmqdemo + 0.0.1-SNAPSHOT + rocketmqdemo + rocketmqdemo + + 1.8 + 4.9.0 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.apache.rocketmq + rocketmq-client + ${rocketmq.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/RocketmqdemoApplication.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/RocketmqdemoApplication.java new file mode 100644 index 0000000..f187f13 --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/RocketmqdemoApplication.java @@ -0,0 +1,13 @@ +package com.bruis.rocketmqdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RocketmqdemoApplication { + + public static void main(String[] args) { + SpringApplication.run(RocketmqdemoApplication.class, args); + } + +} diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Consumer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Consumer.java new file mode 100644 index 0000000..554c16a --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Consumer.java @@ -0,0 +1,67 @@ +package com.bruis.rocketmqdemo.demo01; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.remoting.common.RemotingHelper; + +import java.util.List; + +/** + * @author lhy + * + * 普通消费者 + * + * @date 2021/7/10 + */ +public class Consumer { + + public static final String DEMO01_CONSUMER_GROUP_NAME = "demo01_consumer_group_name"; + + public static void main(String[] args) throws Exception { + + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(DEMO01_CONSUMER_GROUP_NAME); + consumer.setNamesrvAddr(Producer.NAMESRV_ADDRESS); + // 从哪开始进行消费 + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); + consumer.subscribe(Producer.TOPIC_NAME,"*"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + MessageExt messageExt = msgs.get(0); + try { + String topic = messageExt.getTopic(); + String tags = messageExt.getTags(); + String keys = messageExt.getKeys(); + + if ("keyDuplicate".equals(keys)) { + System.err.println("消息消费失败"); + int a = 1 / 0; + } + + String msgBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET); + System.err.println("topic: " + topic + ",tags: " + tags + ", keys: " + keys + ",body: " + msgBody); + } catch (Exception e) { + e.printStackTrace(); + // 消费次数 +// int reconsumeTimes = messageExt.getReconsumeTimes(); +// System.err.println("reconsumeTimes: " + reconsumeTimes); +// // 重试三次 +// if (reconsumeTimes == 3) { +// // 日志记录 +// // 重试补偿成功 +// return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; +// } + return ConsumeConcurrentlyStatus.RECONSUME_LATER; + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + + consumer.start(); + System.err.println("Consumer start ...."); + } +} diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java new file mode 100644 index 0000000..4babcfb --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java @@ -0,0 +1,45 @@ +package com.bruis.rocketmqdemo.demo01; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.Message; + +/** + * @author lhy + * + * 普通生产者 + * + * @date 2021/7/10 + */ +public class Producer { + + public static final String NAMESRV_ADDRESS = "127.0.0.1:9876"; + + // 生产者组 + public static final String DEMO01_PRODUCER_GROUP_NAME = "demo01_producer_group_name"; + + // topic + public static final String TOPIC_NAME = "demo01_topic"; + + public static void main(String[] args) throws Exception { + // 指定生产者组名称 + DefaultMQProducer producer = new DefaultMQProducer(DEMO01_PRODUCER_GROUP_NAME); + producer.setNamesrvAddr(NAMESRV_ADDRESS); + + producer.start(); + + for (int i = 0; i < 5; i++) { + Message message = new Message(TOPIC_NAME,// topic + "TagA",//tag + "key" + i,//keys + ("Hello world RocketMQ Demo01" + i).getBytes()); + + // 向broker发送消息 + SendResult sendResult = producer.send(message); + System.out.printf("%s%n", sendResult); + } + + producer.shutdown(); + } + +} diff --git a/rocketmqdemo/src/main/resources/application.properties b/rocketmqdemo/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/rocketmqdemo/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/rocketmqdemo/src/test/java/com/bruis/rocketmqdemo/RocketmqdemoApplicationTests.java b/rocketmqdemo/src/test/java/com/bruis/rocketmqdemo/RocketmqdemoApplicationTests.java new file mode 100644 index 0000000..f1c73b4 --- /dev/null +++ b/rocketmqdemo/src/test/java/com/bruis/rocketmqdemo/RocketmqdemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.bruis.rocketmqdemo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class RocketmqdemoApplicationTests { + + @Test + void contextLoads() { + } + +} From c64785d19964836bbf9dd08c38a5d32b240617a0 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 11 Jul 2021 22:46:56 +0800 Subject: [PATCH 17/68] =?UTF-8?q?[A]=20rocketmq=20=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../bruis/rocketmqdemo/demo01/Producer.java | 2 +- .../bruis/rocketmqdemo/demo02/Consumer.java | 67 +++++++++++++++++++ .../bruis/rocketmqdemo/demo02/Producer.java | 54 +++++++++++++++ 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Consumer.java create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Producer.java diff --git a/README.md b/README.md index cba1d05..d3c65e7 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,8 @@ SpringCloud源码 - [二进制运算以及源码、反码以及补码学习](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/%E4%BA%8C%E8%BF%9B%E5%88%B6.md) - [Netty源码包结构](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E6%BA%90%E7%A0%81%E5%8C%85%E7%BB%93%E6%9E%84.md) - [Netty中的EventLoopGroup](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E4%B8%AD%E7%9A%84EventLoopGroup%E6%98%AF%E4%BB%80%E4%B9%88.md) + - [Netty中的ChannelPipeline]() + - [Netty中的内存分配]() - SpringSecurity&OAuth2源码学习 - SpringSecurity版本:5.1.0.RELEASE @@ -122,8 +124,6 @@ SpringCloud源码 - Dubbo底层源码学习(五)—— Dubbo的注册中心重试机制 - [Dubbo底层源码学习(六)—— Dubbo的服务暴露](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Dubbo/Dubbo%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E2%80%94%E2%80%94%E6%9C%8D%E5%8A%A1%E6%9A%B4%E9%9C%B2.md) - Dubbo底层源码学习(七)—— Dubbo的服务消费 - -- Netty底层源码解析 - RocketMQ底层源码解析 diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java index 4babcfb..b1c533f 100644 --- a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo01/Producer.java @@ -34,7 +34,7 @@ public static void main(String[] args) throws Exception { "key" + i,//keys ("Hello world RocketMQ Demo01" + i).getBytes()); - // 向broker发送消息 + // 向broker发送消息============================> 同步发送 SendResult sendResult = producer.send(message); System.out.printf("%s%n", sendResult); } diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Consumer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Consumer.java new file mode 100644 index 0000000..e1f74ae --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Consumer.java @@ -0,0 +1,67 @@ +package com.bruis.rocketmqdemo.demo02; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.message.MessageExt; +import org.apache.rocketmq.remoting.common.RemotingHelper; + +import java.util.List; + +/** + * @author lhy + * + * 普通消费者 + * + * @date 2021/7/10 + */ +public class Consumer { + + public static final String DEMO01_CONSUMER_GROUP_NAME = "demo02_consumer_group_name"; + + public static void main(String[] args) throws Exception { + + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(DEMO01_CONSUMER_GROUP_NAME); + consumer.setNamesrvAddr(Producer.NAMESRV_ADDRESS); + // 从哪开始进行消费 + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); + consumer.subscribe(Producer.TOPIC_NAME,"*"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + MessageExt messageExt = msgs.get(0); + try { + String topic = messageExt.getTopic(); + String tags = messageExt.getTags(); + String keys = messageExt.getKeys(); + + if ("keyDuplicate".equals(keys)) { + System.err.println("消息消费失败"); + int a = 1 / 0; + } + + String msgBody = new String(messageExt.getBody(), RemotingHelper.DEFAULT_CHARSET); + System.err.println("topic: " + topic + ",tags: " + tags + ", keys: " + keys + ",body: " + msgBody); + } catch (Exception e) { + e.printStackTrace(); + // 消费次数 +// int reconsumeTimes = messageExt.getReconsumeTimes(); +// System.err.println("reconsumeTimes: " + reconsumeTimes); +// // 重试三次 +// if (reconsumeTimes == 3) { +// // 日志记录 +// // 重试补偿成功 +// return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; +// } + return ConsumeConcurrentlyStatus.RECONSUME_LATER; + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + + consumer.start(); + System.err.println("Consumer start ...."); + } +} diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Producer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Producer.java new file mode 100644 index 0000000..1163545 --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo02/Producer.java @@ -0,0 +1,54 @@ +package com.bruis.rocketmqdemo.demo02; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendCallback; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.Message; + +/** + * @author lhy + * + * 普通生产者(异步方式发送) + * + * @date 2021/7/10 + */ +public class Producer { + + public static final String NAMESRV_ADDRESS = "127.0.0.1:9876"; + + // 生产者组 + public static final String DEMO01_PRODUCER_GROUP_NAME = "demo02_producer_group_name"; + + // topic + public static final String TOPIC_NAME = "demo02_topic"; + + public static void main(String[] args) throws Exception { + // 指定生产者组名称 + DefaultMQProducer producer = new DefaultMQProducer(DEMO01_PRODUCER_GROUP_NAME); + producer.setNamesrvAddr(NAMESRV_ADDRESS); + + producer.start(); + + for (int i = 0; i < 5; i++) { + Message message = new Message(TOPIC_NAME,// topic + "TagA",//tag + "key" + i,//keys + ("Hello world RocketMQ Demo01" + i).getBytes()); + + // 向broker发送消息 + producer.send(message, new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + System.out.printf("msgId: " + sendResult.getMsgId() + ", status: " + sendResult.getSendStatus()); + } + + @Override + public void onException(Throwable e) { + e.printStackTrace(); + System.err.println("==============发送失败"); + } + }); + } + } + +} From 283da8a7d29f5fc4e6cce3f32a3d1e5b798b3910 Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 14 Jul 2021 00:11:58 +0800 Subject: [PATCH 18/68] add Netty/FastThreadLocalDmeo --- .../fastthreadlocal/FastThreadLocalTest.java | 61 +++++++++++++++++++ .../{demo01 => quickstart}/NettyClient.java | 2 +- .../NettyClientHandler.java | 2 +- .../NettyServerHandler.java | 5 +- .../netty/{demo01 => quickstart}/Server.java | 2 +- 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java rename Spring-Netty/src/main/java/com/bruis/learnnetty/netty/{demo01 => quickstart}/NettyClient.java (97%) rename Spring-Netty/src/main/java/com/bruis/learnnetty/netty/{demo01 => quickstart}/NettyClientHandler.java (98%) rename Spring-Netty/src/main/java/com/bruis/learnnetty/netty/{demo01 => quickstart}/NettyServerHandler.java (96%) rename Spring-Netty/src/main/java/com/bruis/learnnetty/netty/{demo01 => quickstart}/Server.java (98%) diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java new file mode 100644 index 0000000..2a0349f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java @@ -0,0 +1,61 @@ +package com.bruis.learnnetty.netty.fastthreadlocal; + +import io.netty.util.concurrent.FastThreadLocal; + +/** + * FastThreadLocal测试类 + * + * @author lhy + * @date 2021/7/13 + */ +public class FastThreadLocalTest { + + /** + * FastThreadLocal对象1 + */ + private static FastThreadLocal threadLocal0 = new FastThreadLocal() { + @Override + protected Object initialValue() throws Exception { + Object o = new Object(); + System.out.println("threadLocal0 initialValue: " + o); + return o; + } + + @Override + protected void onRemoval(Object value) throws Exception { + System.out.println("onRemoval"); + } + }; + + private static FastThreadLocal threadLocal1 = new FastThreadLocal() { + @Override + protected Object initialValue() throws Exception { + Object o = new Object(); + System.out.println("threadLocal1 initialValue: " + o); + return o; + } + }; + + public static void main(String[] args) { + new Thread(() -> { + Object object0 = threadLocal0.get(); + System.out.println(Thread.currentThread().getName() + "---> " + object0); + + threadLocal0.set(new Object()); + }) .start(); + + new Thread(() -> { + Object object0 = threadLocal0.get(); + System.out.println(Thread.currentThread().getName() + "---> " + object0); + + while (true) { + System.out.println(Thread.currentThread().getName() + "---> " + (threadLocal0.get() == object0)); + try { + Thread.sleep(1000); + } catch (Exception e) { + e.printStackTrace(); + } + } + }).start(); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClient.java similarity index 97% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClient.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClient.java index f429e99..db6994b 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClient.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClient.java @@ -1,4 +1,4 @@ -package com.bruis.learnnetty.netty.demo01; +package com.bruis.learnnetty.netty.quickstart; import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClientHandler.java similarity index 98% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClientHandler.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClientHandler.java index f777499..976fdda 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyClientHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyClientHandler.java @@ -1,4 +1,4 @@ -package com.bruis.learnnetty.netty.demo01; +package com.bruis.learnnetty.netty.quickstart; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyServerHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyServerHandler.java similarity index 96% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyServerHandler.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyServerHandler.java index 9d131fa..b7a9d04 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/NettyServerHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/NettyServerHandler.java @@ -1,11 +1,8 @@ -package com.bruis.learnnetty.netty.demo01; +package com.bruis.learnnetty.netty.quickstart; -import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; -import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.ChannelPipeline; import io.netty.util.CharsetUtil; import java.util.concurrent.TimeUnit; diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/Server.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/Server.java similarity index 98% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/Server.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/Server.java index a3f99d2..3adeabc 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/demo01/Server.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/quickstart/Server.java @@ -1,4 +1,4 @@ -package com.bruis.learnnetty.netty.demo01; +package com.bruis.learnnetty.netty.quickstart; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; From 7e5e520481d44dfa7a6dad31b40166c9f8389c3b Mon Sep 17 00:00:00 2001 From: Bruis Date: Thu, 15 Jul 2021 21:56:37 +0800 Subject: [PATCH 19/68] add FastThreadLocalTest --- .../fastthreadlocal/FastThreadLocalTest.java | 17 +++++---- .../fastthreadlocal/ThreadLocalTest.java | 38 +++++++++++++++++++ 2 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/ThreadLocalTest.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java index 2a0349f..ec00911 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/FastThreadLocalTest.java @@ -48,14 +48,15 @@ public static void main(String[] args) { Object object0 = threadLocal0.get(); System.out.println(Thread.currentThread().getName() + "---> " + object0); - while (true) { - System.out.println(Thread.currentThread().getName() + "---> " + (threadLocal0.get() == object0)); - try { - Thread.sleep(1000); - } catch (Exception e) { - e.printStackTrace(); - } - } + System.out.println(Thread.currentThread().getName() + "---> " + (threadLocal0.get() == object0)); +// while (true) { +// System.out.println(Thread.currentThread().getName() + "---> " + (threadLocal0.get() == object0)); +// try { +// Thread.sleep(1000); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// } }).start(); } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/ThreadLocalTest.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/ThreadLocalTest.java new file mode 100644 index 0000000..11b1b33 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/fastthreadlocal/ThreadLocalTest.java @@ -0,0 +1,38 @@ +package com.bruis.learnnetty.netty.fastthreadlocal; + +/** + * @author lhy + * @date 2021/7/14 + */ +public class ThreadLocalTest { + + private static ThreadLocal threadLocal0 = new ThreadLocal<>(); + + private static ThreadLocal threadLocal1 = new ThreadLocal<>(); + + public static void main(String[] args) { + // 线程外 + System.out.println("main线程1: " + threadLocal0.get()); + Object o = new Object(); + threadLocal0.set(o); + + new Thread(() -> { + Object threadObject = threadLocal0.get(); + System.out.println("线程内: " + threadObject); + if (threadObject == null) { + Object newObject = new Object(); + System.out.println("新new一个对象:" + newObject); + threadLocal0.set(newObject); + } + try { + Thread.sleep(1000); + System.out.println("休眠了一秒"); + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("线程内,从ThreadLocal获取:" + threadLocal0.get()); + }).start(); + + System.out.println("main线程2: " + threadLocal0.get()); + } +} From 127f829f6003fee559113e31eeb59acadcf779aa Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 16 Jul 2021 23:32:28 +0800 Subject: [PATCH 20/68] fix --- JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java | 2 +- .../src/main/java/com/learnjava/io/netty/bio/ServerBoot.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java index 92ac5b2..af55558 100644 --- a/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/Server.java @@ -30,7 +30,7 @@ public void run() { } public void doStart() { - while (true) { + for (;;) { try { Socket client = serverSocket.accept(); new ClientHandler(client).start(); diff --git a/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java index d67e55d..bbb2762 100644 --- a/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java +++ b/JdkLearn/src/main/java/com/learnjava/io/netty/bio/ServerBoot.java @@ -9,6 +9,6 @@ public class ServerBoot { public static void main(String[] args) { Server server = new Server(PORT); - + server.start(); } } From fb0272c1d7d6176feb198bd74e99af4cd1490ec3 Mon Sep 17 00:00:00 2001 From: Bruis Date: Mon, 19 Jul 2021 23:38:34 +0800 Subject: [PATCH 21/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8A=80=E5=B7=A7=E6=80=BB=E7=BB=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learnjava/optimization/OptimizeDemo.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java new file mode 100644 index 0000000..108490d --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java @@ -0,0 +1,40 @@ +package com.learnjava.optimization; + +import java.util.HashMap; +import java.util.Map; + +/** + * + * 代码优化技巧总结 + * + * @author lhy + * @date 2021/7/19 + */ +public class OptimizeDemo { + public static void main(String[] args) { + Map map = new HashMap<>(); + mergeData(map); + } + + /** + * 对于通过map来聚合数据(非Lambda方式) + * @param map + */ + public static void mergeData(Map map) { + String key = "mapKey"; + int value = 1; + // 普通方式 + if (map.containsKey(key)) { + map.put(key, map.get(key) + value); + } else { + map.put(key,value); + } + + // 简洁方式 + Integer mapValue = map.get(key); + if (null != mapValue) { + mapValue += value; + } + map.put(key, mapValue); + } +} From daa79eab5830a6700836fcb849279c706b036a58 Mon Sep 17 00:00:00 2001 From: Bruis Date: Tue, 20 Jul 2021 11:22:53 +0800 Subject: [PATCH 22/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0lambda=20mapMerge?= =?UTF-8?q?=E4=BE=8B=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/learnjava/lambda/LambdaMapDemo.java | 2 +- .../com/learnjava/lambda/LambdaMapMerge.java | 58 +++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapMerge.java diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java index f158fb0..299b362 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java @@ -41,7 +41,7 @@ public static void test01() { } /** - * HashMap的merge方法,如果key相同,则通过merge来对key相同的袁术进行处理 + * HashMap的merge方法,如果key相同,则通过merge来对key相同的元素进行处理 */ public static void test02() { String key = "money"; diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapMerge.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapMerge.java new file mode 100644 index 0000000..d78e73f --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapMerge.java @@ -0,0 +1,58 @@ +package com.learnjava.lambda; + +import java.util.HashMap; +import java.util.Map; + +/** + * 关于Map的合并操作 + * + * @author lhy + * @date 2021/7/20 + */ +public class LambdaMapMerge { + + public static void main(String[] args) { +// mapMerge(); +// mapMerge2(); + } + + /** + * value为int类型的map merge操作,将两个map,相同key merge在一起 + * + * key:string + * value:int + */ + public static void mapMerge() { + Map map1= new HashMap<>(); + map1.put("one",1); + map1.put("two",2); + map1.put("three",3); + Map map2= new HashMap<>(); + map2.put("one",1); + map2.put("two",2); + + map1.forEach((key, value) -> map2.merge(key, value, Integer::sum)); + System.out.println(map2); + } + + /** + * value为int类型的map merge操作,将两个map,相同key merge在一起 + * + * key:string + * value:String + */ + public static void mapMerge2() { + Map map1= new HashMap<>(); + map1.put("one","1"); + map1.put("two","2"); + map1.put("three","3"); + Map map2= new HashMap<>(); + map2.put("one","1"); + map2.put("two","2"); + + map1.forEach((key, value) -> map2.merge(key, value,(total, num) -> String.valueOf(Integer.parseInt(total) + Integer.parseInt(num)))); + + System.out.println(map2); + + } +} From c7e9f38b4071a3df6b93efb026fa1541e47563f7 Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 21 Jul 2021 23:40:19 +0800 Subject: [PATCH 23/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BC=98=E7=A7=80?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E7=B1=BBdemo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JdkLearn/pom.xml | 22 +++ .../optimization/BeanCopierDemo.java | 170 ++++++++++++++++++ .../optimization/OptimizeUtilDemo.java | 16 ++ 3 files changed, 208 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/optimization/BeanCopierDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java diff --git a/JdkLearn/pom.xml b/JdkLearn/pom.xml index d44e0fb..5005f6c 100644 --- a/JdkLearn/pom.xml +++ b/JdkLearn/pom.xml @@ -16,10 +16,32 @@ 1.8 + + + + + + + + + + + + + + + + + + + + + + io.netty diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/BeanCopierDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/BeanCopierDemo.java new file mode 100644 index 0000000..5068206 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/optimization/BeanCopierDemo.java @@ -0,0 +1,170 @@ +package com.learnjava.optimization; + +import org.springframework.cglib.beans.BeanCopier; + +/** + * + * 经过测试,BeanCopier性能是BeanUtils10倍左右。 + * + * BeanCopier拷贝速度快,性能瓶颈出现在创建BeanCopier实例的过程中。 所以,把创建过的BeanCopier实例放到缓存中,下次可以直接获取,提升性能: + * + * + * @author lhy + * @date 2021/7/21 + */ +public class BeanCopierDemo { + + private static final BeanCopier BEAN_COPIER = BeanCopier.create(Person.class, PersonVo.class, false); + + public static void main(String[] args) { + Person person = new Person("zs", "high School", 16, 177, 126); + PersonVo vo = new PersonVo(); + + BEAN_COPIER.copy(person, vo, null); + + System.out.println(vo); + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + public static class PersonVo { + private String name; + private String grade; + private Integer age; + private Integer height; + private Integer weight; + + @Override + public String toString() { + return "PersonVo{" + + "name='" + name + '\'' + + ", grade='" + grade + '\'' + + ", age=" + age + + ", height=" + height + + ", weight=" + weight + + '}'; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public Integer getWeight() { + return weight; + } + + public void setWeight(Integer weight) { + this.weight = weight; + } + } + + public static class Person { + private String name; + private String grade; + private Integer age; + private Integer height; + private Integer weight; + + public Person(String name, String grade, Integer age, Integer height, Integer weight) { + this.name = name; + this.grade = grade; + this.age = age; + this.height = height; + this.weight = weight; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getGrade() { + return grade; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Integer getHeight() { + return height; + } + + public void setHeight(Integer height) { + this.height = height; + } + + public Integer getWeight() { + return weight; + } + + public void setWeight(Integer weight) { + this.weight = weight; + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java new file mode 100644 index 0000000..19892e1 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java @@ -0,0 +1,16 @@ +package com.learnjava.optimization; + +/** + * 优化工具类例子 + * + * @author lhy + * @date 2021/7/20 + */ +public class OptimizeUtilDemo { + + // 超快深拷贝工具类BeanCopier + private BeanCopierDemo beanCopierDemo; + + // Caffeine Cache + +} From 42f23158a436f53b2694f37692dcbc94c43a72c4 Mon Sep 17 00:00:00 2001 From: Bruis Date: Thu, 22 Jul 2021 23:50:43 +0800 Subject: [PATCH 24/68] add CaffeineDemo --- JdkLearn/pom.xml | 26 +--- .../learnjava/optimization/CaffeineDemo.java | 131 ++++++++++++++++++ .../optimization/OptimizeUtilDemo.java | 9 +- 3 files changed, 143 insertions(+), 23 deletions(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/optimization/CaffeineDemo.java diff --git a/JdkLearn/pom.xml b/JdkLearn/pom.xml index 5005f6c..4a18492 100644 --- a/JdkLearn/pom.xml +++ b/JdkLearn/pom.xml @@ -16,31 +16,15 @@ 1.8 - - - - - - - - - - - - - - - - - - - - - + + + com.github.ben-manes.caffeine + caffeine + diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/CaffeineDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/CaffeineDemo.java new file mode 100644 index 0000000..88de1a0 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/optimization/CaffeineDemo.java @@ -0,0 +1,131 @@ +package com.learnjava.optimization; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.RemovalListener; + +import java.math.BigDecimal; +import java.util.concurrent.TimeUnit; + +/** + * Caffeine 代码Demo(SpringBoot自带的缓存类) + * + * + * @author lhy + * @date 2021/7/22 + */ +public class CaffeineDemo { + + private static Cache productVoCache; + + public static RemovalListener listener = (k, v, cause) -> { + // 业务逻辑 + + + // 触发异常 + switch (cause) { + // 过期 + case EXPIRED: + break; + // 手动删除 + case EXPLICIT: + break; + // 被替换 + case REPLACED: + break; + // 垃圾回收 + case COLLECTED: + break; + // 超过数量限制 + case SIZE: + break; + default: + break; + } + }; + + public static void main(String[] args) { + // 初始化 + // afterPropertiesSet(); + } + + /** + * 模拟Spring的类初始化的时候对缓存进行初始化 + */ + public static void afterPropertiesSet() { + productVoCache = Caffeine.newBuilder() + .softValues() + .refreshAfterWrite(7200, TimeUnit.SECONDS) + .removalListener(listener) + // .build(k -> loadSync(k)) + // 非static类中,可以使用这种方式.build(this::loadSync); + .build(CaffeineDemo::loadSync); + } + + /** + * 获取对应缓存内容 + * @param key + * @return + */ + public static ProductVo getProductVo(String key) { + return productVoCache.get(key, CaffeineDemo::loadSync); + } + + /** + * 对对应商品进行缓存 + * @param key + */ + public static void putProductVo(String key) { + productVoCache.put(key, loadSync(key)); + } + + private static ProductVo loadSync(String key) { + // 业务逻辑 + return new ProductVo(); + } + + + + + + + + + + + + + + + + + + + + + + public static class ProductVo { + + private String productName; + + private BigDecimal price; + + public ProductVo() {} + + public String getProductName() { + return productName; + } + + public void setProductName(String productName) { + this.productName = productName; + } + + public BigDecimal getPrice() { + return price; + } + + public void setPrice(BigDecimal price) { + this.price = price; + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java index 19892e1..6f131f6 100644 --- a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeUtilDemo.java @@ -8,9 +8,14 @@ */ public class OptimizeUtilDemo { - // 超快深拷贝工具类BeanCopier + /** + * 超快深拷贝工具类BeanCopier + */ private BeanCopierDemo beanCopierDemo; - // Caffeine Cache + /** + * Caffeine Cache + */ + private CaffeineDemo caffeineDemo; } From 6f17e5c23093d24bc7c4b4ee0c43cbcea2191563 Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 23 Jul 2021 23:34:04 +0800 Subject: [PATCH 25/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E6=B6=88=E8=B4=B9demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rocketmqdemo/README.md | 7 + .../bruis/rocketmqdemo/demo03/Consumer.java | 61 +++++++ .../bruis/rocketmqdemo/demo03/Producer.java | 151 ++++++++++++++++++ 3 files changed, 219 insertions(+) create mode 100644 rocketmqdemo/README.md create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Consumer.java create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java diff --git a/rocketmqdemo/README.md b/rocketmqdemo/README.md new file mode 100644 index 0000000..2e44ec2 --- /dev/null +++ b/rocketmqdemo/README.md @@ -0,0 +1,7 @@ +## RocketMQDemo 说明 + +- demo01 普通生产者消费者 + +- demo02 普通生产者消费者(异步发送消息) + +- demo03 顺序消费 \ No newline at end of file diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Consumer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Consumer.java new file mode 100644 index 0000000..951e693 --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Consumer.java @@ -0,0 +1,61 @@ +package com.bruis.rocketmqdemo.demo03; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; +import org.apache.rocketmq.common.message.MessageExt; + +import java.util.List; +import java.util.Random; +import java.util.concurrent.TimeUnit; + +/** + * 顺序消息消费,带事务方式(应用可控制Offset什么时候提交) + * + * @author lhy + * @date 2021/7/23 + */ +public class Consumer { + + public static void main(String[] args) throws Exception { + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(Producer.GROUP_NAME); + consumer.setNamesrvAddr(Producer.NAMESRV_ADDRESS); + + /** + * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费 + * 如果非第一次启动,那么按照上次消费的位置继续消费 + */ + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); + consumer.subscribe(Producer.TOPIC_NAME, "TagA || TagC || TagD"); + + /** + * 顺序消费的消息类??MessageListenerOrderly + */ + consumer.registerMessageListener(new MessageListenerOrderly() { + + Random random = new Random(); + + @Override + public ConsumeOrderlyStatus consumeMessage(List msgs, ConsumeOrderlyContext context) { + context.setAutoCommit(true); + for (MessageExt msg : msgs) { + // 可以看到每个queue有唯一的consume线程来消费, 订单对每个queue(分区)有序 + System.out.println("consumeThread=" + Thread.currentThread().getName() + "queueId=" + msg.getQueueId() + ", content:" + new String(msg.getBody())); + } + + try { + //模拟业务逻辑处理中... + TimeUnit.SECONDS.sleep(random.nextInt(10)); + } catch (Exception e) { + e.printStackTrace(); + } + return ConsumeOrderlyStatus.SUCCESS; + } + }); + + consumer.start(); + System.out.println("Consumer Started."); + } +} diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java new file mode 100644 index 0000000..5e8054a --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java @@ -0,0 +1,151 @@ +package com.bruis.rocketmqdemo.demo03; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.message.Message; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * + * 顺序消息样例 + * + * @author lhy + * @date 2021/7/23 + */ +public class Producer { + + public static final String NAMESRV_ADDRESS = "127.0.0.1:9876"; + + public static final String GROUP_NAME = "inorder_group_name"; + + public static final String TOPIC_NAME = "inorder_topic"; + + public static void main(String[] args) throws Exception { + DefaultMQProducer producer = new DefaultMQProducer(GROUP_NAME); + producer.setNamesrvAddr(NAMESRV_ADDRESS); + + producer.start(); + + String[] tags = {"TagA", "TagC", "TagD"}; + + // 订单列表 + List orderList = new Producer().buildOrders(); + Date date = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStr = sdf.format(date); + for (int i = 0; i < 10; i++) { + // 时间前缀 + String body = dateStr + " Hello RocketMQ " + orderList.get(i); + Message msg = new Message(TOPIC_NAME, tags[i % tags.length], "KEY" + i, body.getBytes()); + + SendResult sendResult = producer.send(msg, (mqs, msg1, arg) -> { + Long id = (Long) arg; //根据订单id选择发送queue + long index = id % mqs.size(); + return mqs.get((int) index); + }, orderList.get(i).getOrderId());//订单id + + System.out.println(String.format("SendResult status:%s, queueId:%d, body:%s", + sendResult.getSendStatus(), + sendResult.getMessageQueue().getQueueId(), + body)); + } + + producer.shutdown(); + } + + /** + * 订单的步骤 + */ + private class OrderStep { + private long orderId; + private String desc; + + public long getOrderId() { + return orderId; + } + + public void setOrderId(long orderId) { + this.orderId = orderId; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + @Override + public String toString() { + return "OrderStep{" + + "orderId=" + orderId + + ", desc='" + desc + '\'' + + '}'; + } + } + + /** + * 生成模拟订单数据 + */ + private List buildOrders() { + List orderList = new ArrayList(); + + OrderStep orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111039L); + orderDemo.setDesc("创建"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111065L); + orderDemo.setDesc("创建"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111039L); + orderDemo.setDesc("付款"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103117235L); + orderDemo.setDesc("创建"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111065L); + orderDemo.setDesc("付款"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103117235L); + orderDemo.setDesc("付款"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111065L); + orderDemo.setDesc("完成"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111039L); + orderDemo.setDesc("推送"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103117235L); + orderDemo.setDesc("完成"); + orderList.add(orderDemo); + + orderDemo = new OrderStep(); + orderDemo.setOrderId(15103111039L); + orderDemo.setDesc("完成"); + orderList.add(orderDemo); + + return orderList; + } + +} From 15ef0f45f99ede65f88f51d02a50d6e50e340c96 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sat, 24 Jul 2021 11:56:55 +0800 Subject: [PATCH 26/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0RocketMQ=20=E5=AE=9A?= =?UTF-8?q?=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rocketmqdemo/README.md | 4 +- .../bruis/rocketmqdemo/demo03/Producer.java | 21 +++++++--- .../demo04/ScheduledMessageConsumer.java | 39 ++++++++++++++++++ .../demo04/ScheduledMessageProducer.java | 40 +++++++++++++++++++ 4 files changed, 98 insertions(+), 6 deletions(-) create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageConsumer.java create mode 100644 rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageProducer.java diff --git a/rocketmqdemo/README.md b/rocketmqdemo/README.md index 2e44ec2..8c82e18 100644 --- a/rocketmqdemo/README.md +++ b/rocketmqdemo/README.md @@ -4,4 +4,6 @@ - demo02 普通生产者消费者(异步发送消息) -- demo03 顺序消费 \ No newline at end of file +- demo03 顺序消费 + +- demo04 延时消息 \ No newline at end of file diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java index 5e8054a..d2af5df 100644 --- a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo03/Producer.java @@ -1,8 +1,10 @@ package com.bruis.rocketmqdemo.demo03; import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.MessageQueueSelector; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.common.message.MessageQueue; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -42,11 +44,20 @@ public static void main(String[] args) throws Exception { String body = dateStr + " Hello RocketMQ " + orderList.get(i); Message msg = new Message(TOPIC_NAME, tags[i % tags.length], "KEY" + i, body.getBytes()); - SendResult sendResult = producer.send(msg, (mqs, msg1, arg) -> { - Long id = (Long) arg; //根据订单id选择发送queue - long index = id % mqs.size(); - return mqs.get((int) index); - }, orderList.get(i).getOrderId());//订单id +// SendResult sendResult = producer.send(msg, (mqs, msg1, arg) -> { +// Long id = (Long) arg; //根据订单id选择发送queue +// long index = id % mqs.size(); +// return mqs.get((int) index); +// }, orderList.get(i).getOrderId());//订单id + + SendResult sendResult = producer.send(msg, new MessageQueueSelector() { + @Override + public MessageQueue select(List mqs, Message msg, Object arg) { + Long id = (Long) arg; + long index = id % mqs.size(); + return mqs.get((int) index); + } + }, orderList.get(i).getOrderId()); System.out.println(String.format("SendResult status:%s, queueId:%d, body:%s", sendResult.getSendStatus(), diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageConsumer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageConsumer.java new file mode 100644 index 0000000..97b85be --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageConsumer.java @@ -0,0 +1,39 @@ +package com.bruis.rocketmqdemo.demo04; + +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.*; +import org.apache.rocketmq.common.message.MessageExt; +import java.util.List; + +/** + * + * 延时消息消费者 + * + * @author lhy + * @date 2021/7/24 + */ +public class ScheduledMessageConsumer { + + public static void main(String[] args) throws Exception { + + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(ScheduledMessageProducer.GROUP_NAME); + // 订阅指定的topic + consumer.subscribe(ScheduledMessageProducer.TOPIC_NAME, "*"); + consumer.setNamesrvAddr(ScheduledMessageProducer.NAMESRV_ADDRESS); + // 注册消息监听者 + consumer.registerMessageListener(new MessageListenerConcurrently() { + + // 消费消息 + @Override + public ConsumeConcurrentlyStatus consumeMessage(List messages, ConsumeConcurrentlyContext context) { + for (MessageExt message : messages) { + // Print approximate delay time period + System.out.println("Receive message[msgId=" + message.getMsgId() + "] " + (System.currentTimeMillis() - message.getBornTimestamp()) + "ms later"); + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + } + +} diff --git a/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageProducer.java b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageProducer.java new file mode 100644 index 0000000..356f370 --- /dev/null +++ b/rocketmqdemo/src/main/java/com/bruis/rocketmqdemo/demo04/ScheduledMessageProducer.java @@ -0,0 +1,40 @@ +package com.bruis.rocketmqdemo.demo04; + +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.common.message.Message; + +/** + * + * 延时消息生产 + * + * @author lhy + * @date 2021/7/24 + */ +public class ScheduledMessageProducer { + + public static final String GROUP_NAME = "scheduled_group"; + + public static final String TOPIC_NAME = "scheduled_test_topic"; + + public static final String NAMESRV_ADDRESS = "127.0.0.1:9876"; + + public static void main(String[] args) throws Exception { + + DefaultMQProducer producer = new DefaultMQProducer(GROUP_NAME); + producer.setNamesrvAddr(NAMESRV_ADDRESS); + producer.start(); + + int totalMessagesToSend = 100; + + for (int i = 0; i < totalMessagesToSend; i++) { + Message message = new Message(TOPIC_NAME, ("Hello Scheduled Message " + i).getBytes()); + // 设置延时等级3,这个消息将在10s之后发送(现在只支持固定的几个时间,详看delayTimeLevel) + message.setDelayTimeLevel(3); + // 发送消息 + producer.send(message); + } + + producer.shutdown(); + } + +} From 2e219748affbef5f57e71bb50efd9b4b2946542c Mon Sep 17 00:00:00 2001 From: Bruis Date: Thu, 5 Aug 2021 01:25:20 +0800 Subject: [PATCH 27/68] add snowId --- .../com/learnjava/concurent/SnowIdDemo.java | 12 ++ .../com/learnjava/concurent/SnowIdUtils.java | 114 ++++++++++++++++++ .../learnjava/optimization/OptimizeDemo.java | 30 +++++ 3 files changed, 156 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/concurent/SnowIdDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdDemo.java b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdDemo.java new file mode 100644 index 0000000..aa00a30 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdDemo.java @@ -0,0 +1,12 @@ +package com.learnjava.concurent; + +/** + * @author lhy + * @date 2021/7/27 + */ +public class SnowIdDemo { + public static void main(String[] args) { + // 通过雪花秀算法获取分布式id + System.out.println(SnowIdUtils.uniqueLongHex()); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java new file mode 100644 index 0000000..b07604d --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java @@ -0,0 +1,114 @@ +package com.learnjava.concurent; + +/** + * @author lhy + * @date 2021/7/27 + */ +public class SnowIdUtils { + /** + * 私有的 静态内部类 + */ + private static class SnowFlake { + + /** + * 内部类对象(单例模式) + */ + private static final SnowIdUtils.SnowFlake SNOW_FLAKE = new SnowIdUtils.SnowFlake(); + /** + * 起始的时间戳 + */ + private final long START_TIMESTAMP = 1609464335121L; + /** + * 序列号占用位数 + */ + private final long SEQUENCE_BIT = 12; + /** + * 机器标识占用位数 + */ + private final long MACHINE_BIT = 10; + /** + * 时间戳位移位数 + */ + private final long TIMESTAMP_LEFT = SEQUENCE_BIT + MACHINE_BIT; + /** + * 最大序列号 (4095) + */ + private final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT); + /** + * 最大机器编号 (1023) + */ + private final long MAX_MACHINE_ID = ~(-1L << MACHINE_BIT); + /** + * 生成id机器标识部分 + */ + private long machineIdPart; + /** + * 序列号 + */ + private long sequence = 0L; + /** + * 上一次时间戳 + */ + private long lastStamp = -1L; + + /** + * 构造函数初始化机器编码 + */ + private SnowFlake() { +// String ip = instance.getDockerIp().replace(".", ""); + // 模拟获取机器节点ip + String ip = "127.0.0.1"; + long localIp = Long.valueOf(ip.replace(".", "")); + machineIdPart = (localIp & MAX_MACHINE_ID) << SEQUENCE_BIT; + } + /** + * 获取雪花ID + */ + public synchronized long nextId() { + long currentStamp = timeGen(); + while (currentStamp < lastStamp) { + throw new RuntimeException(String.format("时钟已经回拨. Refusing to generate id for %d milliseconds", lastStamp - currentStamp)); + } + if (currentStamp == lastStamp) { + sequence = (sequence + 1) & MAX_SEQUENCE; + if (sequence == 0) { + currentStamp = getNextMill(); + } + } else { + sequence = 0L; + } + lastStamp = currentStamp; + return (currentStamp - START_TIMESTAMP) << TIMESTAMP_LEFT | machineIdPart | sequence; + } + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + */ + private long getNextMill() { + long mill = timeGen(); + // + while (mill <= lastStamp) { + mill = timeGen(); + } + return mill; + } + /** + * 返回以毫秒为单位的当前时间 + */ + protected long timeGen() { + return System.currentTimeMillis(); + } + } + + /** + * 获取long类型雪花ID + */ + public static long uniqueLong() { + return SnowIdUtils.SnowFlake.SNOW_FLAKE.nextId(); + } + /** + * 获取String类型雪花ID + */ + public static String uniqueLongHex() { + return String.format("%016X", uniqueLong()); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java index 108490d..fe81a19 100644 --- a/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/optimization/OptimizeDemo.java @@ -2,6 +2,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * @@ -14,6 +15,9 @@ public class OptimizeDemo { public static void main(String[] args) { Map map = new HashMap<>(); mergeData(map); + + Map concurrentMap = new ConcurrentHashMap<>(); + concurrentMergeData(concurrentMap); } /** @@ -34,7 +38,33 @@ public static void mergeData(Map map) { Integer mapValue = map.get(key); if (null != mapValue) { mapValue += value; + } else { + mapValue = value; } map.put(key, mapValue); } + + /** + * 针对mergeData里map的put操作,在并发情况下会存在put的时候,以及有其他线程已经put成功了,导致线程不安全, + * 所以需要使用并发集合列的putIfAbsent方法 + * @param map + */ + public static void concurrentMergeData(Map map) { + String key = "mapKey"; + int value = 1; + Integer mapValue = map.get(key); + if (null != mapValue) { + mapValue += value; + } else { + mapValue = value; + } + map.putIfAbsent(key, mapValue); + + // computeIfAbsent方法对map中的key只进行重新计算,如果不存在这个key,则添加到map中 + map.computeIfAbsent(key, (k) -> { + // 其他计算 + int a = 1, b = 2; + return a + b; + }); + } } From 1108358627f77d1d0050069969f0e4a289ce64f7 Mon Sep 17 00:00:00 2001 From: Bruis Date: Tue, 10 Aug 2021 23:46:46 +0800 Subject: [PATCH 28/68] test --- JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java index 299b362..cc03752 100644 --- a/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java +++ b/JdkLearn/src/main/java/com/learnjava/lambda/LambdaMapDemo.java @@ -81,7 +81,6 @@ public static void test03() { LinkedHashMap::new ) ); - sortedMap.entrySet().forEach(System.out::println); } From 02201c504db494de0428a389293659bcf0656bb4 Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 13 Aug 2021 12:47:57 +0800 Subject: [PATCH 29/68] =?UTF-8?q?update=20read=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/README.md b/README.md index d3c65e7..b12cf0a 100644 --- a/README.md +++ b/README.md @@ -124,8 +124,22 @@ SpringCloud源码 - Dubbo底层源码学习(五)—— Dubbo的注册中心重试机制 - [Dubbo底层源码学习(六)—— Dubbo的服务暴露](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Dubbo/Dubbo%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E2%80%94%E2%80%94%E6%9C%8D%E5%8A%A1%E6%9A%B4%E9%9C%B2.md) - Dubbo底层源码学习(七)—— Dubbo的服务消费 + +- Netty底层源码解析 + - [Netty底层源码解析-初始Netty及其架构]() + - [Netty底层源码解析-Netty服务端启动分析]() + - [Netty底层源码解析-NioEventLoop原理分析]() + - [Netty底层源码解析-Channel分析]() + - [Netty底层源码解析-ChannelPipeline分析(上)]() + - [Netty底层源码解析-ChannelPipeline分析(下)]() + - [Netty底层源码解析-FastThreadLocal原理分析]() + - [Netty底层源码解析-内存分配原理分析]() + - [Netty底层源码解析-RocketMQ底层使用到的Netty]() - RocketMQ底层源码解析 + - [RocketMQ底层源码解析-RocketMQ环境搭建]() + - [RocketMQ底层源码解析-本地调试RocketMQ源码]() + - [RocketMQ底层源码解析-NameServer分析]() 持续更新中... From 7ce0b032bcca571b493bb27fbbbbb2fca11d4c2f Mon Sep 17 00:00:00 2001 From: Bruis Date: Fri, 13 Aug 2021 12:53:10 +0800 Subject: [PATCH 30/68] update readme --- README.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index b12cf0a..3e757b4 100644 --- a/README.md +++ b/README.md @@ -126,20 +126,20 @@ SpringCloud源码 - Dubbo底层源码学习(七)—— Dubbo的服务消费 - Netty底层源码解析 - - [Netty底层源码解析-初始Netty及其架构]() - - [Netty底层源码解析-Netty服务端启动分析]() - - [Netty底层源码解析-NioEventLoop原理分析]() - - [Netty底层源码解析-Channel分析]() - - [Netty底层源码解析-ChannelPipeline分析(上)]() - - [Netty底层源码解析-ChannelPipeline分析(下)]() - - [Netty底层源码解析-FastThreadLocal原理分析]() - - [Netty底层源码解析-内存分配原理分析]() - - [Netty底层源码解析-RocketMQ底层使用到的Netty]() + - Netty底层源码解析-初始Netty及其架构 + - Netty底层源码解析-Netty服务端启动分析 + - Netty底层源码解析-NioEventLoop原理分析 + - Netty底层源码解析-Channel分析 + - Netty底层源码解析-ChannelPipeline分析(上) + - Netty底层源码解析-ChannelPipeline分析(下) + - Netty底层源码解析-FastThreadLocal原理分析 + - Netty底层源码解析-内存分配原理分析 + - Netty底层源码解析-RocketMQ底层使用到的Netty - RocketMQ底层源码解析 - - [RocketMQ底层源码解析-RocketMQ环境搭建]() - - [RocketMQ底层源码解析-本地调试RocketMQ源码]() - - [RocketMQ底层源码解析-NameServer分析]() + - RocketMQ底层源码解析-RocketMQ环境搭建 + - RocketMQ底层源码解析-本地调试RocketMQ源码 + - RocketMQ底层源码解析-NameServer分析 持续更新中... From ed5ad39ca8cd89e37ffb09f5d541afb5f83f89fd Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 15 Aug 2021 09:00:36 +0800 Subject: [PATCH 31/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0netty=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\210\206\346\236\220.md" | 404 ++++++++++++ ...37\347\220\206\345\210\206\346\236\220.md" | 605 ++++++++++++++++++ ...12\345\205\266\346\236\266\346\236\204.md" | 183 ++++++ 3 files changed, 1192 insertions(+) create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" new file mode 100644 index 0000000..99d24f3 --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" @@ -0,0 +1,404 @@ +# Netty 服务端启动分析 + +在Java中,网络通信是通过Socket来进行的,那么在Netty中,服务端的Socket是在哪里进行初始化的?并且在哪里进行accept连接? Netty里的Channel是啥,有啥作用呢?带着这三个问题,进入本文的Netty服务端启动分析。 + +本文分析将分为四大步: + +1. 创建服务端Channel; +2. 初始化服务端Channel; +3. 注册selector; +4. 端口绑定; + +## 1. 创建服务端Channel + +创建服务端Channel又可以分为四步,如下: + +1. ServerBootstrap#bind() 用户代码入口; +2. initAndRegister() 初始化并注册; +3. newChannel() 创建服务端channel; + + +首先看下下图简易版的Netty服务端启动代码。 + +```java +public final class Server { + + public static void main(String[] args) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.TCP_NODELAY, true) + .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") + .handler(new ServerHandler()) + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new AuthHandler()); + //.. + + } + }); + + ChannelFuture f = b.bind(8888).sync(); + + f.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} +``` + +服务端构建好ServerBootstrap之后,通过bind()方法进行绑定。进入ServerBootstrap的父类AbstractBootstrap后,一路调用来到AbstractBootstrap#doBind()方法,首先就是初始化并注册Channel。 + +![netty01png](https://coderbruis.github.io/javaDocs/img/netty/source/netty01_01.png) + +在initAndRegister处channelFactory是ReflectiveChannelFactory,具体赋值处是在ServerBootstrap#channel()方法中定义的,并且传入的channel是:NioServerSocketChannel,上图中可以见。 + +查看到ReflectiveChannelFactory#newChannel()方法,实际就是调用的NioServerSocketChannel#newInstance()方法反射构建一个channel对象。 + + +那么,我们看下NioServerSocketChannel底层是如何获取通过反射创建服务端Channel的呢? + + +以下部分源码均在NioServerSocketChannel类中 + +```java + public NioServerSocketChannel() { + this(newSocket(DEFAULT_SELECTOR_PROVIDER)); + } +``` + +而newSocket()方法是一个静态方法 + +```java + private static ServerSocketChannel newSocket(SelectorProvider provider) { + try { + // 通过SelectorProvider来获取一个ServerSocketChannel,SelectorProvider是通过SPI来获取的 + // 此处返回一个ServerSocketChannelImpl对象 + return provider.openServerSocketChannel(); + } catch (IOException e) { + throw new ChannelException( + "Failed to open a server socket.", e); + } + } +``` + +```java + public NioServerSocketChannel(ServerSocketChannel channel) { + // 调用抽象父类AbstractNioChannel构造方法,注意此处服务端Channel注册的是OP_ACCEPT事件 + super(null, channel, SelectionKey.OP_ACCEPT); + // TCP参数配置类 + config = new NioServerSocketChannelConfig(this, javaChannel().socket()); + } +``` + +AbstractNioChannel类 +```java + protected AbstractNioChannel(Channel parent, SelectableChannel ch, int readInterestOp) { + // 调用父类AbstractChannel的构造方法 + super(parent); + this.ch = ch; + this.readInterestOp = readInterestOp; + try { + // 关闭blocking,关闭阻塞模式:比较重要 + ch.configureBlocking(false); + } catch (IOException e) { + try { + ch.close(); + } catch (IOException e2) { + if (logger.isWarnEnabled()) { + logger.warn( + "Failed to close a partially initialized socket.", e2); + } + } + + throw new ChannelException("Failed to enter non-blocking mode.", e); + } + } +``` + +AbstractChannel类 +```java + protected AbstractChannel(Channel parent) { + this.parent = parent; + // 每个channel的唯一标识 + id = newId(); + // 底层io操作工具类 + unsafe = newUnsafe(); + // channel里的逻辑链pipeline(非常重要) + pipeline = newChannelPipeline(); + } +``` + +总结下服务端创建Channel的三件重要事情: + +1. 通过反射来创建JDK底层的channel; +2. 设置Channel为非阻塞模式ch.configureBlocking(false); +3. 创建一个pipeline对象; + + + +## 2. 初始化服务端Channel + +初始化服务端Channel可以分为如下的几步: + +1. set ChannelOptions,ChannelAttrs 设置options和attrs +2. set Child Options,ChildAttrs,为服务端创建的子链接创建options和attrs +3. config handler,配置服务端pipeline +4. add ServerBootstrapAcceptor,添加连接器 + + +ServerBoostrap端初始化过程 +```java + void init(Channel channel) throws Exception { + // 获取用户配置的options + final Map, Object> options = options0(); + synchronized (options) { + channel.config().setOptions(options); + } + + // 配置attrs + final Map, Object> attrs = attrs0(); + synchronized (attrs) { + for (Entry, Object> e: attrs.entrySet()) { + @SuppressWarnings("unchecked") + AttributeKey key = (AttributeKey) e.getKey(); + channel.attr(key).set(e.getValue()); + } + } + + ChannelPipeline p = channel.pipeline(); + + final EventLoopGroup currentChildGroup = childGroup; + final ChannelHandler currentChildHandler = childHandler; + final Entry, Object>[] currentChildOptions; + final Entry, Object>[] currentChildAttrs; + synchronized (childOptions) { + currentChildOptions = childOptions.entrySet().toArray(newOptionArray(childOptions.size())); + } + synchronized (childAttrs) { + currentChildAttrs = childAttrs.entrySet().toArray(newAttrArray(childAttrs.size())); + } + + p.addLast(new ChannelInitializer() { + @Override + public void initChannel(Channel ch) throws Exception { + final ChannelPipeline pipeline = ch.pipeline(); + ChannelHandler handler = config.handler(); + if (handler != null) { + pipeline.addLast(handler); + } + + // 添加ServerBootstrapAccetor + ch.eventLoop().execute(new Runnable() { + @Override + public void run() { + pipeline.addLast(new ServerBootstrapAcceptor( + currentChildGroup, currentChildHandler, currentChildOptions, currentChildAttrs)); + } + }); + } + }); + } +``` + +## 3. 注册selector + +整个注册selector过程可以分为以下几步: + +- AbstractChannel#register(channel) 入口 + - this.eventLoop = eventLoop 绑定线程 + - register0() 实际注册 + - doRegister() 调用jdk底层进行注册 + - invokeHandlerAddedIfNeeded() + - fireChannelRegistered() 传播注册成功的事件 + + +AbstractChannel +```java + @Override + public final void register(EventLoop eventLoop, final ChannelPromise promise) { + if (eventLoop == null) { + throw new NullPointerException("eventLoop"); + } + if (isRegistered()) { + promise.setFailure(new IllegalStateException("registered to an event loop already")); + return; + } + if (!isCompatible(eventLoop)) { + promise.setFailure( + new IllegalStateException("incompatible event loop type: " + eventLoop.getClass().getName())); + return; + } + + // 设置AbstractChannel的eventLoop + AbstractChannel.this.eventLoop = eventLoop; + + if (eventLoop.inEventLoop()) { + register0(promise); + } else { + try { + eventLoop.execute(new Runnable() { + @Override + public void run() { + register0(promise); + } + }); + } catch (Throwable t) { + logger.warn( + "Force-closing a channel whose registration task was not accepted by an event loop: {}", + AbstractChannel.this, t); + closeForcibly(); + closeFuture.setClosed(); + safeSetFailure(promise, t); + } + } + } +``` + +AbstractChannel.AbstractUnsafe#register0() +```java + private void register0(ChannelPromise promise) { + try { + if (!promise.setUncancellable() || !ensureOpen(promise)) { + return; + } + boolean firstRegistration = neverRegistered; + doRegister(); + neverRegistered = false; + registered = true; + + // 调用handlerAdd事件回调 + pipeline.invokeHandlerAddedIfNeeded(); + + safeSetSuccess(promise); + // 调用register事件回调 + pipeline.fireChannelRegistered(); + + if (isActive()) { + if (firstRegistration) { + pipeline.fireChannelActive(); + } else if (config().isAutoRead()) { + beginRead(); + } + } + } catch (Throwable t) { + closeForcibly(); + closeFuture.setClosed(); + safeSetFailure(promise, t); + } + } +``` + + +AbstractNioChannel.java +```java + @Override + protected void doRegister() throws Exception { + boolean selected = false; + // 这里是个小技巧,for(;;)比while(true)效率要高很多 + for (;;) { + try { + // 将通道channel注册到selector上 + selectionKey = javaChannel().register(eventLoop().selector, 0, this); + return; + } catch (CancelledKeyException e) { + if (!selected) { + eventLoop().selectNow(); + selected = true; + } else { + throw e; + } + } + } + } +``` + +就这样,NioServerSocketChannel就以Accept事件注册到了Selector上了。 + +## 4. 端口绑定 + +端口绑定流程如下: + +- AbstractUnsafe#bind() 入口 + - dobind() + - javaChannel().bind() jdk底层绑定 + - pipeline.fireChanelActive() 传播事件 + - HeadContext.readIfIsAutoRead() + + +AbstractChannel.AbstractUnsafe#bind() +```java + @Override + public final void bind(final SocketAddress localAddress, final ChannelPromise promise) { + assertEventLoop(); + + if (!promise.setUncancellable() || !ensureOpen(promise)) { + return; + } + + // See: https://github.com/netty/netty/issues/576 + if (Boolean.TRUE.equals(config().getOption(ChannelOption.SO_BROADCAST)) && + localAddress instanceof InetSocketAddress && + !((InetSocketAddress) localAddress).getAddress().isAnyLocalAddress() && + !PlatformDependent.isWindows() && !PlatformDependent.isRoot()) { + // Warn a user about the fact that a non-root user can't receive a + // broadcast packet on *nix if the socket is bound on non-wildcard address. + logger.warn( + "A non-root user can't receive a broadcast packet if the socket " + + "is not bound to a wildcard address; binding to a non-wildcard " + + "address (" + localAddress + ") anyway as requested."); + } + + // 是否active + boolean wasActive = isActive(); + try { + // 调用jdk底层代码进行绑定 + doBind(localAddress); + } catch (Throwable t) { + safeSetFailure(promise, t); + closeIfClosed(); + return; + } + + if (!wasActive && isActive()) { + invokeLater(new Runnable() { + @Override + public void run() { + pipeline.fireChannelActive(); + } + }); + } + safeSetSuccess(promise); + } +``` + +NioServerSocketChannel.java +```java + @Override + protected void doBind(SocketAddress localAddress) throws Exception { + // 判断jdk版本 + if (PlatformDependent.javaVersion() >= 7) { + javaChannel().bind(localAddress, config.getBacklog()); + } else { + javaChannel().socket().bind(localAddress, config.getBacklog()); + } + } +``` + + +## 总结 + +Netty服务端核心启动流程主要是为了创建NioServerSocketChannel,然后将其注册在Selector上,总结下核心步骤如下: + +- NioServerSocket#newSocket() 获取服务端channel +- ServerBootstrap#init() 对服务端channel进行初始化 +- AbstractChannel.AbstractUnsafe#register() 将服务端Channel注册到Selector上 +- AbstractChannel.AbstractUnsafe#doBind() 注册端口号 + diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" new file mode 100644 index 0000000..66ed386 --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" @@ -0,0 +1,605 @@ +## 1. 概述 + +在对NioEventLoop原理进行分析之前,先提出三个常见问题: + +- 默认情况下,Netty服务端起多少个线程?合适启动的线程? +- Netty是如何解决jdk的空轮训bug的? +- Netty是如何保证异步串行无锁化的? + +带着这三个问题,进入下面的NioEventLoop原理分析 + + +## 2. NioEventLoop是什么 + +这里可以先简单的将NioEventLoop理解为一个线程,但是NioEventLoop是被封装过的“线程”,这里的不同之处可以埋一个坑进行深入分析。 + +而NioEventLoop在Netty中起到什么作用呢?读完下文的你应该就会有答案了。 + +## 3. NioEventLoop的创建 + +首先,抛出一个结论,NioEventLoop是在NioEventLoopGroup中创建出来的,具体方法逻辑如下: + +NioEventLoopGroup.java + +```java + @Override + protected EventLoop newChild(Executor executor, Object... args) throws Exception { + return new NioEventLoop(this, executor, (SelectorProvider) args[0], + ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]); + } +``` + +可以看出,在NioEventLoopGroup中的newChild方法入参里,传入了一个Executor对象,这是一个线程池对象,除此之外,还有可变参数args,带入到NioEventLoop的构造 +方法里,分别强转为了SelectorProvider、SelectStrategyFactory和RejectedExecutionHandler这三个对象。读到这里可能很多人都会懵,newChild是从哪里调进来的? + +为了故事的顺利发展,让我们的目光来到NioEventLoopGroup,查看下其Diagrams图。 + +![netty02png](https://coderbruis.github.io/javaDocs/img/netty/source/netty02_02.png) + +可以看到NioEventLoopGroup的顶级父接口是Executor,直白点理解NioEventLoopGroup就是一个线程池,NioEventLoop就是其创建出来的一个线程!下面看到NioEventLoopGroup的构造方法 + +NioEventLoopGroup.java +```Java + public NioEventLoopGroup() { + this(0); + } + + public NioEventLoopGroup(int nThreads) { + this(nThreads, (Executor) null); + } + + public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory) { + this(nThreads, threadFactory, SelectorProvider.provider()); + } + + public NioEventLoopGroup(int nThreads, Executor executor) { + this(nThreads, executor, SelectorProvider.provider()); + } + + public NioEventLoopGroup( + int nThreads, ThreadFactory threadFactory, final SelectorProvider selectorProvider) { + this(nThreads, threadFactory, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); + } + + public NioEventLoopGroup(int nThreads, ThreadFactory threadFactory, + final SelectorProvider selectorProvider, final SelectStrategyFactory selectStrategyFactory) { + super(nThreads, threadFactory, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); + } + + public NioEventLoopGroup( + int nThreads, Executor executor, final SelectorProvider selectorProvider) { + this(nThreads, executor, selectorProvider, DefaultSelectStrategyFactory.INSTANCE); + } + + public NioEventLoopGroup(int nThreads, Executor executor, final SelectorProvider selectorProvider, + final SelectStrategyFactory selectStrategyFactory) { + super(nThreads, executor, selectorProvider, selectStrategyFactory, RejectedExecutionHandlers.reject()); + } + + public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, + final SelectorProvider selectorProvider, + final SelectStrategyFactory selectStrategyFactory) { + super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, + RejectedExecutionHandlers.reject()); + } + + public NioEventLoopGroup(int nThreads, Executor executor, EventExecutorChooserFactory chooserFactory, + final SelectorProvider selectorProvider, + final SelectStrategyFactory selectStrategyFactory, + final RejectedExecutionHandler rejectedExecutionHandler) { + super(nThreads, executor, chooserFactory, selectorProvider, selectStrategyFactory, rejectedExecutionHandler); + } +``` + +这么多的构造方法,每个方法传入的入参都不一样,可以看到默认构造方法调用的是 +```java + public NioEventLoopGroup() { + this(0); + } +``` +一路跟到父类MultithreadEventLoopGroup,可以看到如下关键代码: + +MultithreadEventLoopGroup +```java + private static final int DEFAULT_EVENT_LOOP_THREADS; + static { + DEFAULT_EVENT_LOOP_THREADS = Math.max(1, SystemPropertyUtil.getInt( + "io.netty.eventLoopThreads", Runtime.getRuntime().availableProcessors() * 2)); + + if (logger.isDebugEnabled()) { + logger.debug("-Dio.netty.eventLoopThreads: {}", DEFAULT_EVENT_LOOP_THREADS); + } + } + + protected MultithreadEventLoopGroup(int nThreads, ThreadFactory threadFactory, Object... args) { + super(nThreads == 0 ? DEFAULT_EVENT_LOOP_THREADS : nThreads, threadFactory, args); + } +``` + +可以得出一个结论就是:当NioEventLoopGroup默认黄金的线程数是 2 * CPU 个。 + +NioEventLoop的创建核心逻辑在MultithreadEventExecutorGroup构造方法中,可以看到如下逻辑,分析内容待定... + +MultithreadEventExecutorGroup.java +```java + protected MultithreadEventExecutorGroup(int nThreads, Executor executor, + EventExecutorChooserFactory chooserFactory, Object... args) { + if (nThreads <= 0) { + throw new IllegalArgumentException(String.format("nThreads: %d (expected: > 0)", nThreads)); + } + + if (executor == null) { + executor = new ThreadPerTaskExecutor(newDefaultThreadFactory()); + } + + children = new EventExecutor[nThreads]; + + for (int i = 0; i < nThreads; i ++) { + boolean success = false; + try { + children[i] = newChild(executor, args); + success = true; + } catch (Exception e) { + // TODO: Think about if this is a good exception type + throw new IllegalStateException("failed to create a child event loop", e); + } finally { + if (!success) { + for (int j = 0; j < i; j ++) { + children[j].shutdownGracefully(); + } + + for (int j = 0; j < i; j ++) { + EventExecutor e = children[j]; + try { + while (!e.isTerminated()) { + e.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS); + } + } catch (InterruptedException interrupted) { + // Let the caller handle the interruption. + Thread.currentThread().interrupt(); + break; + } + } + } + } + } + + chooser = chooserFactory.newChooser(children); + + final FutureListener terminationListener = new FutureListener() { + @Override + public void operationComplete(Future future) throws Exception { + if (terminatedChildren.incrementAndGet() == children.length) { + terminationFuture.setSuccess(null); + } + } + }; + + for (EventExecutor e: children) { + e.terminationFuture().addListener(terminationListener); + } + + Set childrenSet = new LinkedHashSet(children.length); + Collections.addAll(childrenSet, children); + readonlyChildren = Collections.unmodifiableSet(childrenSet); + } +``` + +![netty02_02png](https://coderbruis.github.io/javaDocs/img/netty/source/netty02_02.png) + +NioEventLoopGroup#newChild() +```java + @Override + protected EventLoop newChild(Executor executor, Object... args) throws Exception { + return new NioEventLoop(this, executor, (SelectorProvider) args[0], + ((SelectStrategyFactory) args[1]).newSelectStrategy(), (RejectedExecutionHandler) args[2]); + } +``` + +下面是NioEventLoop类的构造方法 +```java + NioEventLoop(NioEventLoopGroup parent, Executor executor, SelectorProvider selectorProvider, + SelectStrategy strategy, RejectedExecutionHandler rejectedExecutionHandler) { + super(parent, executor, false, DEFAULT_MAX_PENDING_TASKS, rejectedExecutionHandler); + if (selectorProvider == null) { + throw new NullPointerException("selectorProvider"); + } + if (strategy == null) { + throw new NullPointerException("selectStrategy"); + } + provider = selectorProvider; + // 此处可以看出,每个NioEventLoop都会和一个Selector绑定对应 + selector = openSelector(); + selectStrategy = strategy; + } +``` + +每个NioEventLoop都会和一个Selector进行绑定对应。 + + + +SingleThreadEventLoop.java构造方法中 +```java + protected SingleThreadEventLoop(EventLoopGroup parent, Executor executor, + boolean addTaskWakesUp, int maxPendingTasks, + RejectedExecutionHandler rejectedExecutionHandler) { + super(parent, executor, addTaskWakesUp, maxPendingTasks, rejectedExecutionHandler); + tailTasks = newTaskQueue(maxPendingTasks); + } +``` + +NioEventLoop.java +```java + @Override + protected Queue newTaskQueue(int maxPendingTasks) { + // This event loop never calls takeTask() + return PlatformDependent.newMpscQueue(maxPendingTasks); + } +``` + +这里的任务队列有啥用? + +我们都知道,在Netty中是多线程的,即多个NioEventLoop,任务队列的作用就是当其他NioEventLoop拿到CPU的执行权时,却得到了其他线程的IO请求,此时NioEventLoop就把当前这个未处理完的请求 +以任务的形式提交到对应NioEventLoop的队列中进行串行执行,能够保证线程安全。 + + + + + + + +EventExecutorChooser是什么?有什么作用? + +在MultithreadEventExecutorGroup.java构造方法中,对EventExecutorChooser进行了赋值 + +```java + chooser = chooserFactory.newChooser(children); +``` + +DefaultEventExecutorChooserFactory#newChooser +```java + public EventExecutorChooser newChooser(EventExecutor[] executors) { + // 判断executors的数量是否是2次幂,2、4、8、16 + if (isPowerOfTwo(executors.length)) { + // 调用优化过的EventExecutorChooser + return new PowerOfTowEventExecutorChooser(executors); + } else { + return new GenericEventExecutorChooser(executors); + } + } +``` + +先看下未优化过的ExecutorChooser,原理就是对executors.length 进行取模,这样就可以对Executors的索引位进行循环使用。 +```java + private static final class GenericEventExecutorChooser implements EventExecutorChooser { + private final AtomicInteger idx = new AtomicInteger(); + private final EventExecutor[] executors; + + GenericEventExecutorChooser(EventExecutor[] executors) { + this.executors = executors; + } + + @Override + public EventExecutor next() { + return executors[Math.abs(idx.getAndIncrement() % executors.length)]; + } + } +``` + +优化过的ExecutorChooser,原理是通过&对executors进行取模操作。 +```java + private static final class PowerOfTowEventExecutorChooser implements EventExecutorChooser { + private final AtomicInteger idx = new AtomicInteger(); + private final EventExecutor[] executors; + + PowerOfTowEventExecutorChooser(EventExecutor[] executors) { + this.executors = executors; + } + + @Override + public EventExecutor next() { + return executors[idx.getAndIncrement() & executors.length - 1]; + } + } +``` + +&取模原理如下图: +![netty02_03png](https://coderbruis.github.io/javaDocs/img/netty/source/netty02_03.png) + +idx是当前索引位置,而加入executors数量为16,则16-1=15,二进制为 +``` +1111 +``` +idx二进制如下: +``` +111010 +``` + +由于是&操作,则相当于只取后四位,则idx & (Executors.length - 1) = 1010 + +如果此时idx为:1111,而此时进行&操作过后,结果就是:1111, + +则idx索引位再+1,则结果就是0000,这样就达到了循环使用索引位的效果。 + + +## 4. NioEventLoop的启动 + +先把关键步骤码出来,后面再过来分析。 + +AbstractBootstrap#doBind() +```java + private ChannelFuture doBind(final SocketAddress localAddress) { + // 初始化并注册通道Channel + final ChannelFuture regFuture = initAndRegister(); + final Channel channel = regFuture.channel(); + if (regFuture.cause() != null) { + return regFuture; + } + + // channelFuture完成了 + if (regFuture.isDone()) { + ChannelPromise promise = channel.newPromise(); + // 进入NioEventLoop的初始化 + doBind0(regFuture, channel, localAddress, promise); + return promise; + } else { + // Registration future is almost always fulfilled already, but just in case it's not. + final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel); + regFuture.addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + Throwable cause = future.cause(); + if (cause != null) { + // Registration on the EventLoop failed so fail the ChannelPromise directly to not cause an + // IllegalStateException once we try to access the EventLoop of the Channel. + promise.setFailure(cause); + } else { + // Registration was successful, so set the correct executor to use. + // See https://github.com/netty/netty/issues/2586 + promise.registered(); + + doBind0(regFuture, channel, localAddress, promise); + } + } + }); + return promise; + } + } +``` + +AbstractBootstrap.java +```java + private static void doBind0( + final ChannelFuture regFuture, final Channel channel, + final SocketAddress localAddress, final ChannelPromise promise) { + + channel.eventLoop().execute(new Runnable() { + @Override + public void run() { + if (regFuture.isSuccess()) { + channel.bind(localAddress, promise).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); + } else { + promise.setFailure(regFuture.cause()); + } + } + }); + } +``` + +SingleThreadEventExecutor#execute +```java + @Override + public void execute(Runnable task) { + if (task == null) { + throw new NullPointerException("task"); + } + + boolean inEventLoop = inEventLoop(); + addTask(task); + if (!inEventLoop) { + startThread(); + if (isShutdown()) { + boolean reject = false; + try { + if (removeTask(task)) { + reject = true; + } + } catch (UnsupportedOperationException e) { + // The task queue does not support removal so the best thing we can do is to just move on and + // hope we will be able to pick-up the task before its completely terminated. + // In worst case we will log on termination. + } + if (reject) { + reject(); + } + } + } + + if (!addTaskWakesUp && wakesUpForTask(task)) { + wakeup(inEventLoop); + } + } + + private void startThread() { + if (state == ST_NOT_STARTED) { + if (STATE_UPDATER.compareAndSet(this, ST_NOT_STARTED, ST_STARTED)) { + boolean success = false; + try { + doStartThread(); + success = true; + } finally { + if (!success) { + STATE_UPDATER.compareAndSet(this, ST_STARTED, ST_NOT_STARTED); + } + } + } + } + } + + private void doStartThread() { + assert thread == null; + executor.execute(new Runnable() { + @Override + public void run() { + thread = Thread.currentThread(); + if (interrupted) { + thread.interrupt(); + } + + boolean success = false; + updateLastExecutionTime(); + try { + SingleThreadEventExecutor.this.run(); + success = true; + } catch (Throwable t) { + logger.warn("Unexpected exception from an event executor: ", t); + } finally { + for (;;) { + int oldState = state; + if (oldState >= ST_SHUTTING_DOWN || STATE_UPDATER.compareAndSet( + SingleThreadEventExecutor.this, oldState, ST_SHUTTING_DOWN)) { + break; + } + } + + // Check if confirmShutdown() was called at the end of the loop. + if (success && gracefulShutdownStartTime == 0) { + if (logger.isErrorEnabled()) { + logger.error("Buggy " + EventExecutor.class.getSimpleName() + " implementation; " + + SingleThreadEventExecutor.class.getSimpleName() + ".confirmShutdown() must " + + "be called before run() implementation terminates."); + } + } + + try { + // Run all remaining tasks and shutdown hooks. + for (;;) { + if (confirmShutdown()) { + break; + } + } + } finally { + try { + cleanup(); + } finally { + // Lets remove all FastThreadLocals for the Thread as we are about to terminate and notify + // the future. The user may block on the future and once it unblocks the JVM may terminate + // and start unloading classes. + // See https://github.com/netty/netty/issues/6596. + FastThreadLocal.removeAll(); + + STATE_UPDATER.set(SingleThreadEventExecutor.this, ST_TERMINATED); + threadLock.countDown(); + if (logger.isWarnEnabled() && !taskQueue.isEmpty()) { + logger.warn("An event executor terminated with " + + "non-empty task queue (" + taskQueue.size() + ')'); + } + terminationFuture.setSuccess(null); + } + } + } + } + }); + } +``` + +就这样,调用了NioEventLoop的run方法,进行了NioEventLoop启动 +NioEventLoop#run +```java + @Override + protected void run() { + for (;;) { + try { + try { + switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { + case SelectStrategy.CONTINUE: + continue; + + case SelectStrategy.BUSY_WAIT: + // fall-through to SELECT since the busy-wait is not supported with NIO + + case SelectStrategy.SELECT: + select(wakenUp.getAndSet(false)); + + // 'wakenUp.compareAndSet(false, true)' is always evaluated + // before calling 'selector.wakeup()' to reduce the wake-up + // overhead. (Selector.wakeup() is an expensive operation.) + // + // However, there is a race condition in this approach. + // The race condition is triggered when 'wakenUp' is set to + // true too early. + // + // 'wakenUp' is set to true too early if: + // 1) Selector is waken up between 'wakenUp.set(false)' and + // 'selector.select(...)'. (BAD) + // 2) Selector is waken up between 'selector.select(...)' and + // 'if (wakenUp.get()) { ... }'. (OK) + // + // In the first case, 'wakenUp' is set to true and the + // following 'selector.select(...)' will wake up immediately. + // Until 'wakenUp' is set to false again in the next round, + // 'wakenUp.compareAndSet(false, true)' will fail, and therefore + // any attempt to wake up the Selector will fail, too, causing + // the following 'selector.select(...)' call to block + // unnecessarily. + // + // To fix this problem, we wake up the selector again if wakenUp + // is true immediately after selector.select(...). + // It is inefficient in that it wakes up the selector for both + // the first case (BAD - wake-up required) and the second case + // (OK - no wake-up required). + + if (wakenUp.get()) { + selector.wakeup(); + } + // fall through + default: + } + } catch (IOException e) { + // If we receive an IOException here its because the Selector is messed up. Let's rebuild + // the selector and retry. https://github.com/netty/netty/issues/8566 + rebuildSelector0(); + handleLoopException(e); + continue; + } + + cancelledKeys = 0; + needsToSelectAgain = false; + final int ioRatio = this.ioRatio; + if (ioRatio == 100) { + try { + processSelectedKeys(); + } finally { + // Ensure we always run tasks. + runAllTasks(); + } + } else { + final long ioStartTime = System.nanoTime(); + try { + processSelectedKeys(); + } finally { + // Ensure we always run tasks. + final long ioTime = System.nanoTime() - ioStartTime; + runAllTasks(ioTime * (100 - ioRatio) / ioRatio); + } + } + } catch (Throwable t) { + handleLoopException(t); + } + // Always handle shutdown even if the loop processing threw an exception. + try { + if (isShuttingDown()) { + closeAll(); + if (confirmShutdown()) { + return; + } + } + } catch (Throwable t) { + handleLoopException(t); + } + } + } +``` + + +## 5. NioEventLoop执行逻辑 diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" new file mode 100644 index 0000000..d969cdd --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" @@ -0,0 +1,183 @@ +## 1. 回顾BIO和NIO + +show you the code! TODO + +BIO流程图如下: + +![first-netty01](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-01.png) + +BIO缺陷: + +1. BIO中,作为服务端开发,使用ServerSocket 绑定端口号之后会监听该端口,等待accept事件,accept是会阻塞当前线程; +2. 当我们收到accept事件的时候,程序就会拿到客户端与当前服务端连接的Socket,针对这个socket我们可以进行读写,但是呢,这个socket读写都是会阻塞当前线程的; +3. 一般我们会有使用多线程方式进行c/s交互,但是这样很难做到C10K(比如说:1W个客户端就需要和服务端用1W个线程支持,这样的话CPU肯定就爆炸了,同时线程上下文切换也会把机器负载给拉飞) + +NIO流程图如下: + +![first-netty02](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-02.png) + +针对BIO的以上不足,NIO提供了解决方案,即NIO提供的selector。在NIO中,提供一个selector用于监听客户端socket的连接事件,当有socket连接进来之后,就需要把检查的客户端socket注册到这个selector中,对于客户端socket来说,其线程就阻塞在了selector的select方法中,此时客户端程序该干啥干啥,不需要像BIO一样维护一个长连接去等待事件。 + +只有当客户端的selector发现socket就绪了有事件了,才会唤醒线程去处理就绪状态的socket。 + + +当然,NIO也有许多的不足,归纳为以下几点: +1. NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等; +2. 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序; +3. 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等; +4. JDK NIO 的 Bug:例如臭名昭著的 Epoll Bug,它会导致 Selector 空轮询,最终导致 CPU100%。直到 JDK1.7 版本该问题仍旧存在,没有被根本解决; + +## 2. Why Netty?What is Netty? + +为什么出现Netty? +Netty 对 JDK 自带的 NIO 的 API 进行了封装,解决了上述问题。 + +1. 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型-单线程,一个或多个线程池; +2. 使用方便:详细记录的 Javadoc,用户指南和示例; +3. 高性能、吞吐量更高:延迟更低;减少资源消耗;最小化不必要的内存复制; +4. 安全:完整的 SSL/TLS 和 StartTLS 支持; +5. 社区活跃、不断更新:社区活跃,版本迭代周期短,发现的 Bug 可以被及时修复,同时,更多的新功能会被加入; + +Netty是什么? + +1. Netty是一个异步的、基于事件驱动的网络应用框架,可以用于快速开发高性能、高可靠的网络IO程序; +2. Netty 主要针对在 TCP 协议下,面向 Client 端的高并发应用,或者 Peer-to-Peer 场景下的大量数据持续传输的应用; +3. Netty 本质是一个 NIO 框架,Netty在NIO基础上进行了二次封装,所以学习Netty之前得了解NIO基础知识; +4. Netty是作为许多开源框架的底层,例如:Dubbo、RocketMQ、ElasticSearch等 + + + +## 3. Netty为什么性能这么高呢? + +小伙伴肯定会非常好奇,Netty为什么能作为这么多优秀框架的底层实现?Netty为什么这么高性能? + +Netty的高性能主要可以总结为如下几点: + +1. Netty作为异步事件驱动的网络,高性能之处主要来自于其I/O模型和线程处理模型,不同于传统BIO,客户端的连接以及事件处理都阻塞在同一个线程里,Netty则将客户端的线程和处理客户端的线程分离开来;(高效的Reactor线程模型) +2. Netty的IO线程NioEventLoop由于聚合了多路复用器Selector,可以同时并发处理成百上千个客户端连接;(IO多路复用模型) +3. Netty底层还实现了零拷贝,避免了IO过程中数据在操作系统底层来回”无效的“拷贝和系统态切换;(零拷贝) +4. 无锁串行化设计,串行设计:消息的处理尽可能在一个线程内完成,期间不进行线程切换,避免了多线程竞争和同步锁的使用;(单线程) +5. Netty 默认提供了对Google Protobuf 的支持,通过扩展Netty 的编解码接口,可以实现其它的高性能序列化框架(高性能的序列化框架) +6. Netty中大量使用了volatile,读写锁,CAS和原子类;(高效并发编程) +7. Netty的内存分配管理实现非常高效,Netty内存管理分为了池化(Pooled)和非池化(UnPooled),heap(堆内内存)和direct(堆外内存),对于Netty默认使用的是池化内存管理,其内部维护了一个内存池可以循环的创建ByteBuf(Netty底层实现的一个Buffer),提升了内存的使用效率,降低由于高负载导致的频繁GC。同时Netty底层实现了jemalloc算法(jemalloc3实现的满二叉树,读内存进行一个分隔、jemalloc4则优化了jemalloc3的算法,实现了将内存切割成了一个二维数组维护的一个数据结构,提升了内存的使用率)(Netty内存管理非常高效) + +基于以上的这么多的优点,是非常推荐阅读Netty底层源码。 + +TODO + +## 4. 线程模型基本介绍 + +1. 不同的线程模式,对程序的性能有很大影响,为了搞清 Netty 线程模式,我们来系统的讲解下各个线程模式,最后看看 Netty 线程模型有什么优越性; +2. 目前存在的线程模型有:传统阻塞 I/O 服务模型 和Reactor 模式; +3. 根据 Reactor 的数量和处理资源池线程的数量不同,有 3 种典型的实现: + - 单Reactor单线程; + - 单Reactor多线程; + - 主从Reactor多线程; +4. Netty 线程模式(Netty 主要基于主从 Reactor 多线程模型做了一定的改进,其中主从 Reactor 多线程模型有多个 Reactor) + +### 4.1 传统BIO线程模型 + +![first-netty03](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-03.png) + +模型特点 +1. 采用阻塞 IO 模式获取输入的数据; +2. 每个连接都需要独立的线程完成数据的输入,业务处理,数据返回; + +问题分析 +1. 当并发数很大,就会创建大量的线程,占用很大系统资源; +2. 连接创建后,如果当前线程暂时没有数据可读,该线程会阻塞在 Handler对象中的read 操作,导致上面的处理线程资源浪费; + +### 4.2 Reactor 模式(单Reactor单线程) + +I/O 复用结合线程池,就是 Reactor 模式基本设计思想,如图: +![first-netty04](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-04.png) + +针对传统阻塞 I/O 服务模型的 2 个缺点,解决方案: + +基于 I/O 多路复用模型:多个连接共用一个阻塞对象ServiceHandler,应用程序只需要在一个阻塞对象等待,无需阻塞等待所有连接。当某个连接有新的数据可以处理时,操作系统通知应用程序,线程从阻塞状态返回,开始进行业务处理。 + +1. 基于线程池复用线程资源:不必再为每个连接创建线程,将连接完成后的业务处理任务分配给线程进行处理,一个线程可以处理多个连接的业务。(解决了当并发数很大时,会创建大量线程,占用很大系统资源) +2. 基于 I/O 复用模型:多个客户端进行连接,先把连接请求给ServiceHandler。多个连接共用一个阻塞对象ServiceHandler。假设,当C1连接没有数据要处理时,C1客户端只需要阻塞于ServiceHandler,C1之前的处理线程便可以处理其他有数据的连接,不会造成线程资源的浪费。当C1连接再次有数据时,ServiceHandler根据线程池的空闲状态,将请求分发给空闲的线程来处理C1连接的任务。(解决了线程资源浪费的那个问题) + +由上引出单Reactor单线程模型图: +![first-netty05](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-05.png) + +方案说明 +1. select 是前面 I/O 复用模型介绍的标准网络编程 API,可以实现应用程序通过一个select方法来监听多路连接请求 +2. Reactor 对象通过 Select 监控客户端请求事件,收到事件后通过 Dispatch 进行分发 +3. 如果是建立连接请求事件,则由 Acceptor 通过 Accept 处理连接请求,然后创建一个 Handler 对象处理连接完成后的后续业务处理 +4. 如果不是建立连接事件,则 Reactor 会分发调用连接对应的 Handler 来响应 +5. Handler 会完成 Read → 业务处理 → Send 的完整业务流程 + +优缺点分析 +1. 优点:模型简单,没有多线程、进程通信、竞争的问题,全部都在一个线程中完成 +2. 缺点:性能问题,只有一个线程,无法完全发挥多核 CPU 的性能。Handler在处理某个连接上的业务时,整个进程无法处理其他连接事件,很容易导致性能瓶颈 +3. 缺点:可靠性问题,线程意外终止,或者进入死循环,会导致整个系统通信模块不可用,不能接收和处理外部消息,造成节点故障 +4. 使用场景:客户端的数量有限,业务处理非常快速,比如 Redis 在业务处理的时间复杂度 O(1) 的情况 + +### 4.3 单Reactor多线程 + +![first-netty06](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-06.png) + +方案说明 +1. Reactor 对象通过 Select 监控客户端请求事件,收到事件后,通过 Dispatch 进行分发 +2. 如果是建立连接请求,则由 Acceptor 通过 accept 处理连接请求,然后创建一个 Handler 对象处理完成连接后的各种事件 +3. 如果不是连接请求,则由 Reactor 分发调用连接对应的 handler 来处理(也就是说连接已经建立,后续客户端再来请求,那基本就是数据请求了,直接调用之前为这个连接创建好的handler来处理) +4. handler 只负责响应事件,不做具体的业务处理(这样不会使handler阻塞太久),通过 read 读取数据后,会分发给后面的 worker 线程池的某个线程处理业务。【业务处理是最费时的,所以将业务处理交给线程池去执行】 +5. worker 线程池会分配独立线程完成真正的业务,并将结果返回给 handler +6. handler 收到响应后,通过 send 将结果返回给 client + +优缺点分析 +1. 优点:可以充分的利用多核 cpu 的处理能力 +2. 缺点:多线程数据共享和访问比较复杂。Reactor 承担所有的事件的监听和响应,它是单线程运行,在高并发场景容易出现性能瓶颈。也就是说Reactor主线程承担了过多的事 + +### 4.4 主从Reactor多线程 + +针对单 Reactor 多线程模型中,Reactor 在单线程中运行,高并发场景下容易成为性能瓶颈,可以让 Reactor 在多线程中运行 +![first-netty07](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-07.png) + +SubReactor是可以有多个的,如果只有一个SubReactor的话那和单 Reactor 多线程就没什么区别了。 + +方案分析 +1. Reactor 主线程 MainReactor 对象通过 select 监听连接事件,收到事件后,通过 Acceptor 处理连接事件 +2. 当 Acceptor 处理连接事件后,MainReactor 将连接分配给 SubReactor +3. subreactor 将连接加入到连接队列进行监听,并创建 handler 进行各种事件处理 +4. 当有新事件发生时,subreactor 就会调用对应的 handler 处理 +5. handler 通过 read 读取数据,分发给后面的 worker 线程处理 +6. worker 线程池分配独立的 worker 线程进行业务处理,并返回结果 +7. handler 收到响应的结果后,再通过 send 将结果返回给 client +8. Reactor 主线程可以对应多个 Reactor 子线程,即 MainRecator 可以关联多个 SubReactor + +方案优缺点分析 +1. 优点:父线程与子线程的数据交互简单职责明确,父线程只需要接收新连接,子线程完成后续的业务处理。 +2. 优点:父线程与子线程的数据交互简单,Reactor 主线程只需要把新连接传给子线程,子线程无需返回数据。 +3. 缺点:编程复杂度较高 + + +这种主从多线程模型在许多优秀的框架中都使用到了,包括Nginx主从Reactor多线程模型,Netty主从多线程模型等。 + +对于Reactor模式,小结一下: +1. 响应快,不必为单个同步时间所阻塞,虽然 Reactor 本身依然是同步的(比如你第一个SubReactor阻塞了,我可以调下一个 SubReactor为客户端服务) +2. 可以最大程度的避免复杂的多线程及同步问题,并且避免了多线程/进程的切换开销 +3. 扩展性好,可以方便的通过增加 Reactor 实例个数来充分利用 CPU 资源 +4. 复用性好,Reactor 模型本身与具体事件处理逻辑无关,具有很高的复用性 + +### 4.5 Netty中的线程模型 + +![first-netty08](https://coderbruis.github.io/javaDocs/img/netty/source/first-netty-08.png) + +Netty线程模型流程分析 +1. Netty 抽象出两组线程池 ,BossGroup 专门负责接收客户端的连接,WorkerGroup 专门负责网络的读写 +2. BossGroup 和 WorkerGroup 类型都是 NioEventLoopGroup +3. NioEventLoopGroup 相当于一个事件循环组,这个组中含有多个事件循环,每一个事件循环是 NioEventLoop +4. NioEventLoop 表示一个不断循环的执行处理任务的线程,每个 NioEventLoop 都有一个 Selector,用于监听绑定在其上的 socket 的网络通讯 +5. NioEventLoopGroup 可以有多个线程,即可以含有多个 NioEventLoop +6. 每个 BossGroup下面的NioEventLoop 循环执行的步骤有 3 步 + - 轮询 accept 事件 + - 处理 accept 事件,与 client 建立连接,生成 NioScocketChannel,并将其注册到某个 workerGroup NIOEventLoop 上的 Selector + - 继续处理任务队列的任务,即 runAllTasks +7. 每个 WorkerGroup NIOEventLoop 循环执行的步骤 + - 轮询 read,write 事件 + - 处理 I/O 事件,即 read,write 事件,在对应 NioScocketChannel 处理 + - 处理任务队列的任务,即 runAllTasks +8. 每个 Worker NIOEventLoop 处理业务时,会使用 pipeline(管道),pipeline 中包含了 channel(通道),即通过 pipeline 可以获取到对应通道,管道中维护了很多的处理器 \ No newline at end of file From b1748fb941212aa44c1feb85860a9158b90c600a Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 15 Aug 2021 09:04:55 +0800 Subject: [PATCH 32/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0netty=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 3e757b4..3c523d8 100644 --- a/README.md +++ b/README.md @@ -126,9 +126,9 @@ SpringCloud源码 - Dubbo底层源码学习(七)—— Dubbo的服务消费 - Netty底层源码解析 - - Netty底层源码解析-初始Netty及其架构 - - Netty底层源码解析-Netty服务端启动分析 - - Netty底层源码解析-NioEventLoop原理分析 + - [Netty底层源码解析-初始Netty及其架构](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-%E5%88%9D%E5%A7%8BNetty%E5%8F%8A%E5%85%B6%E6%9E%B6%E6%9E%84.md) + - [Netty底层源码解析-Netty服务端启动分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Netty%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90.md) + - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - Netty底层源码解析-Channel分析 - Netty底层源码解析-ChannelPipeline分析(上) - Netty底层源码解析-ChannelPipeline分析(下) From aa8cf9bd311eb07585c84a2d43aca859638b7812 Mon Sep 17 00:00:00 2001 From: Bruis Date: Sun, 22 Aug 2021 23:58:49 +0800 Subject: [PATCH 33/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AE=BFRocket?= =?UTF-8?q?=E5=BF=83=E8=B7=B3=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Spring-Netty/pom.xml | 6 ++ .../netty/heartbeat/ClientTest.java | 100 ++++++++++++++++++ .../netty/heartbeat/NettyDecoder.java | 40 +++++++ .../netty/heartbeat/NettyEncoder.java | 39 +++++++ .../netty/heartbeat/RemotingCommand.java | 87 +++++++++++++++ .../netty/heartbeat/RemotingSerializable.java | 50 +++++++++ .../netty/heartbeat/SerializeType.java | 28 +++++ .../netty/heartbeat/ServerTest.java | 55 ++++++++++ 8 files changed, 405 insertions(+) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ClientTest.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyDecoder.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyEncoder.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingSerializable.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/SerializeType.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ServerTest.java diff --git a/Spring-Netty/pom.xml b/Spring-Netty/pom.xml index 14ee73a..d640f68 100644 --- a/Spring-Netty/pom.xml +++ b/Spring-Netty/pom.xml @@ -38,6 +38,12 @@ ${netty-all.version} + + com.alibaba + fastjson + 1.2.76 + + diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ClientTest.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ClientTest.java new file mode 100644 index 0000000..cd1d1d8 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ClientTest.java @@ -0,0 +1,100 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.util.concurrent.DefaultEventExecutorGroup; + +import java.net.InetSocketAddress; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @author lhy + * @date 2021/8/19 + */ +public class ClientTest { + + public static final EventLoopGroup myEventLoopGroup = new NioEventLoopGroup(1, new ThreadFactory() { + + private AtomicInteger threadIndex = new AtomicInteger(0); + + @Override + public Thread newThread(Runnable r) { + return new Thread(r, String.format("MyNettyClientSelector_%d", this.threadIndex.incrementAndGet())); + } + }); + + public static final DefaultEventExecutorGroup nettyHandlerExecutorGroup = new DefaultEventExecutorGroup(1, + new ThreadFactory() { + private AtomicInteger threadIndex = new AtomicInteger(0); + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "nettyHandlerThread_" + this.threadIndex.incrementAndGet()); + } + }); + + public static final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + Thread thread = new Thread(r, "scheduledThread_"); + thread.setDaemon(false); + return thread; + } + }); + + public static void main(String[] args) { + + Bootstrap bootstrap = new Bootstrap() + .group(myEventLoopGroup) + .channel(NioSocketChannel.class) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.SO_KEEPALIVE, false) + .option(ChannelOption.SO_SNDBUF, 65535) + .option(ChannelOption.SO_RCVBUF, 65535) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(nettyHandlerExecutorGroup, + new NettyEncoder(), + new NettyDecoder(), + new ConnectResponseHandler()); + } + }); + + InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1", 9090); + + final ChannelFuture channelFuture = bootstrap.connect(inetSocketAddress); + + if (channelFuture.awaitUninterruptibly(2, TimeUnit.MINUTES)) { +// heartBeat(channelFuture.channel()); + scheduledExecutorService.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + heartBeat(channelFuture.channel()); + } + }, 1000, 30 * 1000, TimeUnit.MILLISECONDS); + } + } + + public static void heartBeat(Channel channel) { + String request = "客户端发起了心跳请求"; + RemotingCommand command= new RemotingCommand(); + command.setBody(request.getBytes()); + command.setCode(1); + channel.writeAndFlush(command); + } + + public static class ConnectResponseHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext ctx, RemotingCommand msg) throws Exception { + System.out.println("服务端返回消息了:" + new String(msg.getBody())); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyDecoder.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyDecoder.java new file mode 100644 index 0000000..81be993 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyDecoder.java @@ -0,0 +1,40 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; + +import java.nio.ByteBuffer; + +/** + * @author lhy + * @date 2021/8/19 + */ +public class NettyDecoder extends LengthFieldBasedFrameDecoder { + + public NettyDecoder() { + super(16777216, 0, 4, 0, 4); + } + + @Override + protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { + ByteBuf frame = null; + + try { + frame = (ByteBuf) super.decode(ctx, in); + if (null == frame) { + return null; + } + ByteBuffer byteBuffer = frame.nioBuffer(); + return RemotingCommand.decode(byteBuffer); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != frame) { + frame.release(); + } + } + + return null; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyEncoder.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyEncoder.java new file mode 100644 index 0000000..1a7fd50 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/NettyEncoder.java @@ -0,0 +1,39 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +import java.nio.ByteBuffer; + +/** + * @author lhy + * @date 2021/8/19 + */ +@ChannelHandler.Sharable +public class NettyEncoder extends MessageToByteEncoder { + + @Override + protected void encode(ChannelHandlerContext ctx, RemotingCommand remotingCommand, ByteBuf out) throws Exception { + try { + ByteBuffer header = remotingCommand.encodeHeader(); + out.writeBytes(header); + byte[] body = remotingCommand.getBody(); + if (null != body) { + out.writeBytes(body); + } +// out.writeBytes(remotingCommand.getBody()); + } catch (Exception e) { + e.printStackTrace(); + ctx.channel().close().addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + // 关闭channel成功 + } + }); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingCommand.java new file mode 100644 index 0000000..6bf9aa9 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingCommand.java @@ -0,0 +1,87 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import java.nio.ByteBuffer; + +/** + * @author lhy + * @date 2021/8/19 + */ +public class RemotingCommand { + + private Integer code; // 请求码 + + private byte[] body; // 请求内容 + + public static RemotingCommand decode(final ByteBuffer byteBuffer) { + int limit = byteBuffer.limit(); + + int oriHeaderLen = byteBuffer.getInt(); + int headerLength = getHeaderLength(oriHeaderLen); + + byte[] headerData = new byte[headerLength]; + byteBuffer.get(headerData); + + int bodyLength = limit - 4 - headerLength; + + byte[] body = new byte[bodyLength]; + byteBuffer.get(body); + RemotingCommand remotingCommand = new RemotingCommand(); + remotingCommand.setBody(body); + return remotingCommand; + } + + public ByteBuffer encodeHeader() { + return encodeHeader(this.body.length); + } + + public ByteBuffer encodeHeader(final int bodyLength) { + int length = 4; + + byte[] headerData; + headerData = this.headerEncode(); + length += headerData.length; // 头 + length += bodyLength; // 请求/响应体 + + ByteBuffer result = ByteBuffer.allocate(4 + length - bodyLength); // 分配header + result.putInt(length); + result.put(markProtocolType(headerData.length, SerializeType.JSON)); + result.put(headerData); // 添加头 + result.flip(); + + return result; + } + + public static byte[] markProtocolType(int source, SerializeType type) { + byte[] result = new byte[4]; + + result[0] = type.getCode(); + result[1] = (byte) ((source >> 16) & 0xFF); + result[2] = (byte) ((source >> 8) & 0xFF); + result[3] = (byte) (source & 0xFF); + return result; + } + + private byte[] headerEncode() { + return RemotingSerializable.encode(this); + } + + public static int getHeaderLength(int length) { + return length & 0xFFFFFF; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public byte[] getBody() { + return body; + } + + public void setBody(byte[] body) { + this.body = body; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingSerializable.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingSerializable.java new file mode 100644 index 0000000..2dca4f3 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/RemotingSerializable.java @@ -0,0 +1,50 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import com.alibaba.fastjson.JSON; + +import java.nio.charset.Charset; + +/** + * @author lhy + * @date 2021/8/19 + */ +public abstract class RemotingSerializable { + private final static Charset CHARSET_UTF8 = Charset.forName("UTF-8"); + + public static byte[] encode(final Object obj) { + final String json = toJson(obj, false); + if (json != null) { + return json.getBytes(CHARSET_UTF8); + } + return null; + } + + public static String toJson(final Object obj, boolean prettyFormat) { + return JSON.toJSONString(obj, prettyFormat); + } + + public static T decode(final byte[] data, Class classOfT) { + final String json = new String(data, CHARSET_UTF8); + return fromJson(json, classOfT); + } + + public static T fromJson(String json, Class classOfT) { + return JSON.parseObject(json, classOfT); + } + + public byte[] encode() { + final String json = this.toJson(); + if (json != null) { + return json.getBytes(CHARSET_UTF8); + } + return null; + } + + public String toJson() { + return toJson(false); + } + + public String toJson(final boolean prettyFormat) { + return toJson(this, prettyFormat); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/SerializeType.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/SerializeType.java new file mode 100644 index 0000000..6187252 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/SerializeType.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.netty.heartbeat; + +/** + * @author lhy + * @date 2021/8/20 + */ +public enum SerializeType { + JSON((byte) 0); + + private byte code; + + SerializeType(byte code) { + this.code = code; + } + + public static SerializeType valueOf(byte code) { + for (SerializeType serializeType : SerializeType.values()) { + if (serializeType.getCode() == code) { + return serializeType; + } + } + return null; + } + + public byte getCode() { + return code; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ServerTest.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ServerTest.java new file mode 100644 index 0000000..4753a2e --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/heartbeat/ServerTest.java @@ -0,0 +1,55 @@ +package com.bruis.learnnetty.netty.heartbeat; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.*; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +/** + * @author lhy + * @date 2021/8/19 + */ +public class ServerTest { + public static void main(String[] args) throws InterruptedException { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup=new NioEventLoopGroup(); + ServerBootstrap serverBootstrap=new ServerBootstrap(); + serverBootstrap.group(bossGroup,workerGroup) + .channel(NioServerSocketChannel.class) + //设置线程队列中等待连接的个数 + .option(ChannelOption.SO_BACKLOG,128) + .option(ChannelOption.SO_REUSEADDR, true) + .childOption(ChannelOption.TCP_NODELAY, true) + .childOption(ChannelOption.SO_SNDBUF, 65535) + .childOption(ChannelOption.SO_RCVBUF, 65535) + .childOption(ChannelOption.SO_KEEPALIVE,true) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel nioSocketChannel) throws Exception { + nioSocketChannel.pipeline() + .addLast(new NettyEncoder(), + new NettyDecoder(), + new ConnectServerHandler()); + + } + }); + + ChannelFuture future = serverBootstrap.bind(9090).sync(); + future.channel().closeFuture().sync(); + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + + public static class ConnectServerHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, RemotingCommand msg) throws Exception { + System.out.println("Server服务端:" + new String(msg.getBody())); + RemotingCommand response = new RemotingCommand(); + response.setBody("接受到请求了".getBytes()); + response.setCode(0); + ctx.writeAndFlush(response); + } + } +} From 5215ce44b0bb5eb20c943dff45f4560640671da8 Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 22:08:33 +0800 Subject: [PATCH 34/68] =?UTF-8?q?=E6=96=B0=E5=A2=9EchannelPipeline?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- Spring-Netty/learnnetty.iml | 1 + ...20\357\274\210\344\270\213\357\274\211.md" | 848 ++++++++++++++++++ ...37\347\220\206\345\210\206\346\236\220.md" | 2 + 4 files changed, 852 insertions(+), 1 deletion(-) create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" diff --git a/README.md b/README.md index 3c523d8..ade13ba 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ SpringCloud源码 - [Netty底层源码解析-Netty服务端启动分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Netty%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90.md) - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - Netty底层源码解析-Channel分析 - - Netty底层源码解析-ChannelPipeline分析(上) + - [Netty底层源码解析-ChannelPipeline分析(上)]() - Netty底层源码解析-ChannelPipeline分析(下) - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 diff --git a/Spring-Netty/learnnetty.iml b/Spring-Netty/learnnetty.iml index 3dc1096..8cc03a7 100644 --- a/Spring-Netty/learnnetty.iml +++ b/Spring-Netty/learnnetty.iml @@ -93,5 +93,6 @@ + \ No newline at end of file diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" new file mode 100644 index 0000000..706e68c --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" @@ -0,0 +1,848 @@ +## 1. 概览 + +在Netty中,ChannelPipeline和ChannelHandler类似于Servlet和Filter过滤器,这类拦截器实际上是责任链模式的一种变形,这么设计是为了方便事件的拦截和用户业务逻辑的定制。 + +Servlet和Filter是JAVAEE中的基础组件,初学JAVAEE的小伙伴再熟悉不过了,它能够拦截到HTTP请求以及响应,并读出请求和响应的数据用作业务逻辑的处理,通过这种方式Servlet和Filter可以对Web应用程序进行预处理和后置处理。 + +Netty的Channel过滤器实现原理与ServletFilter机制一致,它将Channel的数据管道抽象为ChannelPipeline, 消息在ChannelPipeline中流动和传递。ChannelPipeline 持有I/O事件拦截器ChannelHandler的链表,由ChanneIHandler对I/O事件进行拦截和处理,可以方便地通过新增和删除ChannelHandler来实现不同的业务逻辑定制,不需要对已有的ChannelHandler进行修改,能够实现对修改封闭和对扩展的支持。总的而言,在Netty中,pipeline相当于Netty的大动脉,负责Netty的读写事件的传播。 + +## 2. ChannelPipeline原理分析 + +ChannelPipeline是ChannelHandler的容器,它负责ChannelHandler的管理和事件拦截。下面用一张图来展示在Netty中,一个“消息”被ChannelPipeline拦截,然后被ChannelHandler处理的过程,流程如下: + +![ChannelPipeline01](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline01.png) + +1) 底层的SocketChannel read(方法读取ByteBuf, 触发ChannelRead 事件,由I/O线程NioEventLoop 调用ChannelPipeline 的fireChannelRead(Object msg)方法, 将消息 +(ByteBuf)传输到ChannelPipeline中 +2) 消息依次被HeadHandler、ChannelHandler1、 ChannelHander2.....TailHandler 拦截和处理,在这个过程中,任何ChannelHandler都可以中断当前的流程,结束消息的传递 +3) 调用ChannelHandlerContext的write方法发送消息,消息从TailHandler开始,途经ChannelHanderN.....ChannelHandlerl. HeadHandler, 最终被添加到消息发送缓冲区中等待刷新和发送,在此过程中也可以中断消息的传递,例如当编码失败时,就需要中断流程,构造异常的Future返回 + + +Netty中的事件分为inbound事件和outbound事件.inbound事件通常由1/O线程触发,例如TCP链路建立事件、链路关闭事件、读事件、异常通知事件等,它对应上图的左半部分。 + +触发inbound事件的方法如下: + +1) ChannelHandlerContext#fireChannelRegistered(): Channel 注册事件 +2) ChannelHandlerContext#fireChannelActive(): TCP链路建立成功, Channel激活事件 +3) ChannelHandlerContext#fireChannelRead(Object): 读事件 +4) ChannelHandlerContext#fireChannelReadComplete(): 读操作完成通知事件; +5) ChannelHandlerContext#fireExceptionCaught(Throwable): 异常通知事件; +6) ChannelHandlerContext#fireUserEventTriggered(Object): 用户自定义事件: +7) ChannelHandlerContext#fireChannelWritabilityChanged(): Channel 的可写状态变化通知事件; +8) ChannelHandlerContext#fireChannellnactive(): TCP连接关闭,链路不可用通知事件。 + +Outbound事件通常是由用户主动发起的网络I/O操作,例如用户发起的连接操作、绑定操作、消息发送等操作,它对应上图的右半部分。 + +触发outbound事件的方法如下: + +1) ChannelHandlerContext#bind( SocketAddress, ChannelPromise):绑定本地地址事件 +2) ChannelHandlerContext#connect(SocketAddress, SocketAddress, ChannelPromise):连接服务端事件 +3) ChannelHandlerContext#write(Object, ChannelPromise):发送事件 +4) ChannelHandlerContext#flushO): 刷新事件 +5) ChannelHandlerContext#read(): 读事件 +6) ChannelHandlerContext#disconnect(ChannelPromise): 断开连接事件 +7) ChannelHandlerContext#close(ChannelPromise): 关闭当前Channel事件 + + +### 2.1 ChannelPipeline接口 + +为了接下来能够方便的学习原理以及阅读源码,我们先看下ChannelPipeline的接口的继承关系图: + +!["ChannelPipeline02"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline02.png) + +可以发现,ChannelPipeline接口还继承了ChannelOutboundInvoker以及ChannelInboundInvoker,这两个invoker接口作为ChannelPipeline接口的增强接口。分别看下ChannelPipeline和ChannelOutboundInvoker、ChannelInboundInvoker这三个接口定义。 + +对于ChannelPipeline接口,方法分别可以分为以下几组类别方法: + +第一组是向ChannelPipeline中添加ChannelHandler,如下图所示: + +!["ChannelPipeline03_01"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline03_01.png) + +> 这里需要提前知道的是,ChannelPipeline维护这一组双向链表的数据结构。 + +addFirst是向ChannelPipeline双向链表头补添加节点,addLast是向ChannelPipeline双向链表尾部添加节点,addBefore是向ChannelPipeline双向链表中指定的ChannelHandler之前添加一个新的节点,addAfter是向ChannelPipeline双向链表中指定的ChannelHandler之后添加一个节点。 + + +第二组是向ChannelPipeline中移除ChannelHandler + +!["ChannelPipeline03_02"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline03_02.png) + + + +第三组是向获取ChannelHandlerContext对象 + +!["ChannelPipeline03_03"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline03_03.png) + + +第四组是ChannelInboundInvoker接口增强而来的方法 +!["ChannelPipeline03_04"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline03_04.png) + + + +第五组是ChannelOutboundInvoker接口增强而来的方法 +!["ChannelPipeline03_05"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline03_05.png) + + +在Netty中,ChannelPipeline是一个双向链表的数据结构,那么链表节点是什么呢?答案就是ChannelHandlerContext对象。 + +在Netty中,ChannelHandlerContext对象就是存在ChannelPipeline双向链表中的节点元素,在ChannelPipeline中,Netty会为其初始化Head头结点和Tail尾结点,在ChannelPipeline实现类:DefaultChannelPipeline中可以看到定义: + +```java + final AbstractChannelHandlerContext head; + final AbstractChannelHandlerContext tail; +``` + +DefaultChannelPipeline构造方法中,对head和tail进行了初始化 + +```java + protected DefaultChannelPipeline(Channel channel) { + // 给channel赋值channel对象 + this.channel = ObjectUtil.checkNotNull(channel, "channel"); + succeededFuture = new SucceededChannelFuture(channel, null); + voidPromise = new VoidChannelPromise(channel, true); + + // 节点对象是AbstractChannelHandlerContext对象,是用于进行业务处理 + // HeadContext和TailContext就是用户可以模仿实现的ChannelHandler实现类 + // channelPipeline双向连表的头节点 + tail = new TailContext(this); + // channelPipeline双向连表的尾结点 + head = new HeadContext(this); + + // channelPipeline: head -> tail + head.next = tail; + tail.prev = head; + } +``` + +当Netty初始化完DefaultChannelPipeline对象之后,ChannelPipeline中就已经存在了head和tail两个节点了,自然Netty会通过前面介绍的addXxx方法来添加,下面看下ChannelPipeline的addXxx方法源代码: + + +DefaultChannelPipeline.java +```java + @Override + public final ChannelPipeline addLast(String name, ChannelHandler handler) { + return addLast(null, name, handler); + } + + @Override + public final ChannelPipeline addLast(EventExecutorGroup group, String name, ChannelHandler handler) { + final AbstractChannelHandlerContext newCtx; + synchronized (this) { + checkMultiplicity(handler); + + /** + * 生成一个新的ChannelHandlerContext对象,这里返回的是DefaultChannelHandlerContext对象 + */ + newCtx = newContext(group, filterName(name, handler), handler); + + /** + * 向pipeline链表中添加一个新的节点 + */ + addLast0(newCtx); + + // If the registered is false it means that the channel was not registered on an eventLoop yet. + // In this case we add the context to the pipeline and add a task that will call + // ChannelHandler.handlerAdded(...) once the channel is registered. + if (!registered) { + newCtx.setAddPending(); + // 触发handlerAdded方法,并开始传播handlerAdded事件,此处最终会调用ChannelInitializer#handlerAdded方法,并最终调用到initChannel方法。 + callHandlerCallbackLater(newCtx, true); + return this; + } + + /** + * 从NioEventLoopGroup中获取到NioEventLoop对象 + */ + EventExecutor executor = newCtx.executor(); + if (!executor.inEventLoop()) { + callHandlerAddedInEventLoop(newCtx, executor); + return this; + } + } + // 调用HandlerAdded方法 + callHandlerAdded0(newCtx); + return this; + } + + // 向尾结点添加一个节点,并移动指针位置 + private void addLast0(AbstractChannelHandlerContext newCtx) { + AbstractChannelHandlerContext prev = tail.prev; + newCtx.prev = prev; + newCtx.next = tail; + prev.next = newCtx; + tail.prev = newCtx; + } + + private AbstractChannelHandlerContext newContext(EventExecutorGroup group, String name, ChannelHandler handler) { + return new DefaultChannelHandlerContext(this, childExecutor(group), name, handler); + } +``` + +那么,对于拥有双向链表结构的ChannelPipeline来说,是如何让事件在链表结构中进行转移执行的? + +就拿fireChannelRead方法来分析: + +这里需要提前知道的一点是,AbstractCHannelHandlerContext#fireChannelRead方法会被复写了channelRead方法的ChannelHandler调用。 + +AbstractCHannelHandlerContext.java +```java + @Override + public ChannelHandlerContext fireChannelRead(final Object msg) { + /** + * findContextInbound 返回的-> AbstractChannelHandlerContext对象 + */ + invokeChannelRead(findContextInbound(MASK_CHANNEL_READ), msg); + return this; + } + + /** + * 查找下一个Inbound节点 + * @param mask + * @return + */ + private AbstractChannelHandlerContext findContextInbound(int mask) { + AbstractChannelHandlerContext ctx = this; + EventExecutor currentExecutor = executor(); + do { + ctx = ctx.next; + } while (skipContext(ctx, currentExecutor, mask, MASK_ONLY_INBOUND)); + return ctx; + } + + private static boolean skipContext( + AbstractChannelHandlerContext ctx, EventExecutor currentExecutor, int mask, int onlyMask) { + // Ensure we correctly handle MASK_EXCEPTION_CAUGHT which is not included in the MASK_EXCEPTION_CAUGHT + return (ctx.executionMask & (onlyMask | mask)) == 0 || + // We can only skip if the EventExecutor is the same as otherwise we need to ensure we offload + // everything to preserve ordering. + // + // See https://github.com/netty/netty/issues/10067 + (ctx.executor() == currentExecutor && (ctx.executionMask & mask) == 0); + } +``` + +经过while循环遍历出下一个节点之后,变调用DefaultChannelPipeline#invokeChannelRead方法。 + +DefaultChannelPipeline +```java + static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) { + final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next); + EventExecutor executor = next.executor(); + // 在Netty线程中,则直接调用 + if (executor.inEventLoop()) { + next.invokeChannelRead(m); + } else { + // 不在Netty线程中,则另开一个线程来调用ChanelRead方法 + executor.execute(new Runnable() { + @Override + public void run() { + next.invokeChannelRead(m); + } + }); + } + } + + private void invokeChannelRead(Object msg) { + // 过滤handler的状态 + if (invokeHandler()) { + try { + // 调用inboundHandler的channelRead方法 + ((ChannelInboundHandler) handler()).channelRead(this, msg); + } catch (Throwable t) { + invokeExceptionCaught(t); + } + } else { + fireChannelRead(msg); + } + } +``` + +就这样,前一个节点的ChannelRead方法执行完,就会遍历出下一个节点的ChannelRead并执行,以此达到了在双向链表中移动节点元素的效果。 + +### 2.2 ChannelPipeline对象是在哪里创建的 + +Netty中,ChannelPipeline对象是在Channel被创建的时候生成的,看源码。 + +AbstractChannel.java +```java + protected AbstractChannel(Channel parent) { + this.parent = parent; + // channel的标识 + id = newId(); + // channel的unsafe类 + // NioSocketChannel和NioServerSocketChannel的unsafe对象都一样 + unsafe = newUnsafe(); + // 新建pipeline + pipeline = newChannelPipeline(); + } + + protected DefaultChannelPipeline newChannelPipeline() { + // 随后调用DefaultChannelPipeline对象构造方法,在构造方法中生成TailContext和HeadContext,并维护好他们的链表关系 + return new DefaultChannelPipeline(this); + } +``` + +## 3. ChannelHandler原理分析 + +ChannelPipeline是通过ChannelHandler接口来实现事件的拦截和处理,一般ChannelHandler只需要继承ChannelHandlerAdapter,然后覆盖自己关心的方法即可。 + +对于ChannelHandler接口,先看下其接口实现图: + +!["netty_pipeline01"](https://coderbruis.github.io/javaDocs/img/netty/source/netty_pipeline01.png) + +可以看到ChannelHandler接口的子类实现图中,有两个重要的子接口:ChannelInboundHandler、ChannelOutboundHandlerAdapter,这两个子接口扩展了ChannelHandler的功能,分别对应着ChannelPipeline章节中介绍的inbound和outbound事件功能。先看看ChannelHandler接口定义了哪些方法。 + +### 3.1 ChannelHandler接口 + +```java +public interface ChannelHandler { + + /** + * 添加ChannelHandler的回调 + */ + void handlerAdded(ChannelHandlerContext ctx) throws Exception; + + /** + * 移除ChannelHandler的回调 + */ + void handlerRemoved(ChannelHandlerContext ctx) throws Exception; + + /** + * + */ + @Deprecated + void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception; + + @Inherited + @Documented + @Target(ElementType.TYPE) + @Retention(RetentionPolicy.RUNTIME) + @interface Sharable { + // no value + } +} + +``` + +ChannelHandler是作为业务处理器保存在ChannelPipeline中的,它的其他功能都是在子类实现或者是子接口继承的,下面看下: +ChannelHandlerAdapter + +```java +public abstract class ChannelHandlerAdapter implements ChannelHandler { + /** + * 判断当前这个ChannelHandler是否有@Shareble修饰,有的话该ChannelHandler就可以在不同的ChannelPipeline之间共享 + */ + public boolean isSharable() { + /** + * Cache the result of {@link Sharable} annotation detection to workaround a condition. We use a + * {@link ThreadLocal} and {@link WeakHashMap} to eliminate the volatile write/reads. Using different + * {@link WeakHashMap} instances per {@link Thread} is good enough for us and the number of + * {@link Thread}s are quite limited anyway. + * + * See #2289. + */ + Class clazz = getClass(); + Map, Boolean> cache = InternalThreadLocalMap.get().handlerSharableCache(); + Boolean sharable = cache.get(clazz); + if (sharable == null) { + sharable = clazz.isAnnotationPresent(Sharable.class); + cache.put(clazz, sharable); + } + return sharable; + } + + @Skip + @Override + @Deprecated + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + ctx.fireExceptionCaught(cause); + } + +} +``` + +可以看到,ChannelHandlerAdapter作为抽象类只实现了顶级接口ChannelHandler的两个方法:isShareble和exceptionCaught,这里是Netty的风格之一,就是定义完顶级接口后,分别有公共抽象子类、子接口来对功能进行增强。那么对于ChannelHandler的功能增强,则由:ChannelOutboundHandler、ChannelInboundHandler来进行的增强。 + +### 3.2 ChannelOutboundHandler、ChannelInboundHandler接口 + +```java +public interface ChannelInboundHandler extends ChannelHandler { + + /** + * 通道注册完成的回调方法,方法中多以fireChannelRegistered方法为主,作用是往pipeline中传播channelRegistered事件 + */ + void channelRegistered(ChannelHandlerContext ctx) throws Exception; + + /** + * 通道解除注册的回调方法 + */ + void channelUnregistered(ChannelHandlerContext ctx) throws Exception; + + /** + * 通道触发 + */ + void channelActive(ChannelHandlerContext ctx) throws Exception; + + /** + * The {@link Channel} of the {@link ChannelHandlerContext} was registered is now inactive and reached its + * end of lifetime. + */ + void channelInactive(ChannelHandlerContext ctx) throws Exception; + + /** + * 通道读取到消息 + */ + void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception; + + /** + * Invoked when the last message read by the current read operation has been consumed by + * {@link #channelRead(ChannelHandlerContext, Object)}. If {@link ChannelOption#AUTO_READ} is off, no further + * attempt to read an inbound data from the current {@link Channel} will be made until + * {@link ChannelHandlerContext#read()} is called. + */ + void channelReadComplete(ChannelHandlerContext ctx) throws Exception; + + /** + * Gets called if an user event was triggered. + */ + void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception; + + /** + * Gets called once the writable state of a {@link Channel} changed. You can check the state with + * {@link Channel#isWritable()}. + */ + void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception; + + /** + * Gets called if a {@link Throwable} was thrown. + */ + @Override + @SuppressWarnings("deprecation") + void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception; +} +``` + +```java +public interface ChannelOutboundHandler extends ChannelHandler { + /** + * 绑定socket事件回调 + */ + void bind(ChannelHandlerContext ctx, SocketAddress localAddress, ChannelPromise promise) throws Exception; + + /** + * socket连接回调 + */ + void connect( + ChannelHandlerContext ctx, SocketAddress remoteAddress, + SocketAddress localAddress, ChannelPromise promise) throws Exception; + + /** + * socket断开连接回调 + */ + void disconnect(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception; + + /** + * socket关闭回调 + */ + void close(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception; + + /** + * Called once a deregister operation is made from the current registered {@link EventLoop}. + * + * @param ctx the {@link ChannelHandlerContext} for which the close operation is made + * @param promise the {@link ChannelPromise} to notify once the operation completes + * @throws Exception thrown if an error occurs + */ + void deregister(ChannelHandlerContext ctx, ChannelPromise promise) throws Exception; + + /** + * Intercepts {@link ChannelHandlerContext#read()}. + */ + void read(ChannelHandlerContext ctx) throws Exception; + + /** + * + */ + void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception; + + /** + * + */ + void flush(ChannelHandlerContext ctx) throws Exception; +} +``` + +### 3.3 ChannelInitializer抽象类 + +在来看看ChannelInitializer这个抽象类,定义了什么功能。 + +```java +@Sharable +public abstract class ChannelInitializer extends ChannelInboundHandlerAdapter { + + private static final InternalLogger logger = InternalLoggerFactory.getInstance(ChannelInitializer.class); + // initMap用于保存在不同pipeline之间共享的ChannelHandler对象,减少开销 + private final Set initMap = Collections.newSetFromMap( + new ConcurrentHashMap()); + + /** + * 初始化channel的抽象方法,具体由子类提供实现逻辑 + */ + protected abstract void initChannel(C ch) throws Exception; + + @Override + @SuppressWarnings("unchecked") + public final void channelRegistered(ChannelHandlerContext ctx) throws Exception { + // 通道注册完成后,对通道进行初始化 + if (initChannel(ctx)) { + // 将通道注册完这个事件往pipeline里传播 + ctx.pipeline().fireChannelRegistered(); + + // We are done with init the Channel, removing all the state for the Channel now. + removeState(ctx); + } else { + ctx.fireChannelRegistered(); + } + } + + /** + * Handle the {@link Throwable} by logging and closing the {@link Channel}. Sub-classes may override this. + */ + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (logger.isWarnEnabled()) { + logger.warn("Failed to initialize a channel. Closing: " + ctx.channel(), cause); + } + ctx.close(); + } + + /** + * {@inheritDoc} If override this method ensure you call super! + */ + @Override + public void handlerAdded(ChannelHandlerContext ctx) throws Exception { + if (ctx.channel().isRegistered()) { + // This should always be true with our current DefaultChannelPipeline implementation. + // The good thing about calling initChannel(...) in handlerAdded(...) is that there will be no ordering + // surprises if a ChannelInitializer will add another ChannelInitializer. This is as all handlers + // will be added in the expected order. + if (initChannel(ctx)) { + + // We are done with init the Channel, removing the initializer now. + removeState(ctx); + } + } + } + + @Override + public void handlerRemoved(ChannelHandlerContext ctx) throws Exception { + initMap.remove(ctx); + } + + @SuppressWarnings("unchecked") + private boolean initChannel(ChannelHandlerContext ctx) throws Exception { + if (initMap.add(ctx)) { // Guard against re-entrance. + try { + // 调用抽象方法initChannel(channel) + initChannel((C) ctx.channel()); + } catch (Throwable cause) { + // Explicitly call exceptionCaught(...) as we removed the handler before calling initChannel(...). + // We do so to prevent multiple calls to initChannel(...). + exceptionCaught(ctx, cause); + } finally { + ChannelPipeline pipeline = ctx.pipeline(); + if (pipeline.context(this) != null) { + pipeline.remove(this); + } + } + return true; + } + return false; + } + + // 将Channelhandler从initMap中移除 + private void removeState(final ChannelHandlerContext ctx) { + // The removal may happen in an async fashion if the EventExecutor we use does something funky. + if (ctx.isRemoved()) { + initMap.remove(ctx); + } else { + // The context is not removed yet which is most likely the case because a custom EventExecutor is used. + // Let's schedule it on the EventExecutor to give it some more time to be completed in case it is offloaded. + ctx.executor().execute(new Runnable() { + @Override + public void run() { + initMap.remove(ctx); + } + }); + } + } +} +``` + +对于ChannelInboundHandlerAdapter这个抽象类来说,已经实现了ChannelInboundHandler这个接口的所有方法了,而ChannelOutboundHandlerAdapter抽象类同样已经实现了ChannelOutboundHandler接口的所有方法,因此继承了ChannelInitializer的实现类,只需要实现initChannel(Channel ch)方法即可。 + +下面看一个ChannelInitializer的例子 + +```java +public class HttpHelloWorldServerInitializer extends ChannelInitializer { + + private final SslContext sslCtx; + + public HttpHelloWorldServerInitializer(SslContext sslCtx) { + this.sslCtx = sslCtx; + } + + @Override + public void initChannel(SocketChannel ch) { + ChannelPipeline p = ch.pipeline(); + if (sslCtx != null) { + p.addLast(sslCtx.newHandler(ch.alloc())); + } + p.addLast(new HttpServerCodec()); + p.addLast(new HttpServerExpectContinueHandler()); + p.addLast(new HttpHelloWorldServerHandler()); + } +} + +``` + +由上面的例子知道,对于initChannel(Channel ch)方法而言,主要是用于往pipeline中添加ChannelHandler的。 + +## 4. ChannelHandlerContext源码分析 + +ChannelHandlerContext接口定义 + +```java +public interface ChannelHandlerContext extends AttributeMap, ChannelInboundInvoker, ChannelOutboundInvoker { + + /** + * 获得一个channel对象 + */ + Channel channel(); + + /** + * 获取一个EventExecutor对象,这里实际获得的是NioEventLoop + */ + EventExecutor executor(); + + /** + * 获取ChannelHandler的名称 + */ + String name(); + + /** + * 绑定在ChannelHandlerContext上的ChannelHandler + */ + ChannelHandler handler(); + + boolean isRemoved(); + + @Override + ChannelHandlerContext fireChannelRegistered(); + + @Override + ChannelHandlerContext fireChannelUnregistered(); + + @Override + ChannelHandlerContext fireChannelActive(); + + @Override + ChannelHandlerContext fireChannelInactive(); + + @Override + ChannelHandlerContext fireExceptionCaught(Throwable cause); + + @Override + ChannelHandlerContext fireUserEventTriggered(Object evt); + + @Override + ChannelHandlerContext fireChannelRead(Object msg); + + @Override + ChannelHandlerContext fireChannelReadComplete(); + + @Override + ChannelHandlerContext fireChannelWritabilityChanged(); + + @Override + ChannelHandlerContext read(); + + @Override + ChannelHandlerContext flush(); + + /** + * 获取pipeline + */ + ChannelPipeline pipeline(); + + /** + * 获取一个内存分配器 + */ + ByteBufAllocator alloc(); + + /** + * @deprecated Use {@link Channel#attr(AttributeKey)} + */ + @Deprecated + @Override + Attribute attr(AttributeKey key); + + /** + * @deprecated Use {@link Channel#hasAttr(AttributeKey)} + */ + @Deprecated + @Override + boolean hasAttr(AttributeKey key); +} +``` + + +可以看到ChannelHandlerContext分别继承了ChannelInboundInvoker和ChannelOutboundInvoker接口,在分析Channelpipeline章节时,介绍过其二者定义的功能,ChannelInboundInvoker多以fireXxxx方法构成,代表的是触发的Xxx事件的传播,例如: + +```java + @Override + public ChannelHandlerContext fireChannelRegistered() { + invokeChannelRegistered(findContextInbound(MASK_CHANNEL_REGISTERED)); + return this; + } +``` + +fireChannelRegistered方法就是触发了ChannelRegistered事件能够在ChannelPipeline中进行传播。 + +而ChannelOutboundInvoker多以socket的绑定、连接、读和写为住,常见的方法由write、flush以及writeAndFlush。 + +```java + @Override + public ChannelFuture writeAndFlush(Object msg, ChannelPromise promise) { + write(msg, true, promise); + return promise; + } +``` + +按照Netty架构的习惯,在给定一个接口之后,一般都会有对应的公共抽象类来定义公共的方法,并将需要定制的方法定义为抽象方法供不同的子类实现,照着这个思路可以找到AbstractChannelHandlerContext这个抽象类。 + +### 4.1 AbstractChannelHandlerContext源码分析 + +> 成员变量定义 + +在分析AbstractChannelHandlerContext源码之前,我们先看下它的成员变量定义,入下图所示,定义了两个volatile对象: + +1. volatile AbstractChannelHandlerContext next +2. volatile AbstractChannelHandlerContext prev + +这两个AbstractChannelHandlerContext对象作为指针实现了ChannelPipeline作为双向链表的数据结构。 + +```java + private static final AtomicIntegerFieldUpdater HANDLER_STATE_UPDATER = + AtomicIntegerFieldUpdater.newUpdater(AbstractChannelHandlerContext.class, "handlerState"); +``` + +> 关于XxxFieldUpdater类,可以阅读:https://my.oschina.net/u/4072299/blog/3115164 + +接着是AbstractChannelHandlerContext的状态: + +- private static final int ADD_PENDING = 1 +- private static final int ADD_COMPLETE = 2 +- private static final int REMOVE_COMPLETE = 3 + +ADD_PENDING表示正在调用handlerAdded,ADD_COMPLETE表示已经调用完成了handlerAdded,而REMOVE_COMPLETE表示已经调用完handlerRemoved方法。 + +而ChannelHandlerContext中还会存有ChannelPipeline。 + +```java +private final DefaultChannelPipeline pipeline +``` + +还有一个handlerState变量,用于定义当前ChannelHandler对象的状态,初始为INIT状态,表示handlerAdded和handlerRemove都还未调用过。 + +```java +private volatile int handlerState = INIT +``` + +!["ChannelPipeline-abstractChannelHandlerContext01"](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline-abstractChannelHandlerContext01.png) + + +对于ChannelPipeline中的ChannelHandler是如何被调用以及如何移动双向链表中的对象的,实现原理就在这几个方法之间: + +AbstractChannelHandlerContext.java +```java + + /* + * 触发ChannelActive事件 + */ + @Override + public ChannelHandlerContext fireChannelActive() { + invokeChannelActive(findContextInbound(MASK_CHANNEL_ACTIVE)); + return this; + } + + static void invokeChannelActive(final AbstractChannelHandlerContext next) { + // 获取NioEventLoop线程 + EventExecutor executor = next.executor(); + // 如果获取到的NioEventLoop线程是当前的线程 + if (executor.inEventLoop()) { + next.invokeChannelActive(); + } else { + // 另开一个线程去执行 + executor.execute(new Runnable() { + @Override + public void run() { + next.invokeChannelActive(); + } + }); + } + } + + private void invokeChannelActive() { + // 检查ChannelHandler的状态 + if (invokeHandler()) { + try { + ((ChannelInboundHandler) handler()).channelActive(this); + } catch (Throwable t) { + invokeExceptionCaught(t); + } + } else { + // 遍历下一个节点,重新调用下一个节点 + fireChannelActive(); + } + } + + /* + * 找到inbound节点 + */ + private AbstractChannelHandlerContext findContextInbound(int mask) { + AbstractChannelHandlerContext ctx = this; + // 拿到当前的NioEventLoop线程 + EventExecutor currentExecutor = executor(); + do { + // 获取ChannelPipeline中的next节点 + ctx = ctx.next; + } while (skipContext(ctx, currentExecutor, mask, MASK_ONLY_INBOUND)); + return ctx; + } + + // 判断是否跳过此节点 + private static boolean skipContext( + AbstractChannelHandlerContext ctx, EventExecutor currentExecutor, int mask, int onlyMask) { + return (ctx.executionMask & (onlyMask | mask)) == 0 || + (ctx.executor() == currentExecutor && (ctx.executionMask & mask) == 0); + } +``` + +当调用来到 +```java +((ChannelInboundHandler) handler()).channelActive(this); +``` +会触发下一个Handler的channelActive,此处就拿Tail节点的channelActive来分析。 + +```java + @Override + public void channelActive(ChannelHandlerContext ctx) { + ctx.fireChannelActive(); + readIfIsAutoRead(); + } +``` +可以看到,调用又来到了ChannelHandlerContext#fireChannelActive,这样又要进行节点的遍历,就这样把事件传播了下去。 + + +由于篇幅原因,剩余ChannelPipeline的分析放在下一篇进行。 \ No newline at end of file diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" index 66ed386..2155406 100644 --- "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioEventLoop\345\216\237\347\220\206\345\210\206\346\236\220.md" @@ -603,3 +603,5 @@ NioEventLoop#run ## 5. NioEventLoop执行逻辑 + +未完待续... \ No newline at end of file From 8ab9bc60e714391365e4f7b64b0615a78ed3863b Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 22:14:54 +0800 Subject: [PATCH 35/68] =?UTF-8?q?update=E6=96=87=E7=AB=A0=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\210\206\346\236\220\357\274\210\344\270\212\357\274\211.md" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" => "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\212\357\274\211.md" (100%) diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\212\357\274\211.md" similarity index 100% rename from "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" rename to "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\212\357\274\211.md" From f2198e5d3d7f1f0a554f34fc1bf41b64e65d7099 Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 22:23:18 +0800 Subject: [PATCH 36/68] =?UTF-8?q?=E6=9B=B4=E6=96=B0Readme=E7=9B=AE?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ade13ba..82f96be 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,10 @@ Spring-Security-OAuth2 - Netty + Netty + + + Netty

@@ -130,7 +133,7 @@ SpringCloud源码 - [Netty底层源码解析-Netty服务端启动分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Netty%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90.md) - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - Netty底层源码解析-Channel分析 - - [Netty底层源码解析-ChannelPipeline分析(上)]() + - [Netty底层源码解析-ChannelPipeline分析(上)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8A%EF%BC%89.md) - Netty底层源码解析-ChannelPipeline分析(下) - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 From 5558fb8821425a63ed2f5936a21837e32f11e94e Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 22:25:26 +0800 Subject: [PATCH 37/68] fix rocketmq badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 82f96be..888129f 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Netty - Netty + Netty

From 81961ac5ccba0ecff97a8926c5b7f345f0d6ff9e Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 22:27:04 +0800 Subject: [PATCH 38/68] rocketmq -> RocketMQ --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 888129f..089f454 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ Netty - Netty + Netty

From 20615190037de5dfec38f28b038685148d317a64 Mon Sep 17 00:00:00 2001 From: Bruis Date: Wed, 25 Aug 2021 23:18:17 +0800 Subject: [PATCH 39/68] =?UTF-8?q?fix=20=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 089f454..94e0586 100644 --- a/README.md +++ b/README.md @@ -99,14 +99,6 @@ SpringCloud源码 - [深入浅出SpringBoot源码——系统初始化器](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E7%B3%BB%E7%BB%9F.md) - [深入浅出SpringBoot源码——启动加载器](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E5%90%AF%E5%8A%A8%E5%8A%A0%E8%BD%BD%E5%99%A8.md) - -- Netty源码学习 - - [二进制运算以及源码、反码以及补码学习](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/%E4%BA%8C%E8%BF%9B%E5%88%B6.md) - - [Netty源码包结构](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E6%BA%90%E7%A0%81%E5%8C%85%E7%BB%93%E6%9E%84.md) - - [Netty中的EventLoopGroup](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E4%B8%AD%E7%9A%84EventLoopGroup%E6%98%AF%E4%BB%80%E4%B9%88.md) - - [Netty中的ChannelPipeline]() - - [Netty中的内存分配]() - - SpringSecurity&OAuth2源码学习 - SpringSecurity版本:5.1.0.RELEASE - [深入浅出SpringSecurity和OAuth2(一)—— 初识SpringSecurity](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringSecurity/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0SpringSecurity%E5%92%8COAuth2%EF%BC%88%E4%B8%80%EF%BC%89%E2%80%94%E2%80%94%20%E5%88%9D%E8%AF%86SpringSecurity.md) @@ -129,6 +121,10 @@ SpringCloud源码 - Dubbo底层源码学习(七)—— Dubbo的服务消费 - Netty底层源码解析 + - Netty版本:4.1.60.Final + - [二进制运算以及源码、反码以及补码学习](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/%E4%BA%8C%E8%BF%9B%E5%88%B6.md) + - [Netty源码包结构](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E6%BA%90%E7%A0%81%E5%8C%85%E7%BB%93%E6%9E%84.md) + - [Netty中的EventLoopGroup](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E4%B8%AD%E7%9A%84EventLoopGroup%E6%98%AF%E4%BB%80%E4%B9%88.md) - [Netty底层源码解析-初始Netty及其架构](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-%E5%88%9D%E5%A7%8BNetty%E5%8F%8A%E5%85%B6%E6%9E%B6%E6%9E%84.md) - [Netty底层源码解析-Netty服务端启动分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Netty%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90.md) - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) @@ -140,6 +136,7 @@ SpringCloud源码 - Netty底层源码解析-RocketMQ底层使用到的Netty - RocketMQ底层源码解析 + - RocketMQ版本:4.9.0 - RocketMQ底层源码解析-RocketMQ环境搭建 - RocketMQ底层源码解析-本地调试RocketMQ源码 - RocketMQ底层源码解析-NameServer分析 @@ -148,9 +145,8 @@ SpringCloud源码 todo -- 完成Dubbo源码分析 -- RocketMQ源码分析 -- Netty源码分析 +- Redis底层源码分析 +- JUC底层源码分析 # 支持 From 051fa5707cc62493bf5ca5fca74f6cf50fe3735c Mon Sep 17 00:00:00 2001 From: Bruis Date: Mon, 30 Aug 2021 00:10:49 +0800 Subject: [PATCH 40/68] =?UTF-8?q?add=20Netty=E6=BA=90=E7=A0=81=E5=88=86?= =?UTF-8?q?=E6=9E=90-ChannelPipeline=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\357\274\210\344\270\213\357\274\211.md" | 322 ++++++++++++++++++ 1 file changed, 322 insertions(+) create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" new file mode 100644 index 0000000..9683989 --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-ChannelPipeline\345\210\206\346\236\220\357\274\210\344\270\213\357\274\211.md" @@ -0,0 +1,322 @@ +## 1. 概览 + +上篇已经讲解了ChannelPipeline以及ChannelHandler的关系以及对应的类继承关系图,本节来详细分析一下inbound和outbound的原理。 + +## 2. DefaultChannelPipeline源码分析 + +在DefaultChannelPipeline中,定义了一个head“头结点”和一个tail“尾结点”,它们都是AbstractChannelhandlerContext类的节点,我们都知道在ChannelPipeline中AbstractChannelHandlerContext就是节点元素的抽象类实现,而这个handlerContext持有ChannelHandler。 + +在Netty中我们还需要知道inbound和outbound类型的ChannelHandler节点的执行顺序。 + +下面来先看下一个Netty的demo + +该Netty的demo中,分别定义了六个Handler,分为两组,一组是inboundHandler,另一组是outboundHandler。 + + +InBoundHandlerA +```java +public class InBoundHandlerA extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerA: " + msg); + ctx.fireChannelRead(msg); + } +} +``` + +InBoundHandlerB +```java +public class OutBoundHandlerB extends ChannelOutboundHandlerAdapter { + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerB: " + msg); + ctx.write(msg, promise); + } + + + @Override + public void handlerAdded(final ChannelHandlerContext ctx) { + ctx.executor().schedule(() -> { + ctx.channel().write("ctx.channel().write -> hello world"); + ctx.write("hello world"); + }, 3, TimeUnit.SECONDS); + } +} +``` + +InBoundHandlerC +```java +public class InBoundHandlerC extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerC: " + msg); + ctx.fireChannelRead(msg); + } +} +``` + +```java +public final class Server { + + public static void main(String[] args) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.TCP_NODELAY, true) + .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new InBoundHandlerA()); + ch.pipeline().addLast(new InBoundHandlerB()); + ch.pipeline().addLast(new InBoundHandlerC()); + } + }); + + ChannelFuture f = b.bind(8888).sync(); + + f.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} +``` + +执行结果如下: +``` +InBoundHandlerA: hello world +InBoundHandlerB: hello world +InBoundHandlerC: hello world +``` + +可以发现Netty中,对于inboundHandler来说是按照顺序执行操作的。 + +接着在看看outboundHandler定义如下 + +OutBoundHandlerA +```java +public class OutBoundHandlerA extends ChannelOutboundHandlerAdapter { + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerA: " + msg); + ctx.write(msg, promise); + } +} +``` + +OutBoundHandlerB +```java +public class OutBoundHandlerB extends ChannelOutboundHandlerAdapter { + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerB: " + msg); + ctx.write(msg, promise); + } +} +``` + +OutBoundHandlerC +```java +public class OutBoundHandlerC extends ChannelOutboundHandlerAdapter { + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + System.out.println("OutBoundHandlerC: " + msg); + ctx.write(msg, promise); + } +} +``` + + +然后修改Server类为如下, + +```java +public final class Server { + + public static void main(String[] args) throws Exception { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .childOption(ChannelOption.TCP_NODELAY, true) + .childAttr(AttributeKey.newInstance("childAttr"), "childAttrValue") + .childHandler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new OutBoundHandlerA()); + ch.pipeline().addLast(new OutBoundHandlerB()); + ch.pipeline().addLast(new OutBoundHandlerC()); + } + }); + + ChannelFuture f = b.bind(8888).sync(); + + f.channel().closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} +``` + +执行结果如下: +``` +OutBoundHandlerC: ctx.channel().write -> hello world +OutBoundHandlerB: ctx.channel().write -> hello world +OutBoundHandlerA: ctx.channel().write -> hello world +OutBoundHandlerA: hello world +``` + +可以看到在Netty中对于ountboundHandler来说,是倒序执行的。 + +整个Netty执行ChannelHandler可以用下图来描述。 + +![channelPipeline事件传播图](https://coderbruis.github.io/javaDocs/img/netty/source/ChannelPipeline事件传播图.png) + + +上图描述的Head节点顺序执行,Tail节点逆序执行的源码是在DefaultChannelPipeline中,在《Netty-ChannelPipeline-上》文章开头就已经说明了,对于inboundHandler类型的Handler,主要还是用于监听Channel的read、register、active、exceptionCaught等事件,而对于outboundHandler类型来说,主要是用于bind、connect、write、flush等事件,回顾了这一点后,我们在继续看DefaultChannelPipeline源码 + +```java +public class DefaultChannelPipeline implements ChannelPipeline { + ... 省略 + + @Override + public final ChannelPipeline fireChannelRead(Object msg) { + AbstractChannelHandlerContext.invokeChannelRead(head, msg); + return this; + } + + @Override + public final ChannelFuture write(Object msg) { + return tail.write(msg); + } + + ... 省略 +} +``` + +分别以inbound类型的channelRead和outbound类型的write来分析。 + +DefaultChannelPipeline.java +```java + @Override + public final ChannelPipeline fireChannelRead(Object msg) { + AbstractChannelHandlerContext.invokeChannelRead(head, msg); + return this; + } +``` +在AbstractChannelHandlerContext#invokeChannelRead方法中,传入了一个重要的入参:head,这里就是传入的Head头结点,这一重要调用得以让inbound类型handler在ChannelPipeline中按顺序执行。 + +AbstractChannelHandlerContext.java +```java + static void invokeChannelRead(final AbstractChannelHandlerContext next, Object msg) { + final Object m = next.pipeline.touch(ObjectUtil.checkNotNull(msg, "msg"), next); + EventExecutor executor = next.executor(); + // 在NioEventLoop线程内,next这里传入的是head头结点 + if (executor.inEventLoop()) { + next.invokeChannelRead(m); + } else { + executor.execute(new Runnable() { + @Override + public void run() { + next.invokeChannelRead(m); + } + }); + } + } + + private void invokeChannelRead(Object msg) { + if (invokeHandler()) { + try { + ((ChannelInboundHandler) handler()).channelRead(this, msg); + } catch (Throwable t) { + invokeExceptionCaught(t); + } + } else { + fireChannelRead(msg); + } + } + +``` + +ChannelInboundHandler#channelRead的调用,会最终来到InBoundHandlerA里的channelRead方法。 +```java +public class InBoundHandlerA extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + System.out.println("InBoundHandlerA: " + msg); + ctx.fireChannelRead(msg); + } +} +``` + +经过AbstractChannelHandlerContext#fireChannelRead,会在ChannelPipeline中寻找下一个inbound,然后继续执行channelRead。 + +```java + @Override + public ChannelHandlerContext fireChannelRead(final Object msg) { + invokeChannelRead(findContextInbound(MASK_CHANNEL_READ), msg); + return this; + } +``` + + +细看OutBoundHandlerB#handlerAdded方法由两个write,一个是ctx.channel.write,另一个是ctx.write,这两个有啥区别呢?为啥输出结果是三条:ctx.channel().write -> hello world,一条hello world呢? + +启动Server启动类之后,再cmd窗口输入连接socket的命令debug之后分析得 + +``` +telnet 127.0.0.1 8888 +``` + +在客户端socket连接进Netty之后,会先注册channel并init初始化,这时会调用Server类里ServerBootstrap注入的ChannelInitilizer的initChannel方法,最终得以向ChannelPipeline里添加进OutBoundHandlerA、OutBoundHandlerB、OutBoundHandlerC,随后调用 + +```java +ch.pipeline().addLast(new xxxx) +``` +只有会触发DefaultChannelPipeline#callHandlerAdded0()方法,最终来到OutBoundHandler里的handlerAdded()方法,并向Netty的定时任务队列里添加了一个匿名内部任务,也就是: + +```java + @Override + public void handlerAdded(final ChannelHandlerContext ctx) { + ctx.executor().schedule(() -> { + ctx.channel().write("ctx.channel().write -> hello world"); + ctx.write("hello world"); + }, 3, TimeUnit.SECONDS); + } +``` + +随后完成客户端Socket的初始化工作。此时服务端的selector继续执行for死循环,执行到任务队列,此时发现任务队列中有一个定时任务需要执行,则拿出任务并执行任务,执行过程会跳转到上面的匿名内部类,并依次执行ctx.channel().write()和ctx.write()两个方法。 + +```java +ctx.channel().write() +``` +方法会从ChannelPipeline的尾部tail开始执行(上文已经总结过,outboundHandler都是从tail节点开始执行handler) ,所以字符串“ctx.channel().write -> hello world”就会按outboundHandlerC、outboundHandlerB、outboundHandlerC这个顺序开始执行,执行完head节点之后会一路往上返回到Ctx.channel().write() +方法,并最后去执行ctx.write()方法,而ctx.write()方法会从当前的handler节点开始向前执行,所以当前outboundHandlerB的前节点是outboundHandlerA,所以最终控制台打印出: +``` +OutBoundHandlerC: ctx.channel().write -> hello world +OutBoundHandlerB: ctx.channel().write -> hello world +OutBoundHandlerA: ctx.channel().write -> hello world +OutBoundHandlerA: hello world +``` + +整个过程比较复杂,也比较绕,下面用一张流程图来描述整个过程。 + +![NettyChannelPipeline流程图1](https://coderbruis.github.io/javaDocs/img/netty/source/NettyChannelPipeline流程图1.png) + + +- TODO ChannelPipeline优化?MASK +- TODO SimpleChannelInboundHandler源码分析 From afba7afe95a4e3ed8660ac322a89ada885bb7c3a Mon Sep 17 00:00:00 2001 From: Bruis Date: Mon, 30 Aug 2021 00:12:27 +0800 Subject: [PATCH 41/68] update ReadME --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 94e0586..6882d72 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ SpringCloud源码 - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - Netty底层源码解析-Channel分析 - [Netty底层源码解析-ChannelPipeline分析(上)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8A%EF%BC%89.md) - - Netty底层源码解析-ChannelPipeline分析(下) + - [Netty底层源码解析-ChannelPipeline分析(下)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8B%EF%BC%89.md) - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 - Netty底层源码解析-RocketMQ底层使用到的Netty From 9ff2bba5ed1d49911b04bc0c9a5b88962c7d22e5 Mon Sep 17 00:00:00 2001 From: hacryq Date: Tue, 12 Oct 2021 21:45:26 +0800 Subject: [PATCH 42/68] =?UTF-8?q?fix:=20=E9=94=99=E5=88=AB=E5=AD=97?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" index d533a52..b3819b9 100644 --- "a/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" +++ "b/note/SpringBoot/\346\267\261\345\205\245SpringBoot\346\272\220\347\240\201\345\255\246\344\271\240\344\271\213\342\200\224\342\200\224\345\220\257\345\212\250\345\212\240\350\275\275\345\231\250.md" @@ -98,7 +98,7 @@ public class FirstApplicationRunner implements ApplicationRunner { ### 3. SpringBoot启动加载器原理 -其实SpringBoot启动加载器原理比较简单,在底层源码调用逻辑比较清除。 +其实SpringBoot启动加载器原理比较简单,在底层源码调用逻辑比较清楚。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200820100314418.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NvZGVyQnJ1aXM=,size_16,color_FFFFFF,t_70#pic_center) 在DefaultApplicationArguments里,有一个不可忽略的类:Source From 25e93ee6e18e5d918cdb2567cac68a16acd87726 Mon Sep 17 00:00:00 2001 From: yuuyoo Date: Tue, 11 Jan 2022 11:41:25 +0800 Subject: [PATCH 43/68] =?UTF-8?q?Update=20=E6=B7=B1=E5=85=A5=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0String=E6=BA=90=E7=A0=81=E4=B8=8E=E5=BA=95=E5=B1=82?= =?UTF-8?q?=EF=BC=88=E4=B8=80=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "程序技术器"应为“程序计数器” --- ...\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" index 4418513..55a20b3 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240String\346\272\220\347\240\201\344\270\216\345\272\225\345\261\202\357\274\210\344\270\200\357\274\211.md" @@ -112,7 +112,7 @@ JAVA的运行时数据区包括以下几个区域: 2. Java堆区(Heap) 3. 本地方法栈(Native Method Stack) 4. 虚拟机栈(VM Stack) -5. 程序技术器(Program Conter Register) +5. 程序计数器(Program Conter Register) 具体内容不在这里进行介绍。为方便读者能够理解下面的内容,请学习下[总结Java内存区域和常量池](https://blog.csdn.net/CoderBruis/article/details/85240273) From 40dd72607e83663246b2632e7b739ddf92c1019a Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Thu, 27 Jan 2022 16:25:17 +0800 Subject: [PATCH 44/68] =?UTF-8?q?[U]=20todo=E5=86=85=E5=AE=B9=EF=BC=9Bbio?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++ ...12\345\205\266\346\236\266\346\236\204.md" | 39 ++++++++++++++++++- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6882d72..648b81e 100644 --- a/README.md +++ b/README.md @@ -145,6 +145,12 @@ SpringCloud源码 todo +2021年年底完成了人生的两件大事,所以一直没时间持续输出源码分析,2022年开始需要继续努力,完成这个源码分析项目! + +- 完成Netty剩余源码分析文章 +- 完成RocketMQ剩余源码分析文章 +- 完成Dubbo剩余源码分析文章 +- C语言基础学习(为Redis底层源码学习做准备) - Redis底层源码分析 - JUC底层源码分析 diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" index d969cdd..d721716 100644 --- "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-\345\210\235\345\247\213Netty\345\217\212\345\205\266\346\236\266\346\236\204.md" @@ -1,6 +1,43 @@ ## 1. 回顾BIO和NIO -show you the code! TODO +```java +public class BIO { + public static void main(String[] args) throws Exception { + ServerSocket serverSocket = new ServerSocket(666); + System.out.println("Server started..."); + while (true) { + System.out.println("socket accepting..."); + Socket socket = serverSocket.accept(); + new Thread(new Runnable() { + @Override + public void run() { + try { + byte[] bytes = new byte[1024]; + InputStream inputStream = socket.getInputStream(); + while (true) { + System.out.println("reading..."); + int read = inputStream.read(bytes); + if (read != -1) { + System.out.println(new String(bytes, 0, read)); + } else { + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + socket.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + }).start(); + } + } +} +``` BIO流程图如下: From 672fb251dbaecc689e8c0cb59aacdb8d13ad94f8 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Thu, 10 Feb 2022 17:30:22 +0800 Subject: [PATCH 45/68] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0Netty=E9=80=9A?= =?UTF-8?q?=E8=AE=AF=E6=A8=A1=E6=8B=9F=E4=BB=A3=E7=A0=81=EF=BC=8C=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E5=A4=9A=E7=BA=BF=E7=A8=8B=E6=A8=A1=E6=8B=9FNetty?= =?UTF-8?q?=E9=80=9A=E8=AE=AF=E8=BF=87=E7=A8=8B=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thread/reentranlock/FutureMain.java | 64 +++++++++ .../thread/reentranlock/RequestFuture.java | 123 ++++++++++++++++++ .../thread/reentranlock/Response.java | 28 ++++ .../thread/reentranlock/SubThread.java | 30 +++++ .../thread/synchronize/FutureMain.java | 64 +++++++++ .../thread/synchronize/RequestFuture.java | 103 +++++++++++++++ .../thread/synchronize/Response.java | 28 ++++ .../thread/synchronize/SubThread.java | 31 +++++ 8 files changed, 471 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java create mode 100644 JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java new file mode 100644 index 0000000..71e797e --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java @@ -0,0 +1,64 @@ +package com.learnjava.thread.reentranlock; + +import java.util.ArrayList; +import java.util.List; + +/** + * 模拟Netty通讯过程 + * 主线程,获取子线程的结果 + * + * @author lhy + * @date 2022/2/10 + */ +public class FutureMain { + private static List reqs = new ArrayList<>(); + public static void main(String[] args) { + mockClient(); + mockServer(); + } + + /** + * 模拟服务端 接受结果 + */ + private static void mockServer() { + for (RequestFuture req : reqs) { + /** + * 主线程获取结果 + */ + Object result = req.get(); + System.out.println("服务端接受到响应结果:" + result.toString()); + } + } + /** + * 模拟客户端 发送请求 + */ + private static void mockClient() { + for (int i = 0; i < 100; i++) { + long id = i; + RequestFuture req = new RequestFuture(); + req.setId(id); + req.setRequest("hello world"); + /** + * 把请求缓存起来 + */ + RequestFuture.addFuture(req); + /** + * 将请求放入到请求列表中 + */ + reqs.add(req); + sendMsg(req); + SubThread subThread = new SubThread(req); + /** + * 开启子线程 + */ + subThread.start(); + } + } + /** + * 模拟请求处理 + * @param req + */ + private static void sendMsg(RequestFuture req) { + System.out.println("客户端发送数据,请求id为===============" + req.getId()); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java new file mode 100644 index 0000000..96106dc --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java @@ -0,0 +1,123 @@ +package com.learnjava.thread.reentranlock; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 模拟客户端请求类,用于构建请求对象 + * + * @author lhy + * @date 2022/2/10 + */ +public class RequestFuture { + public static Map futures = new ConcurrentHashMap<>(); + private final Lock lock = new ReentrantLock(); + private final Condition condition = lock.newCondition(); + private long id; + /** + * 请求参数 + */ + private Object request; + /** + * 响应结果 + */ + private Object result; + /** + * 超时时间 + */ + private long timeout = 5000; + + /** + * 把请求放入本地缓存中 + * @param future + */ + public static void addFuture(RequestFuture future) { + futures.put(future.getId(), future); + } + + /** + * 同步获取响应结果 + * @return + */ + public Object get() { + lock.lock(); + try { + while (this.result == null) { + try { + // 主线程默认等待5s,然后查看下结果 + condition.await(timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } finally { + lock.unlock(); + } + return this.result; + } + + /** + * 异步线程将结果返回主线程 + * @param result + */ + public static void received(Response result) { + RequestFuture future = futures.remove(result.getId()); + if (null != future) { + future.setResult(result.getResult()); + } + /** + * 通知主线程 + */ + Objects.requireNonNull(future, "RequestFuture").getLock().lock(); + try { + future.getCondition().signalAll(); + } finally { + Objects.requireNonNull(future, "RequestFuture").getLock().unlock(); + } + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getRequest() { + return request; + } + + public void setRequest(Object request) { + this.request = request; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public Lock getLock() { + return lock; + } + + public Condition getCondition() { + return condition; + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java new file mode 100644 index 0000000..cc40e9f --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java @@ -0,0 +1,28 @@ +package com.learnjava.thread.reentranlock; + +/** + * 响应结果类 + * + * @author lhy + * @date 2022/2/10 + */ +public class Response { + private long id; + private Object result; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java new file mode 100644 index 0000000..22431bf --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java @@ -0,0 +1,30 @@ +package com.learnjava.thread.reentranlock; + +/** + * 子线程,用于模拟服务端处理 + * + * @author lhy + * @date 2022/2/10 + */ +public class SubThread extends Thread { + + private RequestFuture request; + + public SubThread(RequestFuture request) { + this.request = request; + } + + @Override + public void run() { + Response response = new Response(); + response.setId(request.getId()); + response.setResult("服务端响应了结果,线程id: " + Thread.currentThread().getId() + ", 请求id:" + response.getId()); + // 子线程睡眠1s + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + RequestFuture.received(response); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java new file mode 100644 index 0000000..e9454ba --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java @@ -0,0 +1,64 @@ +package com.learnjava.thread.synchronize; + +import java.util.ArrayList; +import java.util.List; + +/** + * 模拟Netty通讯过程 + * 主线程,获取子线程的结果 + * + * @author lhy + * @date 2022/2/10 + */ +public class FutureMain { + private static List reqs = new ArrayList<>(); + public static void main(String[] args) { + mockClient(); + mockServer(); + } + + /** + * 模拟服务端 接受结果 + */ + private static void mockServer() { + for (RequestFuture req : reqs) { + /** + * 主线程获取结果 + */ + Object result = req.get(); + System.out.println("服务端接受到响应结果:" + result.toString()); + } + } + /** + * 模拟客户端 发送请求 + */ + private static void mockClient() { + for (int i = 0; i < 100; i++) { + long id = i; + RequestFuture req = new RequestFuture(); + req.setId(id); + req.setRequest("hello world"); + /** + * 把请求缓存起来 + */ + RequestFuture.addFuture(req); + /** + * 将请求放入到请求列表中 + */ + reqs.add(req); + sendMsg(req); + SubThread subThread = new SubThread(req); + /** + * 开启子线程 + */ + subThread.start(); + } + } + /** + * 模拟请求处理 + * @param req + */ + private static void sendMsg(RequestFuture req) { + System.out.println("客户端发送数据,请求id为===============" + req.getId()); + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java new file mode 100644 index 0000000..57d9ddf --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java @@ -0,0 +1,103 @@ +package com.learnjava.thread.synchronize; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 模拟客户端请求类,用于构建请求对象 + * + * @author lhy + * @date 2022/2/10 + */ +public class RequestFuture { + public static Map futures = new ConcurrentHashMap<>(); + private long id; + /** + * 请求参数 + */ + private Object request; + /** + * 响应结果 + */ + private Object result; + /** + * 超时时间 + */ + private long timeout = 5000; + + /** + * 把请求放入本地缓存中 + * @param future + */ + public static void addFuture(RequestFuture future) { + futures.put(future.getId(), future); + } + + /** + * 同步获取响应结果 + * @return + */ + public Object get() { + synchronized (this) { + while (this.result == null) { + try { + // 主线程默认等待5s,然后查看下结果 + this.wait(timeout); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + return this.result; + } + + /** + * 异步线程将结果返回主线程 + * @param result + */ + public static void received(Response result) { + RequestFuture future = futures.remove(result.getId()); + if (null != future) { + future.setResult(result.getResult()); + } + /** + * 通知主线程 + */ + synchronized (Objects.requireNonNull(future, "RequestFuture")) { + future.notify(); + } + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getRequest() { + return request; + } + + public void setRequest(Object request) { + this.request = request; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java new file mode 100644 index 0000000..ea591ee --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java @@ -0,0 +1,28 @@ +package com.learnjava.thread.synchronize; + +/** + * 响应结果类 + * + * @author lhy + * @date 2022/2/10 + */ +public class Response { + private long id; + private Object result; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java new file mode 100644 index 0000000..9ebb376 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java @@ -0,0 +1,31 @@ +package com.learnjava.thread.synchronize; + +/** + * 子线程,用于模拟服务端处理 + * + * @author lhy + * @date 2022/2/10 + */ +public class SubThread extends Thread { + + private RequestFuture request; + + public SubThread(RequestFuture request) { + this.request = request; + } + + @Override + public void run() { + Response response = new Response(); + response.setId(request.getId()); + response.setResult("服务端响应了结果,线程id: " + Thread.currentThread().getId() + ", 请求id:" + response.getId()); + // 子线程睡眠1s + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println(this + " -> 当前线程准备调用received: " + Thread.currentThread().getName()); + RequestFuture.received(response); + } +} From 7dc4b25f48e816e7d9934faae36bdbf1a1b9652d Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Fri, 11 Feb 2022 15:42:20 +0800 Subject: [PATCH 46/68] =?UTF-8?q?[U]=20=E5=B0=86Netty=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E5=88=B0Spring-Netty=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bruis/learnnetty/thread/reentranlock}/FutureMain.java | 2 +- .../bruis/learnnetty}/thread/reentranlock/RequestFuture.java | 2 +- .../com/bruis/learnnetty}/thread/reentranlock/Response.java | 2 +- .../com/bruis/learnnetty}/thread/reentranlock/SubThread.java | 2 +- .../com/bruis/learnnetty/thread/synchronize}/FutureMain.java | 2 +- .../com/bruis/learnnetty}/thread/synchronize/RequestFuture.java | 2 +- .../java/com/bruis/learnnetty}/thread/synchronize/Response.java | 2 +- .../com/bruis/learnnetty}/thread/synchronize/SubThread.java | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename {JdkLearn/src/main/java/com/learnjava/thread/synchronize => Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock}/FutureMain.java (96%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/reentranlock/RequestFuture.java (98%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/reentranlock/Response.java (88%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/reentranlock/SubThread.java (93%) rename {JdkLearn/src/main/java/com/learnjava/thread/reentranlock => Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize}/FutureMain.java (97%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/synchronize/RequestFuture.java (97%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/synchronize/Response.java (88%) rename {JdkLearn/src/main/java/com/learnjava => Spring-Netty/src/main/java/com/bruis/learnnetty}/thread/synchronize/SubThread.java (94%) diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/FutureMain.java similarity index 96% rename from JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/FutureMain.java index e9454ba..d0de69c 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/FutureMain.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/FutureMain.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.synchronize; +package com.bruis.learnnetty.thread.reentranlock; import java.util.ArrayList; import java.util.List; diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/RequestFuture.java similarity index 98% rename from JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/RequestFuture.java index 96106dc..1fd7dec 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/RequestFuture.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/RequestFuture.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.reentranlock; +package com.bruis.learnnetty.thread.reentranlock; import java.util.Map; import java.util.Objects; diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/Response.java similarity index 88% rename from JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/Response.java index cc40e9f..ae1852c 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/Response.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/Response.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.reentranlock; +package com.bruis.learnnetty.thread.reentranlock; /** * 响应结果类 diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/SubThread.java similarity index 93% rename from JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/SubThread.java index 22431bf..9101e54 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/SubThread.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/reentranlock/SubThread.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.reentranlock; +package com.bruis.learnnetty.thread.reentranlock; /** * 子线程,用于模拟服务端处理 diff --git a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/FutureMain.java similarity index 97% rename from JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/FutureMain.java index 71e797e..bd4ee93 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/reentranlock/FutureMain.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/FutureMain.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.reentranlock; +package com.bruis.learnnetty.thread.synchronize; import java.util.ArrayList; import java.util.List; diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/RequestFuture.java similarity index 97% rename from JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/RequestFuture.java index 57d9ddf..f1dca80 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/RequestFuture.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/RequestFuture.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.synchronize; +package com.bruis.learnnetty.thread.synchronize; import java.util.Map; import java.util.Objects; diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/Response.java similarity index 88% rename from JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/Response.java index ea591ee..c5dfc05 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/Response.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/Response.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.synchronize; +package com.bruis.learnnetty.thread.synchronize; /** * 响应结果类 diff --git a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/SubThread.java similarity index 94% rename from JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/SubThread.java index 9ebb376..16e2a57 100644 --- a/JdkLearn/src/main/java/com/learnjava/thread/synchronize/SubThread.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/thread/synchronize/SubThread.java @@ -1,4 +1,4 @@ -package com.learnjava.thread.synchronize; +package com.bruis.learnnetty.thread.synchronize; /** * 子线程,用于模拟服务端处理 From 79b8ced8b72e0d79d7e0df3c8b2992de8b042af4 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Wed, 16 Feb 2022 11:40:28 +0800 Subject: [PATCH 47/68] =?UTF-8?q?[A]=20=E5=9F=BA=E4=BA=8ENetty=E7=9A=84?= =?UTF-8?q?=E7=9F=AD=E8=BF=9E=E6=8E=A5=E3=80=81=E9=95=BF=E8=BF=9E=E6=8E=A5?= =?UTF-8?q?demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../longconnections/ClientHandler.java | 17 +++ .../longconnections/NettyClient.java | 91 ++++++++++++ .../longconnections/NettyServer.java | 52 +++++++ .../longconnections/RequestFuture.java | 130 ++++++++++++++++++ .../connections/longconnections/Response.java | 28 ++++ .../shortconnections/ClientHandler.java | 28 ++++ .../shortconnections/NettyClient.java | 66 +++++++++ .../shortconnections/NettyServer.java | 51 +++++++ .../shortconnections/ServerHandler.java | 32 +++++ 9 files changed, 495 insertions(+) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/ClientHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyClient.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyServer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/RequestFuture.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/Response.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ClientHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyClient.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyServer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ServerHandler.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/ClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/ClientHandler.java new file mode 100644 index 0000000..7d69f53 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/ClientHandler.java @@ -0,0 +1,17 @@ +package com.bruis.learnnetty.netty.connections.longconnections; + +import com.alibaba.fastjson.JSONObject; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author lhy + * @date 2022/2/11 + */ +public class ClientHandler extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + Response response = JSONObject.parseObject(msg.toString(), Response.class); + RequestFuture.received(response); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyClient.java new file mode 100644 index 0000000..cd3a840 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyClient.java @@ -0,0 +1,91 @@ +package com.bruis.learnnetty.netty.connections.longconnections; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.netty.connections.longconnections.ClientHandler; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import org.springframework.util.StringUtils; + +import java.nio.charset.Charset; + +/** + * @author lhy + * @date 2022/2/16 + */ +public class NettyClient { + public static EventLoopGroup group = null; + public static Bootstrap bootstrap = null; + public static ChannelFuture future = null; + static { + bootstrap = new Bootstrap(); + group = new NioEventLoopGroup(); + bootstrap.channel(NioSocketChannel.class); + bootstrap.group(group); + bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); + final ClientHandler clientHandler = new ClientHandler(); + bootstrap.handler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, + 0, 4, 0, 4)); + ch.pipeline().addLast(new StringDecoder()); + ch.pipeline().addLast(clientHandler); + ch.pipeline().addLast(new LengthFieldPrepender(4, false)); + ch.pipeline().addLast(new StringEncoder(Charset.forName("utf-8"))); + } + }); + try { + future = bootstrap.connect("127.0.0.1", 8080).sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * 说明:对于这个长连接的例子中,使用了静态化,即单链接、长连接,如果是多链接的话不可使用静态化,需使用线程池。 + * @param msg + * @return + */ + public Object sendRequest(Object msg) { + try { + RequestFuture request = new RequestFuture(); + request.setRequest(msg); + String requestStr = JSONObject.toJSONString(request); + future.channel().writeAndFlush(requestStr); + myselfPrint("我阻塞了", null); + return request.get(); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + public static void main(String[] args) { + NettyClient nettyClient = new NettyClient(); + for (int i = 0; i < 10; i++) { + Object result = nettyClient.sendRequest("hello"); + myselfPrint("拿到结果了", result); + } + } + + public static void myselfPrint(String description, Object value) { + StringBuilder builder = new StringBuilder(); + builder.append(Thread.currentThread().getName()); + if (!StringUtils.isEmpty(description)) { + builder.append("-").append(description); + } + if (!StringUtils.isEmpty(value)) { + builder.append("-").append(value); + } + System.out.println(builder.toString()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyServer.java new file mode 100644 index 0000000..d668c6b --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/NettyServer.java @@ -0,0 +1,52 @@ +package com.bruis.learnnetty.netty.connections.longconnections; + +import com.bruis.learnnetty.netty.connections.shortconnections.ServerHandler; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; + +/** + * 基于短连接的Netty服务端 + * + * @author lhy + * @date 2022/2/11 + */ +public class NettyServer { + public static void main(String[] args) { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.option(ChannelOption.SO_BACKLOG, 128) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)) + .addLast(new StringDecoder()) + .addLast(new ServerHandler()) + .addLast(new LengthFieldPrepender(4, false)) + .addLast(new StringEncoder()); + } + }); + ChannelFuture future = serverBootstrap.bind(8080).sync(); + future.channel().closeFuture().sync(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/RequestFuture.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/RequestFuture.java new file mode 100644 index 0000000..6c5167a --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/RequestFuture.java @@ -0,0 +1,130 @@ +package com.bruis.learnnetty.netty.connections.longconnections; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 模拟客户端请求类,用于构建请求对象 + * + * @author lhy + * @date 2022/2/10 + */ +public class RequestFuture { + public static Map futures = new ConcurrentHashMap<>(); + private final Lock lock = new ReentrantLock(); + private final Condition condition = lock.newCondition(); + private long id; + /** + * 请求参数 + */ + private Object request; + /** + * 响应结果 + */ + private Object result; + /** + * 超时时间 + */ + private long timeout = 5000; + public static final AtomicLong aid = new AtomicLong(); + + public RequestFuture() { + id = aid.incrementAndGet(); + addFuture(this); + } + + /** + * 把请求放入本地缓存中 + * @param future + */ + public static void addFuture(RequestFuture future) { + futures.put(future.getId(), future); + } + + /** + * 同步获取响应结果 + * @return + */ + public Object get() { + lock.lock(); + try { + while (this.result == null) { + try { + // 主线程默认等待5s,然后查看下结果 + condition.await(timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } finally { + lock.unlock(); + } + return this.result; + } + + /** + * 表明服务端发送过来的结果已经接收到了,可以signal了 + * @param result + */ + public static void received(Response result) { + RequestFuture future = futures.remove(result.getId()); + if (null != future) { + future.setResult(result.getResult()); + } + /** + * 通知主线程 + */ + Objects.requireNonNull(future, "RequestFuture").getLock().lock(); + try { + future.getCondition().signalAll(); + } finally { + Objects.requireNonNull(future, "RequestFuture").getLock().unlock(); + } + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getRequest() { + return request; + } + + public void setRequest(Object request) { + this.request = request; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public Lock getLock() { + return lock; + } + + public Condition getCondition() { + return condition; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/Response.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/Response.java new file mode 100644 index 0000000..34ee0d0 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/longconnections/Response.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.netty.connections.longconnections; + +/** + * 响应结果类 + * + * @author lhy + * @date 2022/2/10 + */ +public class Response { + private long id; + private Object result; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ClientHandler.java new file mode 100644 index 0000000..6918c68 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ClientHandler.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.netty.connections.shortconnections; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.thread.synchronize.Response; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.util.concurrent.Promise; + +/** + * @author lhy + * @date 2022/2/11 + */ +public class ClientHandler extends ChannelInboundHandlerAdapter { + private Promise promise; + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + Response response = JSONObject.parseObject(msg.toString(), Response.class); + promise.setSuccess(response); + } + + public Promise getPromise() { + return promise; + } + + public void setPromise(Promise promise) { + this.promise = promise; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyClient.java new file mode 100644 index 0000000..e00bc64 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyClient.java @@ -0,0 +1,66 @@ +package com.bruis.learnnetty.netty.connections.shortconnections; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.thread.synchronize.RequestFuture; +import com.bruis.learnnetty.thread.synchronize.Response; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import io.netty.util.concurrent.DefaultPromise; +import io.netty.util.concurrent.Promise; + +import java.nio.charset.StandardCharsets; + +/** + * @author lhy + * @date 2022/2/11 + */ +public class NettyClient { + public static EventLoopGroup group = null; + public static Bootstrap bootstrap = null; + static { + bootstrap = new Bootstrap(); + group = new NioEventLoopGroup(); + bootstrap.channel(NioSocketChannel.class); + bootstrap.group(group); + bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); + } + public static void main(String[] args) { + try { + Promise promise = new DefaultPromise<>(group.next()); + final ClientHandler clientHandler = new ClientHandler(); + clientHandler.setPromise(promise); + bootstrap.handler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)) + .addLast(new StringDecoder()) + .addLast(clientHandler) + .addLast(new LengthFieldPrepender(4, false)) + .addLast(new StringEncoder(StandardCharsets.UTF_8)); + } + }); + ChannelFuture future = bootstrap.connect("127.0.0.1", 8080).sync(); + RequestFuture request = new RequestFuture(); + request.setId(1); + request.setRequest("hello world!"); + String requestString = JSONObject.toJSONString(request); + // 向服务端发送请求 + future.channel().writeAndFlush(requestString); + // 同步阻塞等待服务端响应请求 + Response response = promise.get(); + System.out.println(JSONObject.toJSONString(response)); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyServer.java new file mode 100644 index 0000000..4453bd6 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/NettyServer.java @@ -0,0 +1,51 @@ +package com.bruis.learnnetty.netty.connections.shortconnections; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; + +/** + * 基于短连接的Netty服务端 + * + * @author lhy + * @date 2022/2/11 + */ +public class NettyServer { + public static void main(String[] args) { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.option(ChannelOption.SO_BACKLOG, 128) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)) + .addLast(new StringDecoder()) + .addLast(new ServerHandler()) + .addLast(new LengthFieldPrepender(4, false)) + .addLast(new StringEncoder()); + } + }); + ChannelFuture future = serverBootstrap.bind(8080).sync(); + future.channel().closeFuture().sync(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ServerHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ServerHandler.java new file mode 100644 index 0000000..ec172ec --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/netty/connections/shortconnections/ServerHandler.java @@ -0,0 +1,32 @@ +package com.bruis.learnnetty.netty.connections.shortconnections; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.thread.synchronize.RequestFuture; +import com.bruis.learnnetty.thread.synchronize.Response; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author lhy + * @date 2022/2/11 + */ +public class ServerHandler extends ChannelInboundHandlerAdapter { + /** + * 接受客户端发送过来的请求 + * @param ctx + * @param msg + * @throws Exception + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + RequestFuture request = JSONObject.parseObject(msg.toString(), RequestFuture.class); + long id = request.getId(); + Response response = new Response(); + response.setId(id); + response.setResult("我是服务端(" + id + ")"); + /** + * 给客户端发送响应结果 + */ + ctx.channel().writeAndFlush(JSONObject.toJSONString(response)); + } +} From 437fc315419a95aeefa92f7aa41a895622e6c21f Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Thu, 17 Feb 2022 17:51:07 +0800 Subject: [PATCH 48/68] =?UTF-8?q?[A]=20=E5=9F=BA=E4=BA=8ENetty=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E7=9A=84=E5=8D=95=E6=9C=BA=E7=89=88RPC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nio/{demo01 => }/NIOClient.java | 2 +- .../nio/{demo01 => }/NIOServer.java | 2 +- .../learnnetty/rpc/client/ClientHandler.java | 19 +++ .../learnnetty/rpc/client/NettyClient.java | 92 +++++++++++ .../rpc/controller/UserController.java | 17 +++ .../rpc/server/ApplicationMain.java | 38 +++++ .../rpc/server/InitLoadRemoteMethod.java | 55 +++++++ .../rpc/server/NettyApplicationListener.java | 23 +++ .../learnnetty/rpc/server/NettyServer.java | 51 +++++++ .../learnnetty/rpc/server/ServerHandler.java | 29 ++++ .../bruis/learnnetty/rpc/utils/Mediator.java | 80 ++++++++++ .../bruis/learnnetty/rpc/utils/Remote.java | 16 ++ .../learnnetty/rpc/utils/RequestFuture.java | 143 ++++++++++++++++++ .../bruis/learnnetty/rpc/utils/Response.java | 28 ++++ 14 files changed, 593 insertions(+), 2 deletions(-) rename Spring-Netty/src/main/java/com/bruis/learnnetty/nio/{demo01 => }/NIOClient.java (96%) rename Spring-Netty/src/main/java/com/bruis/learnnetty/nio/{demo01 => }/NIOServer.java (98%) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/ClientHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/NettyClient.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/controller/UserController.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ApplicationMain.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/InitLoadRemoteMethod.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyApplicationListener.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyServer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ServerHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Mediator.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Remote.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/RequestFuture.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Response.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOClient.java similarity index 96% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOClient.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOClient.java index e562ddb..92178e8 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOClient.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOClient.java @@ -1,4 +1,4 @@ -package com.bruis.learnnetty.nio.demo01; +package com.bruis.learnnetty.nio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOServer.java similarity index 98% rename from Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOServer.java rename to Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOServer.java index c897f1e..15ec3f2 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/demo01/NIOServer.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/nio/NIOServer.java @@ -1,4 +1,4 @@ -package com.bruis.learnnetty.nio.demo01; +package com.bruis.learnnetty.nio; import java.net.InetSocketAddress; import java.nio.ByteBuffer; diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/ClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/ClientHandler.java new file mode 100644 index 0000000..2ceb2a8 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/ClientHandler.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.rpc.client; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.rpc.utils.RequestFuture; +import com.bruis.learnnetty.rpc.utils.Response; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author lhy + * @date 2022/2/11 + */ +public class ClientHandler extends ChannelInboundHandlerAdapter { + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + Response response = JSONObject.parseObject(msg.toString(), Response.class); + RequestFuture.received(response); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/NettyClient.java new file mode 100644 index 0000000..e80d8c1 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/client/NettyClient.java @@ -0,0 +1,92 @@ +package com.bruis.learnnetty.rpc.client; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.rpc.utils.RequestFuture; +import io.netty.bootstrap.Bootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; +import org.springframework.util.StringUtils; + +import java.nio.charset.Charset; + +/** + * @author lhy + * @date 2022/2/16 + */ +public class NettyClient { + public static EventLoopGroup group = null; + public static Bootstrap bootstrap = null; + public static ChannelFuture future = null; + static { + bootstrap = new Bootstrap(); + group = new NioEventLoopGroup(); + bootstrap.channel(NioSocketChannel.class); + bootstrap.group(group); + bootstrap.option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); + final ClientHandler clientHandler = new ClientHandler(); + bootstrap.handler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, + 0, 4, 0, 4)); + ch.pipeline().addLast(new StringDecoder()); + ch.pipeline().addLast(clientHandler); + ch.pipeline().addLast(new LengthFieldPrepender(4, false)); + ch.pipeline().addLast(new StringEncoder(Charset.forName("utf-8"))); + } + }); + try { + future = bootstrap.connect("127.0.0.1", 8080).sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + /** + * 说明:对于这个长连接的例子中,使用了静态化,即单链接、长连接,如果是多链接的话不可使用静态化,需使用线程池。 + * @param msg + * @return + */ + public Object sendRequest(Object msg, String path) { + try { + RequestFuture request = new RequestFuture(); + request.setRequest(msg); + request.setPath(path); + String requestStr = JSONObject.toJSONString(request); + future.channel().writeAndFlush(requestStr); + myselfPrint("我阻塞了", null); + return request.get(); + } catch (Exception e) { + e.printStackTrace(); + throw e; + } + } + public static void main(String[] args) { + NettyClient nettyClient = new NettyClient(); + for (int i = 0; i < 10; i++) { + Object result = nettyClient.sendRequest("hello-" + i, "getUserNameById"); + myselfPrint("拿到结果了", result); + } + } + + public static void myselfPrint(String description, Object value) { + StringBuilder builder = new StringBuilder(); + builder.append(Thread.currentThread().getName()); + if (!StringUtils.isEmpty(description)) { + builder.append("-").append(description); + } + if (!StringUtils.isEmpty(value)) { + builder.append("-").append(value); + } + System.out.println(builder.toString()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/controller/UserController.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/controller/UserController.java new file mode 100644 index 0000000..2df7483 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/controller/UserController.java @@ -0,0 +1,17 @@ +package com.bruis.learnnetty.rpc.controller; + +import com.bruis.learnnetty.rpc.utils.Remote; +import org.springframework.stereotype.Controller; + +/** + * @author lhy + * @date 2022/2/17 + */ +@Controller +public class UserController { + @Remote(value = "getUserNameById") + public Object getUserNameById(String userId) { + System.out.println(Thread.currentThread().getName() + "-> 接受到请求:" + userId); + return "做了业务处理了,结果是用户编号userId为" + userId + "的用户姓名为张三"; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ApplicationMain.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ApplicationMain.java new file mode 100644 index 0000000..b8fbb85 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ApplicationMain.java @@ -0,0 +1,38 @@ +package com.bruis.learnnetty.rpc.server; + +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +/** + * @author lhy + * @date 2022/2/17 + */ +public class ApplicationMain { + + private static volatile boolean running = true; + + public static void main(String[] args) { + try { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.bruis.learnnetty.rpc"); + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + context.stop(); + } catch (Exception e) {} + + synchronized (ApplicationMain.class) { + running = false; + ApplicationMain.class.notify(); + } + })); + context.start(); + } catch (Exception e) { + e.printStackTrace(); + System.exit(1); + } + System.out.println("服务器已启动"); + synchronized (ApplicationMain.class) { + try { + ApplicationMain.class.wait(); + } catch (Exception e) {} + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/InitLoadRemoteMethod.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/InitLoadRemoteMethod.java new file mode 100644 index 0000000..6942514 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/InitLoadRemoteMethod.java @@ -0,0 +1,55 @@ +package com.bruis.learnnetty.rpc.server; + +import com.bruis.learnnetty.rpc.utils.Mediator; +import com.bruis.learnnetty.rpc.utils.Remote; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.core.Ordered; +import org.springframework.stereotype.Component; +import org.springframework.stereotype.Controller; + +import java.lang.reflect.Method; +import java.util.Map; + +/** + * @author lhy + * @date 2022/2/17 + */ +@Component +public class InitLoadRemoteMethod implements ApplicationListener, Ordered { + + @Override + public void onApplicationEvent(ContextRefreshedEvent context) { + // 获取Spring容器中带有@Controller的注解类 + Map controllerBeans = context.getApplicationContext() + .getBeansWithAnnotation(Controller.class); + for (String beanName : controllerBeans.keySet()) { + Object beanObj = controllerBeans.get(beanName); + // 获取这个bean的方法集合 + Method[] methods = beanObj.getClass().getMethods(); + for (Method method : methods) { + // 判断这个方法是否带有@Remote注解 + if (method.isAnnotationPresent(Remote.class)) { + Remote remote = method.getAnnotation(Remote.class); + // 注解的值 + String remoteValue = remote.value(); + // 缓存这个类 + Mediator.MethodBean methodBean = new Mediator.MethodBean(); + methodBean.setBean(beanObj); + methodBean.setMethod(method); + // @Remote的value值作为key,MethodBean作为value + Mediator.methodBeans.put(remoteValue, methodBean); + } + } + } + } + + /** + * 值越小优先级越高 + * @return + */ + @Override + public int getOrder() { + return -1; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyApplicationListener.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyApplicationListener.java new file mode 100644 index 0000000..dd63c71 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyApplicationListener.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.rpc.server; + +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.stereotype.Component; + +/** + * @author lhy + * @date 2022/2/17 + */ +@Component +public class NettyApplicationListener implements ApplicationListener { + @Override + public void onApplicationEvent(ContextRefreshedEvent event) { + // 开启额外线程启动Netty服务 + new Thread() { + @Override + public void run() { + NettyServer.start(); + } + }.start(); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyServer.java new file mode 100644 index 0000000..cc8bfee --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/NettyServer.java @@ -0,0 +1,51 @@ +package com.bruis.learnnetty.rpc.server; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; +import io.netty.handler.codec.LengthFieldPrepender; +import io.netty.handler.codec.string.StringDecoder; +import io.netty.handler.codec.string.StringEncoder; + +/** + * 基于短连接的Netty服务端 + * + * @author lhy + * @date 2022/2/11 + */ +public class NettyServer { + public static void start() { + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(); + try { + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup); + serverBootstrap.channel(NioServerSocketChannel.class); + + serverBootstrap.option(ChannelOption.SO_BACKLOG, 128) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE, 0, 4, 0, 4)) + .addLast(new StringDecoder()) + .addLast(new ServerHandler()) + .addLast(new LengthFieldPrepender(4, false)) + .addLast(new StringEncoder()); + } + }); + ChannelFuture future = serverBootstrap.bind(8080).sync(); + future.channel().closeFuture().sync(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ServerHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ServerHandler.java new file mode 100644 index 0000000..7daa7ed --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/server/ServerHandler.java @@ -0,0 +1,29 @@ +package com.bruis.learnnetty.rpc.server; + +import com.alibaba.fastjson.JSONObject; +import com.bruis.learnnetty.rpc.utils.Mediator; +import com.bruis.learnnetty.rpc.utils.RequestFuture; +import com.bruis.learnnetty.rpc.utils.Response; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @author lhy + * @date 2022/2/11 + */ +@ChannelHandler.Sharable +public class ServerHandler extends ChannelInboundHandlerAdapter { + /** + * 接受客户端发送过来的请求 + * @param ctx + * @param msg + * @throws Exception + */ + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + RequestFuture request = JSONObject.parseObject(msg.toString(), RequestFuture.class); + Response response = Mediator.process(request); + ctx.channel().writeAndFlush(JSONObject.toJSONString(response)); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Mediator.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Mediator.java new file mode 100644 index 0000000..99ccf31 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Mediator.java @@ -0,0 +1,80 @@ +package com.bruis.learnnetty.rpc.utils; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * 存储RPC中的映射以及方法Bean + * + * @author lhy + * @date 2022/2/17 + */ +public class Mediator { + + public static Map methodBeans; + + static { + methodBeans = new HashMap<>(); + } + + public static Response process(RequestFuture future) { + Response response = new Response(); + try { + String path = future.getPath(); + MethodBean methodBean = methodBeans.get(path); + if (null != methodBean) { + Object bean = methodBean.getBean(); + Method method = methodBean.getMethod(); + Object request = future.getRequest(); + Class[] parameterTypes = method.getParameterTypes(); + // 此处只支持一个参数,所以写死固定0为索引 + Class parameterType = parameterTypes[0]; + Object param = null; + // 如果参数是List类型 + if (parameterType.isAssignableFrom(List.class)) { + param = JSONArray.parseArray(JSONArray.toJSONString(request), parameterType); + } else if (parameterType.getName().equalsIgnoreCase(String.class.getName())) { + param = request; + } else { + param = JSONObject.parseObject(JSONObject.toJSONString(request), parameterType); + } + // 反射调用方法 + Object result = method.invoke(bean, param); + response.setResult(result); + } + } catch (Exception e) { + e.printStackTrace(); + } + response.setId(future.getId()); + return response; + } + + public static class MethodBean { + + private Object bean; + + private Method method; + + public Object getBean() { + return bean; + } + + public void setBean(Object bean) { + this.bean = bean; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Remote.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Remote.java new file mode 100644 index 0000000..c173567 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Remote.java @@ -0,0 +1,16 @@ +package com.bruis.learnnetty.rpc.utils; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author lhy + * @date 2022/2/17 + */ +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Remote { + String value(); +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/RequestFuture.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/RequestFuture.java new file mode 100644 index 0000000..340f30a --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/RequestFuture.java @@ -0,0 +1,143 @@ +package com.bruis.learnnetty.rpc.utils; + +import java.util.Map; +import java.util.Objects; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 模拟客户端请求类,用于构建请求对象 + * + * @author lhy + * @date 2022/2/10 + */ +public class RequestFuture { + public static Map futures = new ConcurrentHashMap<>(); + private final Lock lock = new ReentrantLock(); + private final Condition condition = lock.newCondition(); + private long id; + /** + * 请求参数 + */ + private Object request; + /** + * 响应结果 + */ + private Object result; + /** + * 超时时间 + */ + private long timeout = 5000; + /** + * 请求路径 + */ + private String path; + + public static final AtomicLong aid = new AtomicLong(); + + public RequestFuture() { + id = aid.incrementAndGet(); + addFuture(this); + } + + /** + * 把请求放入本地缓存中 + * @param future + */ + public static void addFuture(RequestFuture future) { + futures.put(future.getId(), future); + } + + /** + * 同步获取响应结果 + * @return + */ + public Object get() { + lock.lock(); + try { + while (this.result == null) { + try { + // 主线程默认等待5s,然后查看下结果 + condition.await(timeout, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } finally { + lock.unlock(); + } + return this.result; + } + + /** + * 异步线程将结果返回主线程 + * @param result + */ + public static void received(Response result) { + RequestFuture future = futures.remove(result.getId()); + if (null != future) { + future.setResult(result.getResult()); + } + /** + * 通知主线程 + */ + Objects.requireNonNull(future, "RequestFuture").getLock().lock(); + try { + future.getCondition().signalAll(); + } finally { + Objects.requireNonNull(future, "RequestFuture").getLock().unlock(); + } + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getRequest() { + return request; + } + + public void setRequest(Object request) { + this.request = request; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } + + public long getTimeout() { + return timeout; + } + + public void setTimeout(long timeout) { + this.timeout = timeout; + } + + public Lock getLock() { + return lock; + } + + public Condition getCondition() { + return condition; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Response.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Response.java new file mode 100644 index 0000000..ac5478f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/rpc/utils/Response.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.rpc.utils; + +/** + * 响应结果类 + * + * @author lhy + * @date 2022/2/10 + */ +public class Response { + private long id; + private Object result; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + this.result = result; + } +} From e8dd6579b35124b71319893a6b1d5ea9d9a466fd Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Fri, 18 Feb 2022 13:52:07 +0800 Subject: [PATCH 49/68] =?UTF-8?q?[U]=20=E6=9B=B4=E6=96=B0Netty=E6=96=87?= =?UTF-8?q?=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...57\345\212\250\345\210\206\346\236\220.md" | 151 ++++++++++++++---- 1 file changed, 123 insertions(+), 28 deletions(-) diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" index 99d24f3..1ff812b 100644 --- "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" @@ -1,15 +1,24 @@ # Netty 服务端启动分析 -在Java中,网络通信是通过Socket来进行的,那么在Netty中,服务端的Socket是在哪里进行初始化的?并且在哪里进行accept连接? Netty里的Channel是啥,有啥作用呢?带着这三个问题,进入本文的Netty服务端启动分析。 +在Java中,网络通信是通过Socket来进行的,那么在Netty中,服务端要用到的Socket是在哪里进行初始化的?并且在哪里进行accept接受客户端连接的? Netty里的Channel是啥,有啥作用呢?带着这三个问题,进入本文的Netty服务端启动分析。 -本文分析将分为四大步: +本文分析将分为五大步: -1. 创建服务端Channel; -2. 初始化服务端Channel; -3. 注册selector; -4. 端口绑定; +1. Netty中的Channel; +2. 创建服务端Channel; +3. 初始化服务端Channel; +4. 注册selector; +5. 端口绑定; -## 1. 创建服务端Channel +## 1. Netty中的Channel + +在Netty中的Channel是用来定义对网络IO进行读/写的相关接口,与NIO中的Channel接口类似。Channel的功能主要有网络IO的读写、客户端发起的连接、主动关闭连接、关闭链路、获取通信双方的网络地址等。Channel接口下有一个重要的抽象类————AbstractChannel,一些公共的基础方法都在这个抽象类中实现,但对于一些特定的功能则需要不同的实现类去实现,这样最大限度地实现了功能和接口的重用。 + +在AbstractChannel中的网络IO模型和协议种类比较多,除了TCP协议,Netty还支持了HTTP2协议,如:AbstractHttp2StreamChannel。 + +Netty对于不同的网络模型以及IO模型,在AbstractChannel的基础上又抽象出了一层,如:AbstractNioChannel、AbstractEpollChannel、AbstractHttp2StreamChannel。 + +## 2. 创建服务端Channel 创建服务端Channel又可以分为四步,如下: @@ -54,13 +63,101 @@ public final class Server { } ``` -服务端构建好ServerBootstrap之后,通过bind()方法进行绑定。进入ServerBootstrap的父类AbstractBootstrap后,一路调用来到AbstractBootstrap#doBind()方法,首先就是初始化并注册Channel。 +服务端构建好ServerBootstrap之后,通过bind()方法进行绑定。进入ServerBootstrap的父类AbstractBootstrap后,线程经过调用栈的调用后来到AbstractBootstrap#doBind()方法,首先就是初始化并注册Channel。 + +AbstractBootstrap#doBind() +```java + private ChannelFuture doBind(final SocketAddress localAddress) { + // 注册channel + final ChannelFuture regFuture = initAndRegister(); + final Channel channel = regFuture.channel(); + if (regFuture.cause() != null) { + return regFuture; + } + + // regFuture如果完成了,则isDone为true,否则给regFuture添加一个监听器,当完成的时候再进行doBind0的操作 + if (regFuture.isDone()) { + // 此时我们已经知道NioServerSocketChannel已经完成了注册 + ChannelPromise promise = channel.newPromise(); + doBind0(regFuture, channel, localAddress, promise); + return promise; + } else { + // Registration future is almost always fulfilled already, but just in case it's not. + final PendingRegistrationPromise promise = new PendingRegistrationPromise(channel); + + // 给regFuture添加一个监听器,当注册chanel完成的时候,会回调进来 + regFuture.addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + Throwable cause = future.cause(); + if (cause != null) { + // Registration on the EventLoop failed so fail the ChannelPromise directly to not cause an + // IllegalStateException once we try to access the EventLoop of the Channel. + promise.setFailure(cause); + } else { + // Registration was successful, so set the correct executor to use. + // See https://github.com/netty/netty/issues/2586 + promise.registered(); + + doBind0(regFuture, channel, localAddress, promise); + } + } + }); + return promise; + } + } + + final ChannelFuture initAndRegister() { + Channel channel = null; + try { + // 拿到ReflectiveChannelFactory,然后通过其newChannel生成一个服务端Channel,底层就是通过反射newInstance()获取实例 + // 这里自然是NioServerSocketChannel实例对象 + channel = channelFactory.newChannel(); + // 初始化channel + init(channel); + } catch (Throwable t) { + if (channel != null) { + // channel can be null if newChannel crashed (eg SocketException("too many open files")) + channel.unsafe().closeForcibly(); + // as the Channel is not registered yet we need to force the usage of the GlobalEventExecutor + return new DefaultChannelPromise(channel, GlobalEventExecutor.INSTANCE).setFailure(t); + } + // as the Channel is not registered yet we need to force the usage of the GlobalEventExecutor + return new DefaultChannelPromise(new FailedChannel(), GlobalEventExecutor.INSTANCE).setFailure(t); + } + + /** + * config() -> ServerBootstrapConfig + * group() -> NioEventLoopGroup,返回的是MultithreadEventLoopGroup + * register() -> 就是通过chooser选取到NioEventLoop对象 + */ + ChannelFuture regFuture = config().group().register(channel); + if (regFuture.cause() != null) { + if (channel.isRegistered()) { + channel.close(); + } else { + channel.unsafe().closeForcibly(); + } + } + return regFuture; + } +``` -![netty01png](https://coderbruis.github.io/javaDocs/img/netty/source/netty01_01.png) +在initAndRegister处channelFactory是ReflectiveChannelFactory,具体赋值处是在ServerBootstrap#channel()方法中定义的,并且传入的channel是:NioServerSocketChannel。 -在initAndRegister处channelFactory是ReflectiveChannelFactory,具体赋值处是在ServerBootstrap#channel()方法中定义的,并且传入的channel是:NioServerSocketChannel,上图中可以见。 +ReflectiveChannelFactory#newChannel +```java + @Override + public T newChannel() { + try { + return constructor.newInstance(); + } catch (Throwable t) { + throw new ChannelException("Unable to create Channel from class " + constructor.getDeclaringClass(), t); + } + } +``` -查看到ReflectiveChannelFactory#newChannel()方法,实际就是调用的NioServerSocketChannel#newInstance()方法反射构建一个channel对象。 +查看到ReflectiveChannelFactory#newChannel()方法,T的类型是NioServerSocketChannel,所以实际就是调用的NioServerSocketChannel#newInstance()方法反射构建一个channel对象。 那么,我们看下NioServerSocketChannel底层是如何获取通过反射创建服务端Channel的呢? @@ -136,15 +233,14 @@ AbstractChannel类 } ``` -总结下服务端创建Channel的三件重要事情: +通过源码阅读,可以总结出Netty服务端创建Channel的三件重要事情: 1. 通过反射来创建JDK底层的channel; 2. 设置Channel为非阻塞模式ch.configureBlocking(false); 3. 创建一个pipeline对象; - -## 2. 初始化服务端Channel +## 3. 初始化服务端Channel 初始化服务端Channel可以分为如下的几步: @@ -208,17 +304,13 @@ ServerBoostrap端初始化过程 } ``` -## 3. 注册selector +## 4. 将Channel注册到selector 整个注册selector过程可以分为以下几步: -- AbstractChannel#register(channel) 入口 - - this.eventLoop = eventLoop 绑定线程 - - register0() 实际注册 - - doRegister() 调用jdk底层进行注册 - - invokeHandlerAddedIfNeeded() - - fireChannelRegistered() 传播注册成功的事件 - +1. AbstractChannel$AbstractUnsafe#register(channel) +2. AbstractUnsafe#register0() +3. AbstractUnsafe#doRegister() AbstractChannel ```java @@ -322,15 +414,16 @@ AbstractNioChannel.java 就这样,NioServerSocketChannel就以Accept事件注册到了Selector上了。 -## 4. 端口绑定 +这里需要注意一点,javaChannel()返回的是AbstractSelectableChannel,调用其register方法用于在给定的selector上注册这个通道channel,并返回一个选这件selectionKey。传入的操作位为0表示对任何事件都不感兴趣,仅仅是完成注册操作。 + +## 5. 端口绑定 端口绑定流程如下: -- AbstractUnsafe#bind() 入口 - - dobind() - - javaChannel().bind() jdk底层绑定 - - pipeline.fireChanelActive() 传播事件 - - HeadContext.readIfIsAutoRead() +1. AbstractBootstrap#bind() +2. AbstractBootstrap#dobind() +3. AbstractChannel#bind() +4. NioServerSocketChannel#doBind() AbstractChannel.AbstractUnsafe#bind() @@ -402,3 +495,5 @@ Netty服务端核心启动流程主要是为了创建NioServerSocketChannel, - AbstractChannel.AbstractUnsafe#register() 将服务端Channel注册到Selector上 - AbstractChannel.AbstractUnsafe#doBind() 注册端口号 + + From 9538194332a2e12a32a04613a6e751a120ada195 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 19 Feb 2022 15:20:36 +0800 Subject: [PATCH 50/68] =?UTF-8?q?[A]=20=E6=96=B0=E5=A2=9ENetty=E5=BA=95?= =?UTF-8?q?=E5=B1=82=E5=8E=9F=E7=90=86=E5=88=86=E6=9E=90=E6=96=87=E7=AB=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- JdkLearn/pom.xml | 1 - README.md | 9 +- Spring-Netty/learnnetty.iml | 2 +- Spring-Netty/pom.xml | 2 - ...57\345\212\250\345\210\206\346\236\220.md" | 1 - ...37\347\220\206\345\210\206\346\236\220.md" | 264 ++++++++++++++++++ 6 files changed, 270 insertions(+), 9 deletions(-) create mode 100644 "note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" diff --git a/JdkLearn/pom.xml b/JdkLearn/pom.xml index 4a18492..9fb74db 100644 --- a/JdkLearn/pom.xml +++ b/JdkLearn/pom.xml @@ -30,7 +30,6 @@ io.netty netty-all - 4.1.6.Final diff --git a/README.md b/README.md index 648b81e..41bc0c9 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ Spring-Security-OAuth2 - Netty + Netty Netty @@ -121,16 +121,17 @@ SpringCloud源码 - Dubbo底层源码学习(七)—— Dubbo的服务消费 - Netty底层源码解析 - - Netty版本:4.1.60.Final + - Netty版本:4.1.43.Final - [二进制运算以及源码、反码以及补码学习](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/%E4%BA%8C%E8%BF%9B%E5%88%B6.md) - [Netty源码包结构](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E6%BA%90%E7%A0%81%E5%8C%85%E7%BB%93%E6%9E%84.md) - - [Netty中的EventLoopGroup](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E4%B8%AD%E7%9A%84EventLoopGroup%E6%98%AF%E4%BB%80%E4%B9%88.md) + - [Netty底层源码解析-EventLoopGroup](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/Netty/Netty%E4%B8%AD%E7%9A%84EventLoopGroup%E6%98%AF%E4%BB%80%E4%B9%88.md) - [Netty底层源码解析-初始Netty及其架构](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-%E5%88%9D%E5%A7%8BNetty%E5%8F%8A%E5%85%B6%E6%9E%B6%E6%9E%84.md) - [Netty底层源码解析-Netty服务端启动分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-Netty%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8%E5%88%86%E6%9E%90.md) - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - - Netty底层源码解析-Channel分析 - [Netty底层源码解析-ChannelPipeline分析(上)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8A%EF%BC%89.md) - [Netty底层源码解析-ChannelPipeline分析(下)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8B%EF%BC%89.md) + - Netty底层源码解析-NioServerSocketChannel接受数据原理分析 + - Netty底层源码解析-NioSocketChannel接受、发送数据原理分析 - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 - Netty底层源码解析-RocketMQ底层使用到的Netty diff --git a/Spring-Netty/learnnetty.iml b/Spring-Netty/learnnetty.iml index 8cc03a7..07cda18 100644 --- a/Spring-Netty/learnnetty.iml +++ b/Spring-Netty/learnnetty.iml @@ -92,7 +92,7 @@ - + \ No newline at end of file diff --git a/Spring-Netty/pom.xml b/Spring-Netty/pom.xml index d640f68..82d7684 100644 --- a/Spring-Netty/pom.xml +++ b/Spring-Netty/pom.xml @@ -16,7 +16,6 @@ 1.8 - 4.1.6.Final @@ -35,7 +34,6 @@ io.netty netty-all - ${netty-all.version} diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" index 1ff812b..986e355 100644 --- "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-Netty\346\234\215\345\212\241\347\253\257\345\220\257\345\212\250\345\210\206\346\236\220.md" @@ -496,4 +496,3 @@ Netty服务端核心启动流程主要是为了创建NioServerSocketChannel, - AbstractChannel.AbstractUnsafe#doBind() 注册端口号 - diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" new file mode 100644 index 0000000..c1dbe36 --- /dev/null +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" @@ -0,0 +1,264 @@ +## NioServerSocketChannel读取数据原理分析 + +NioServerSocketChannel是AbstractNioMessageChannel的子类,而NioSocketChannel是AbstractNioByteChannel的子类,并且他们都有一个公共的父类:AbstractChannel。 + +在Netty中Channel是用来定义对网络IO的读写操作的相关接口,与NIO的Channel接口类似。Channel的功能主要有网络IO的读写、客户端发起的连接、主动关闭连接、关闭链路、获取通信双方的网络地址等。一些公共的基础方法都在这个AbstractChannel抽象类中实现,但对于一些特定的功能则需要不同的实现类去实现,这样最大限度地实现了功能和接口的重用。 + +另外,AbstractChannel的构造方法中对Unsafe类和ChannelPipeline类进行了初始化。 + +## 1. NioServerSocketChannel源码分析 + +NioServerSocketChannel是AbstractNioMessageChannel的子类,由于它由服务端使用,并且只负责监听Socket的接入,不关心IO的读写,所以与NioSocketChannel相比要简单得多。 + +NioServerSocketChannel封装了NIO中的ServerSocketChannel,并通过newSocket()方法打开了ServerSocketChannel + +NioServerSocketChannel.class + +```java + private static ServerSocketChannel newSocket(SelectorProvider provider) { + try { + return provider.openServerSocketChannel(); + } catch (IOException e) { + throw new ChannelException( + "Failed to open a server socket.", e); + } + } +``` + +对于NioServerSocketChannel注册至selector上的操作,是在AbstractNioChannel中实现的,源码如下: + +```java + @Override + protected void doRegister() throws Exception { + boolean selected = false; + for (;;) { + try { + selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this); + return; + } catch (CancelledKeyException e) { + if (!selected) { + eventLoop().selectNow(); + selected = true; + } else { + throw e; + } + } + } + } +``` + +在ServerChannel的开启,selector上的注册等前期工作完成后,NioServerSocketChannel的开始监听新连接的加入,源码如下: + +```java + @Override + protected int doReadMessages(List buf) throws Exception { + // 拿到jdk底层channel + SocketChannel ch = SocketUtils.accept(javaChannel()); + + try { + if (ch != null) { + // new出一个NioSocketChannel,将jdk SocketChannel封装成NioSocketChannel,并且这里给NioSocketChannel注册了一个SelectionKey.OP_READ事件 + buf.add(new NioSocketChannel(this, ch)); // 往buf里写入NioSocketChannel + return 1; + } + } catch (Throwable t) { + logger.warn("Failed to create a new channel from an accepted socket.", t); + + try { + ch.close(); + } catch (Throwable t2) { + logger.warn("Failed to close a socket.", t2); + } + } + + return 0; + } +``` + +上面的源码展示了Netty最终拿到新连接请求后,将jdk底层的SocketChannel封装NioSocketChannel的过程,那么selector是如何获取到accept事件后,调用到这个doReadMessages方法的呢? + +为了分析原理的延续,故事还要回到bossGroup的NioEventLoop里,当bossGroup启动,NioServerSocketChannel实例新建并注册到selector之后,Netty的bossGroup就会运行一个NioEventLoop,它的核心工作就是作为一个selector一直去监听客户端发出的accept、connect、read、write等事件。具体逻辑查看NioEventLoop#run()方法,详细的原理请回看之前的NioEventLoop的原理分析,此处只分析NioEventLoop#run()获取到链接事件到调用NioServerSocketChannel#doReadMessages()的链路。 + +1. NioEventLoop#run()一直轮训,监听这客户端发出的事件,在轮训过程中如果有任务产生,则会优先执行这些任务,调用非阻塞的selectNow(),否则调用select(deadlineNanos)阻塞指定时间去监听客户端事件。 +2. 调用NioEventLoop#processSelectedKeys(),Netty默认用的是优化过后的selectedKey,所以调用的是NioEventLoop#processSelectedKeysOptimized()方法。 +3. 在processSelectedKeysOptimized方法里会遍历selectedKeys,去拿selectedKeys中的SelectionKey,这个key就是从网络中获取到的感兴趣事件。 +4. 先通过SelectionKey获取attachment,及对应的事件channel。由于这里是获取的是accept事件,所以SelectionKey#attachment()获取到的是NioServerSocketChannel对象。 +5. 在NioEventLoop#processSelectedKey()方法中,首先拿到NioServerSocketChannel父类AbstractNioMessageChannel中的NioMessageUnsafe对象,接着根据readyOps进行判断,这里当然就是SelectionKey.OP_ACCEPT事件。 +6. 调用NioMessageUnsafe#read()方法,最终该方法调用了NioServerSocketChannel#doReadMessages(),完了之后会新建一个对SelectionKey.OP_READ事件感兴趣的NioSocketChannel对象,并存放在readBuf的一个集合中。 +7. 接着调用ChannelPipeline#fireChannelRead()方法,目的在于最终调用ServerBootstrapAcceptor#channelRead()方法,调用childGroup#register(child),把新建的NioSocketChannel对象注册到selector上。 + +这样,NioServerSocketChannel监听accept事件,接收到客户端连接后,封装客户端的“连接”到NioSocketChannel对象,并注册到selector上,后面的网络IO的读写操作都由这个NioSocketChannel对象来负责处理。 + +上述核心的6步源码如下: + +NioEventLoop.class +```java + @Override + protected void run() { + for (;;) { + try { + try { + switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { + // ... 省略 + case SelectStrategy.SELECT: + select(wakenUp.getAndSet(false)); + // ... 省略 + if (wakenUp.get()) { + selector.wakeup(); + } + // fall through + default: + } + } catch (IOException e) { + rebuildSelector0(); + handleLoopException(e); + continue; + } + // ... 省略 + + // 步骤1 + processSelectedKeys(); + runAllTasks(); + + // ... 省略 + } catch (Throwable t) { + handleLoopException(t); + // ... 省略 + } + } + } +``` + +NioEventLoop.class +```java + // 步骤2 + private void processSelectedKeysOptimized() { + for (int i = 0; i < selectedKeys.size; ++i) { + // 步骤3 + final SelectionKey k = selectedKeys.keys[i]; + selectedKeys.keys[i] = null; + + // 步骤4 + final Object a = k.attachment(); + + if (a instanceof AbstractNioChannel) { + // 步骤5 + processSelectedKey(k, (AbstractNioChannel) a); + } else { + @SuppressWarnings("unchecked") + NioTask task = (NioTask) a; + processSelectedKey(k, task); + } + + if (needsToSelectAgain) { + selectedKeys.reset(i + 1); + + selectAgain(); + i = -1; + } + } + } +``` + +NioEventLoop.class +```java + private void processSelectedKey(SelectionKey k, AbstractNioChannel ch) { + final AbstractNioChannel.NioUnsafe unsafe = ch.unsafe(); + if (!k.isValid()) { + final EventLoop eventLoop; + try { + eventLoop = ch.eventLoop(); + } catch (Throwable ignored) { + return; + } + if (eventLoop != this || eventLoop == null) { + return; + } + unsafe.close(unsafe.voidPromise()); + return; + } + + try { + int readyOps = k.readyOps(); + if ((readyOps & SelectionKey.OP_CONNECT) != 0) { + int ops = k.interestOps(); + ops &= ~SelectionKey.OP_CONNECT; + k.interestOps(ops); + + unsafe.finishConnect(); + } + + if ((readyOps & SelectionKey.OP_WRITE) != 0) { + ch.unsafe().forceFlush(); + } + + // 步骤5 + if ((readyOps & (SelectionKey.OP_READ | SelectionKey.OP_ACCEPT)) != 0 || readyOps == 0) { + unsafe.read(); + } + } catch (CancelledKeyException ignored) { + unsafe.close(unsafe.voidPromise()); + } + } +``` + +NioServerSocketChannel.class + +```java + @Override + protected int doReadMessages(List buf) throws Exception { + // 拿到jdk 的SocketChannel,代表着和客户端的一个连接socket + SocketChannel ch = SocketUtils.accept(javaChannel()); + + try { + if (ch != null) { + // 步骤6 + // 封装一个NioSocketChannel对象,并且设置感兴趣事件为:SelectionKey.OP_READ + buf.add(new NioSocketChannel(this, ch)); + return 1; + } + } catch (Throwable t) { + logger.warn("Failed to create a new channel from an accepted socket.", t); + + try { + ch.close(); + } catch (Throwable t2) { + logger.warn("Failed to close a socket.", t2); + } + } + + return 0; + } +``` + +ServerBootstrapAcceptor.class + +```java + public void channelRead(ChannelHandlerContext ctx, Object msg) { + final Channel child = (Channel) msg; + + child.pipeline().addLast(childHandler); + + setChannelOptions(child, childOptions, logger); + setAttributes(child, childAttrs); + + try { + // 步骤7 + // 在workerGroup的NioEventLoop上的selector注册了NioSocketChannel + childGroup.register(child).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + if (!future.isSuccess()) { + forceClose(child, future.cause()); + } + } + }); + } catch (Throwable t) { + forceClose(child, t); + } + } +``` + +以上就是Netty中有关NioServerSocketChannel读取数据的底层原理分析。 + +下一篇分析NioSocketChannel的发送、读取数据底层原理。 \ No newline at end of file From e2bd70e53ca761e7c7fb067ecc4f1a9da48bb409 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 19 Feb 2022 15:39:32 +0800 Subject: [PATCH 51/68] =?UTF-8?q?[U]=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E7=AB=A0=E7=9B=AE=E5=BD=95=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 41bc0c9..f96c8ea 100644 --- a/README.md +++ b/README.md @@ -130,7 +130,7 @@ SpringCloud源码 - [Netty底层源码解析-NioEventLoop原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioEventLoop%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - [Netty底层源码解析-ChannelPipeline分析(上)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8A%EF%BC%89.md) - [Netty底层源码解析-ChannelPipeline分析(下)](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-ChannelPipeline%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%8B%EF%BC%89.md) - - Netty底层源码解析-NioServerSocketChannel接受数据原理分析 + - [Netty底层源码解析-NioServerSocketChannel接受数据原理分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/Netty/Netty%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90-NioServerSocketChannel%E6%8E%A5%E5%8F%97%E6%95%B0%E6%8D%AE%E5%8E%9F%E7%90%86%E5%88%86%E6%9E%90.md) - Netty底层源码解析-NioSocketChannel接受、发送数据原理分析 - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 From 134feac257703f528a5e0dc84d43c1e7abaef534 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sun, 20 Feb 2022 23:25:58 +0800 Subject: [PATCH 52/68] [U] fix --- ...345\216\237\347\220\206\345\210\206\346\236\220.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" index c1dbe36..05499f2 100644 --- "a/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" +++ "b/note/Netty/Netty\345\272\225\345\261\202\346\272\220\347\240\201\350\247\243\346\236\220-NioServerSocketChannel\346\216\245\345\217\227\346\225\260\346\215\256\345\216\237\347\220\206\345\210\206\346\236\220.md" @@ -1,10 +1,10 @@ ## NioServerSocketChannel读取数据原理分析 -NioServerSocketChannel是AbstractNioMessageChannel的子类,而NioSocketChannel是AbstractNioByteChannel的子类,并且他们都有一个公共的父类:AbstractChannel。 +NioServerSocketChannel是AbstractNioMessageChannel的子类,而NioSocketChannel是AbstractNioByteChannel的子类,并且他们都有两个公共的父类:AbstractNioChannel、AbstractChannel。 -在Netty中Channel是用来定义对网络IO的读写操作的相关接口,与NIO的Channel接口类似。Channel的功能主要有网络IO的读写、客户端发起的连接、主动关闭连接、关闭链路、获取通信双方的网络地址等。一些公共的基础方法都在这个AbstractChannel抽象类中实现,但对于一些特定的功能则需要不同的实现类去实现,这样最大限度地实现了功能和接口的重用。 - -另外,AbstractChannel的构造方法中对Unsafe类和ChannelPipeline类进行了初始化。 +在Netty中Channel是用来定义对网络IO的读写操作的相关接口,与NIO的Channel接口类似。Channel的功能主要有网络IO的读写、客户端发起的连接、主动关闭连接、关闭链路、获取通信双方的网络地址等。 +一些公共的基础方法都在这个AbstractChannel抽象类中实现,几个核心的方法如:channel的注册,channel撤销注册,网络IO的读、写。但对于一些特定的功能则需要不同的实现类去实现,这样最大限度地实现了功能和接口的重用, +就如AbstractNioChannel中主要定义了doRegister()、doConnect()、newDirectBuffer()方法。 ## 1. NioServerSocketChannel源码分析 @@ -47,7 +47,7 @@ NioServerSocketChannel.class } ``` -在ServerChannel的开启,selector上的注册等前期工作完成后,NioServerSocketChannel的开始监听新连接的加入,源码如下: +在ServerSocketChannel的开启,selector上的注册等前期工作完成后,NioServerSocketChannel的开始监听新连接的加入,源码如下: ```java @Override From 34ed31b36ab07b1df8e685f2cdd926024d27560c Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Fri, 25 Feb 2022 21:15:48 +0800 Subject: [PATCH 53/68] =?UTF-8?q?fix=20SpringBoot=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=99=A8md=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f96c8ea..e69a07d 100644 --- a/README.md +++ b/README.md @@ -96,7 +96,7 @@ SpringCloud源码 - [深入浅出SpringBoot源码——SpringFactoriesLoader](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94SpringFactoriesLoader.md) - [深入浅出SpringBoot源码——监听器与事件机制](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E7%9B%91%E5%90%AC%E5%99%A8%E4%B8%8E%E4%BA%8B%E4%BB%B6%E6%9C%BA%E5%88%B6.md) - - [深入浅出SpringBoot源码——系统初始化器](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E7%B3%BB%E7%BB%9F.md) + - [深入浅出SpringBoot源码——系统初始化器](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E7%B3%BB%E7%BB%9F%E5%88%9D%E5%A7%8B%E5%8C%96%E5%99%A8.md) - [深入浅出SpringBoot源码——启动加载器](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/SpringBoot/%E6%B7%B1%E5%85%A5SpringBoot%E6%BA%90%E7%A0%81%E5%AD%A6%E4%B9%A0%E4%B9%8B%E2%80%94%E2%80%94%E5%90%AF%E5%8A%A8%E5%8A%A0%E8%BD%BD%E5%99%A8.md) - SpringSecurity&OAuth2源码学习 From f2f9a9af79543518722af9739cd3f9995bfd43c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=B7=E9=98=B3=E7=BD=97?= Date: Wed, 23 Mar 2022 17:56:47 +0800 Subject: [PATCH 54/68] =?UTF-8?q?=E5=9F=BA=E4=BA=8ENetty=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?im=E9=80=9A=E8=AE=AF=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Spring-Netty/learnnetty.iml | 98 ------------------- .../learnnetty/im/client/NettyClient.java | 95 ++++++++++++++++++ .../im/client/handler/FirstClientHandler.java | 35 +++++++ .../client/handler/LoginResponseHandler.java | 40 ++++++++ .../handler/MessageResponseHandler.java | 19 ++++ .../learnnetty/im/codec/PacketDecoder.java | 20 ++++ .../learnnetty/im/codec/PacketEncoder.java | 19 ++++ .../bruis/learnnetty/im/codec/Spliter.java | 30 ++++++ .../bruis/learnnetty/im/model/Attributes.java | 12 +++ .../bruis/learnnetty/im/model/Command.java | 44 +++++++++ .../im/model/LoginRequestPacket.java | 46 +++++++++ .../im/model/LoginResponsePacket.java | 36 +++++++ .../im/model/MessageRequestPacket.java | 32 ++++++ .../im/model/MessageResponsePacket.java | 27 +++++ .../com/bruis/learnnetty/im/model/Packet.java | 27 +++++ .../learnnetty/im/model/PacketCodeC.java | 90 +++++++++++++++++ .../learnnetty/im/serialize/Serializer.java | 29 ++++++ .../im/serialize/SerializerAlogrithm.java | 13 +++ .../im/serialize/impl/JSONSerializer.java | 29 ++++++ .../learnnetty/im/server/NettyServer.java | 60 ++++++++++++ .../im/server/handler/FirstServerHandler.java | 31 ++++++ .../server/handler/LoginRequestHandler.java | 39 ++++++++ .../server/handler/MessageRequestHandler.java | 25 +++++ .../bruis/learnnetty/im/util/LoginUtil.java | 23 +++++ 24 files changed, 821 insertions(+), 98 deletions(-) delete mode 100644 Spring-Netty/learnnetty.iml create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketDecoder.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketEncoder.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Command.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Packet.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/Serializer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/SerializerAlogrithm.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/impl/JSONSerializer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/LoginUtil.java diff --git a/Spring-Netty/learnnetty.iml b/Spring-Netty/learnnetty.iml deleted file mode 100644 index 07cda18..0000000 --- a/Spring-Netty/learnnetty.iml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java new file mode 100644 index 0000000..3a25d67 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java @@ -0,0 +1,95 @@ +package com.bruis.learnnetty.im.client; + +import com.bruis.learnnetty.im.client.handler.FirstClientHandler; +import com.bruis.learnnetty.im.client.handler.LoginResponseHandler; +import com.bruis.learnnetty.im.client.handler.MessageResponseHandler; +import com.bruis.learnnetty.im.codec.PacketDecoder; +import com.bruis.learnnetty.im.codec.PacketEncoder; +import com.bruis.learnnetty.im.codec.Spliter; +import com.bruis.learnnetty.im.model.MessageRequestPacket; +import com.bruis.learnnetty.im.util.LoginUtil; +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.Channel; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +import java.util.Date; +import java.util.Scanner; +import java.util.concurrent.TimeUnit; + +/** + * @Description 客户端 + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class NettyClient { + private static final int MAX_RETRY = 5; + private static final String HOST = "127.0.0.1"; + private static final int PORT = 8000; + + + public static void main(String[] args) { + NioEventLoopGroup workerGroup = new NioEventLoopGroup(); + + Bootstrap bootstrap = new Bootstrap(); + bootstrap + .group(workerGroup) + .channel(NioSocketChannel.class) + .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000) + .option(ChannelOption.SO_KEEPALIVE, true) + .option(ChannelOption.TCP_NODELAY, true) + .handler(new ChannelInitializer() { + @Override + public void initChannel(SocketChannel ch) { + ch.pipeline().addLast(new Spliter()); +// ch.pipeline().addLast(new FirstClientHandler()); + // 解码 + ch.pipeline().addLast(new PacketDecoder()); + ch.pipeline().addLast(new LoginResponseHandler()); + ch.pipeline().addLast(new MessageResponseHandler()); + // 编码 + ch.pipeline().addLast(new PacketEncoder()); + } + }); + + connect(bootstrap, HOST, PORT, MAX_RETRY); + } + + private static void connect(Bootstrap bootstrap, String host, int port, int retry) { + bootstrap.connect(host, port).addListener(future -> { + if (future.isSuccess()) { + System.out.println(new Date() + ": 连接成功,启动控制台线程……"); + Channel channel = ((ChannelFuture) future).channel(); + startConsoleThread(channel); + } else if (retry == 0) { + System.err.println("重试次数已用完,放弃连接!"); + } else { + // 第几次重连 + int order = (MAX_RETRY - retry) + 1; + // 本次重连的间隔 + int delay = 1 << order; + System.err.println(new Date() + ": 连接失败,第" + order + "次重连……"); + bootstrap.config().group().schedule(() -> connect(bootstrap, host, port, retry - 1), delay, TimeUnit + .SECONDS); + } + }); + } + + private static void startConsoleThread(Channel channel) { + new Thread(() -> { + while (!Thread.interrupted()) { + if (LoginUtil.hasLogin(channel)) { + System.out.println("输入消息发送至服务端: "); + Scanner sc = new Scanner(System.in); + String line = sc.nextLine(); + + channel.writeAndFlush(new MessageRequestPacket(line)); + } + } + }).start(); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java new file mode 100644 index 0000000..6d03748 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java @@ -0,0 +1,35 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.MessageRequestPacket; +import com.bruis.learnnetty.im.model.MessageResponsePacket; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +import java.nio.charset.Charset; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class FirstClientHandler extends ChannelInboundHandlerAdapter { + @Override + public void channelActive(ChannelHandlerContext ctx) { + for (int i = 0; i < 5; i++) { +// ByteBuf buffer = getByteBuf(ctx); + MessageRequestPacket packet = new MessageRequestPacket(); + packet.setMessage("你好啊,测试一下Netty的通讯!"); + ctx.channel().writeAndFlush(packet); + } + } + + private ByteBuf getByteBuf(ChannelHandlerContext ctx) { +// byte[] bytes = "你好,欢迎关注我的微信公众号,《闪电侠的博客》!".getBytes(Charset.forName("utf-8")); + byte[] bytes = "你好".getBytes(Charset.forName("utf-8")); + ByteBuf buffer = ctx.alloc().buffer(); + buffer.writeBytes(bytes); + + return buffer; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java new file mode 100644 index 0000000..61086f4 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java @@ -0,0 +1,40 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.LoginRequestPacket; +import com.bruis.learnnetty.im.model.LoginResponsePacket; +import com.bruis.learnnetty.im.util.LoginUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.Date; +import java.util.UUID; + +/** + * @Description 登录响应的reponse + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LoginResponseHandler extends SimpleChannelInboundHandler { + + @Override + public void channelActive(ChannelHandlerContext ctx) throws Exception { + // 创建登录对象 + LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); + loginRequestPacket.setUserId(UUID.randomUUID().toString()); + loginRequestPacket.setUserName("flash"); + loginRequestPacket.setPassword("pwd"); + + // 写数据-发起登录 + ctx.channel().writeAndFlush(loginRequestPacket); + } + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, LoginResponsePacket loginResponsePacket) throws Exception { + if (loginResponsePacket.isSuccess()) { + System.out.println(new Date() + ": 客户端登录成功"); + LoginUtil.markAsLogin(channelHandlerContext.channel()); + } else { + System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason()); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java new file mode 100644 index 0000000..70a2cdb --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.MessageResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.Date; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class MessageResponseHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageResponsePacket messageResponsePacket) throws Exception { + System.out.println(new Date() + ": 收到服务端的消息: " + messageResponsePacket.getMessage()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketDecoder.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketDecoder.java new file mode 100644 index 0000000..751d007 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketDecoder.java @@ -0,0 +1,20 @@ +package com.bruis.learnnetty.im.codec; + +import com.bruis.learnnetty.im.model.PacketCodeC; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.ByteToMessageDecoder; + +import java.util.List; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class PacketDecoder extends ByteToMessageDecoder { + @Override + protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List out) throws Exception { + out.add(PacketCodeC.INSTANCE.decode(byteBuf)); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketEncoder.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketEncoder.java new file mode 100644 index 0000000..d3d4fa7 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketEncoder.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.im.codec; + +import com.bruis.learnnetty.im.model.Packet; +import com.bruis.learnnetty.im.model.PacketCodeC; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class PacketEncoder extends MessageToByteEncoder { + @Override + protected void encode(ChannelHandlerContext channelHandlerContext, Packet packet, ByteBuf byteBuf) throws Exception { + PacketCodeC.INSTANCE.encode(byteBuf, packet); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java new file mode 100644 index 0000000..033611e --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java @@ -0,0 +1,30 @@ +package com.bruis.learnnetty.im.codec; + +import com.bruis.learnnetty.im.model.PacketCodeC; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.LengthFieldBasedFrameDecoder; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class Spliter extends LengthFieldBasedFrameDecoder { + private static final int LENGTH_FIELD_OFFSET = 7; + private static final int LENGTH_FIELD_LENGTH = 4; + + public Spliter() { + super(Integer.MAX_VALUE, LENGTH_FIELD_OFFSET, LENGTH_FIELD_LENGTH); + } + + @Override + protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { + if (in.getInt(in.readerIndex()) != PacketCodeC.MAGIC_NUMBER) { + ctx.channel().close(); + return null; + } + + return super.decode(ctx, in); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java new file mode 100644 index 0000000..b87cac3 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java @@ -0,0 +1,12 @@ +package com.bruis.learnnetty.im.model; + +import io.netty.util.AttributeKey; + +/** + * @Description Netty 属性集 + * @Author haiyangluo + * @Date 2022/3/22 + */ +public interface Attributes { + AttributeKey LOGIN = AttributeKey.newInstance("login"); +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Command.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Command.java new file mode 100644 index 0000000..f84f29f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Command.java @@ -0,0 +1,44 @@ +package com.bruis.learnnetty.im.model; + +/** + * @Description + * @Author haiyangluo + * @Date 2022/3/22 + */ +public interface Command { + Byte LOGIN_REQUEST = 1; + + Byte LOGIN_RESPONSE = 2; + + Byte MESSAGE_REQUEST = 3; + + Byte MESSAGE_RESPONSE = 4; + + Byte LOGOUT_REQUEST = 5; + + Byte LOGOUT_RESPONSE = 6; + + Byte CREATE_GROUP_REQUEST = 7; + + Byte CREATE_GROUP_RESPONSE = 8; + + Byte LIST_GROUP_MEMBERS_REQUEST = 9; + + Byte LIST_GROUP_MEMBERS_RESPONSE = 10; + + Byte JOIN_GROUP_REQUEST = 11; + + Byte JOIN_GROUP_RESPONSE = 12; + + Byte QUIT_GROUP_REQUEST = 13; + + Byte QUIT_GROUP_RESPONSE = 14; + + Byte GROUP_MESSAGE_REQUEST = 15; + + Byte GROUP_MESSAGE_RESPONSE = 16; + + Byte HEARTBEAT_REQUEST = 17; + + Byte HEARTBEAT_RESPONSE = 18; +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginRequestPacket.java new file mode 100644 index 0000000..d1122bd --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginRequestPacket.java @@ -0,0 +1,46 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.LOGIN_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class LoginRequestPacket extends Packet { + + private String userId; + + private String userName; + + private String password; + + @Override + public Byte getCommand() { + return LOGIN_REQUEST; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java new file mode 100644 index 0000000..1b7480f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java @@ -0,0 +1,36 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.LOGIN_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class LoginResponsePacket extends Packet { + private boolean success; + + private String reason; + + + @Override + public Byte getCommand() { + return LOGIN_RESPONSE; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java new file mode 100644 index 0000000..f2254d9 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java @@ -0,0 +1,32 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.MESSAGE_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class MessageRequestPacket extends Packet { + + public MessageRequestPacket(){} + + public MessageRequestPacket(String message) { + this.message = message; + } + + private String message; + + @Override + public Byte getCommand() { + return MESSAGE_REQUEST; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java new file mode 100644 index 0000000..3b955d8 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java @@ -0,0 +1,27 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.MESSAGE_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class MessageResponsePacket extends Packet { + + private String message; + + @Override + public Byte getCommand() { + + return MESSAGE_RESPONSE; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Packet.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Packet.java new file mode 100644 index 0000000..0100f52 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Packet.java @@ -0,0 +1,27 @@ +package com.bruis.learnnetty.im.model; + +import com.alibaba.fastjson.annotation.JSONField; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public abstract class Packet { + /** + * 协议版本 + */ + @JSONField(deserialize = false , serialize = false) + private Byte version = 1; + + @JSONField(serialize = false) + public abstract Byte getCommand(); + + public Byte getVersion() { + return version; + } + + public void setVersion(Byte version) { + this.version = version; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java new file mode 100644 index 0000000..7e48ff1 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java @@ -0,0 +1,90 @@ +package com.bruis.learnnetty.im.model; + +import com.bruis.learnnetty.im.serialize.Serializer; +import com.bruis.learnnetty.im.serialize.impl.JSONSerializer; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; + +import java.util.*; + +import static com.bruis.learnnetty.im.model.Command.*; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class PacketCodeC { + public static final int MAGIC_NUMBER = 0x12345678; + public static final PacketCodeC INSTANCE = new PacketCodeC(); + + private final Map> packetTypeMap; + private final Map serializerMap; + + + private PacketCodeC() { + packetTypeMap = new HashMap<>(); + packetTypeMap.put(LOGIN_REQUEST, LoginRequestPacket.class); + packetTypeMap.put(LOGIN_RESPONSE, LoginResponsePacket.class); + packetTypeMap.put(MESSAGE_REQUEST, MessageRequestPacket.class); + packetTypeMap.put(MESSAGE_RESPONSE, MessageResponsePacket.class); + + serializerMap = new HashMap<>(); + Serializer serializer = new JSONSerializer(); + serializerMap.put(serializer.getSerializerAlogrithm(), serializer); + } + + + public void encode(ByteBuf byteBuf, Packet packet) { + // 1. 序列化 java 对象 + byte[] bytes = Serializer.DEFAULT.serialize(packet); + + // 2. 实际编码过程 + byteBuf.writeInt(MAGIC_NUMBER); + byteBuf.writeByte(packet.getVersion()); + byteBuf.writeByte(Serializer.DEFAULT.getSerializerAlogrithm()); + byteBuf.writeByte(packet.getCommand()); + byteBuf.writeInt(bytes.length); + byteBuf.writeBytes(bytes); + } + + + public Packet decode(ByteBuf byteBuf) { + // 跳过 magic number + byteBuf.skipBytes(4); + + // 跳过版本号 + byteBuf.skipBytes(1); + + // 序列化算法 + byte serializeAlgorithm = byteBuf.readByte(); + + // 指令 + byte command = byteBuf.readByte(); + + // 数据包长度 + int length = byteBuf.readInt(); + + byte[] bytes = new byte[length]; + byteBuf.readBytes(bytes); + + Class requestType = getRequestType(command); + Serializer serializer = getSerializer(serializeAlgorithm); + + if (requestType != null && serializer != null) { + return serializer.deserialize(requestType, bytes); + } + + return null; + } + + private Serializer getSerializer(byte serializeAlgorithm) { + + return serializerMap.get(serializeAlgorithm); + } + + private Class getRequestType(byte command) { + + return packetTypeMap.get(command); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/Serializer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/Serializer.java new file mode 100644 index 0000000..1bce9c9 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/Serializer.java @@ -0,0 +1,29 @@ +package com.bruis.learnnetty.im.serialize; + + +import com.bruis.learnnetty.im.serialize.impl.JSONSerializer; + +/** + * @Description + * @Author haiyangluo + * @Date 2022/3/22 + */ +public interface Serializer { + Serializer DEFAULT = new JSONSerializer(); + + /** + * 序列化算法 + * @return + */ + byte getSerializerAlogrithm(); + + /** + * java 对象转换成二进制 + */ + byte[] serialize(Object object); + + /** + * 二进制转换成 java 对象 + */ + T deserialize(Class clazz, byte[] bytes); +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/SerializerAlogrithm.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/SerializerAlogrithm.java new file mode 100644 index 0000000..ef50887 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/SerializerAlogrithm.java @@ -0,0 +1,13 @@ +package com.bruis.learnnetty.im.serialize; + +/** + * @Description + * @Author haiyangluo + * @Date 2022/3/22 + */ +public interface SerializerAlogrithm { + /** + * json 序列化 + */ + byte JSON = 1; +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/impl/JSONSerializer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/impl/JSONSerializer.java new file mode 100644 index 0000000..9a2881f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/serialize/impl/JSONSerializer.java @@ -0,0 +1,29 @@ +package com.bruis.learnnetty.im.serialize.impl; + +import com.alibaba.fastjson.JSON; +import com.bruis.learnnetty.im.serialize.Serializer; +import com.bruis.learnnetty.im.serialize.SerializerAlogrithm; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class JSONSerializer implements Serializer { + @Override + public byte getSerializerAlogrithm() { + return SerializerAlogrithm.JSON; + } + + @Override + public byte[] serialize(Object object) { + + return JSON.toJSONBytes(object); + } + + @Override + public T deserialize(Class clazz, byte[] bytes) { + + return JSON.parseObject(bytes, clazz); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java new file mode 100644 index 0000000..4b08222 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java @@ -0,0 +1,60 @@ +package com.bruis.learnnetty.im.server; + +import com.bruis.learnnetty.im.codec.PacketDecoder; +import com.bruis.learnnetty.im.codec.PacketEncoder; +import com.bruis.learnnetty.im.codec.Spliter; +import com.bruis.learnnetty.im.server.handler.FirstServerHandler; +import com.bruis.learnnetty.im.server.handler.LoginRequestHandler; +import com.bruis.learnnetty.im.server.handler.MessageRequestHandler; +import io.netty.bootstrap.ServerBootstrap; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; + +import java.util.Date; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class NettyServer { + + private static final int PORT = 8000; + + public static void main(String[] args) { + NioEventLoopGroup bossGroup = new NioEventLoopGroup(); + NioEventLoopGroup workerGroup = new NioEventLoopGroup(); + + ServerBootstrap serverBootstrap = new ServerBootstrap(); + serverBootstrap.group(bossGroup, workerGroup) + .channel(NioServerSocketChannel.class) + .option(ChannelOption.SO_BACKLOG, 1024) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .childOption(ChannelOption.TCP_NODELAY, true) + .childHandler(new ChannelInitializer() { + @Override + protected void initChannel(NioSocketChannel ch) throws Exception { + ch.pipeline().addLast(new Spliter()); +// ch.pipeline().addLast(new FirstServerHandler()); + ch.pipeline().addLast(new PacketDecoder()); + ch.pipeline().addLast(new LoginRequestHandler()); + ch.pipeline().addLast(new MessageRequestHandler()); + ch.pipeline().addLast(new PacketEncoder()); + } + }); + bind(serverBootstrap, PORT); + } + + private static void bind(final ServerBootstrap serverBootstrap, final int port) { + serverBootstrap.bind(port).addListener(future -> { + if (future.isSuccess()) { + System.out.println(new Date() + ": 端口[" + port + "]绑定成功!"); + } else { + System.err.println("端口[" + port + "]绑定失败!"); + } + }); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java new file mode 100644 index 0000000..d0d4679 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java @@ -0,0 +1,31 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.MessageRequestPacket; +import com.bruis.learnnetty.im.model.Packet; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.nio.charset.Charset; +import java.util.Date; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class FirstServerHandler extends SimpleChannelInboundHandler { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + ByteBuf byteBuf = (ByteBuf) msg; + + System.out.println(new Date() + ": 服务端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, MessageRequestPacket msg) throws Exception { + System.out.println(new Date() + ": 服务端读到数据 -> " + msg.getMessage()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java new file mode 100644 index 0000000..d54a75c --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java @@ -0,0 +1,39 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.LoginRequestPacket; +import com.bruis.learnnetty.im.model.LoginResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.Date; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LoginRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext context, LoginRequestPacket loginRequestPacket) throws Exception { + System.out.println(new Date() + ": 收到客户端登录请求……"); + + LoginResponsePacket loginResponsePacket = new LoginResponsePacket(); + loginResponsePacket.setVersion(loginRequestPacket.getVersion()); + if (valid(loginRequestPacket)) { + loginResponsePacket.setSuccess(true); + System.out.println(new Date() + ": 登录成功!"); + } else { + loginResponsePacket.setReason("账号密码校验失败"); + loginResponsePacket.setSuccess(false); + System.out.println(new Date() + ": 登录失败!"); + } + + // 登录响应 + context.channel().writeAndFlush(loginResponsePacket); + } + + private boolean valid(LoginRequestPacket loginRequestPacket) { + return true; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java new file mode 100644 index 0000000..26cd823 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java @@ -0,0 +1,25 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.MessageRequestPacket; +import com.bruis.learnnetty.im.model.MessageResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +import java.util.Date; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class MessageRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageRequestPacket messageRequestPacket) throws Exception { + MessageResponsePacket messageResponsePacket = new MessageResponsePacket(); + System.out.println(new Date() + ": 收到客户端消息: " + messageRequestPacket.getMessage()); + messageResponsePacket.setMessage("服务端回复【" + messageRequestPacket.getMessage() + "】"); + + channelHandlerContext.channel().writeAndFlush(messageResponsePacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/LoginUtil.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/LoginUtil.java new file mode 100644 index 0000000..fccfc08 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/LoginUtil.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.im.util; + +import com.bruis.learnnetty.im.model.Attributes; +import io.netty.channel.Channel; +import io.netty.util.Attribute; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/22 + */ +public class LoginUtil { + + public static void markAsLogin(Channel channel) { + channel.attr(Attributes.LOGIN).set(true); + } + + public static boolean hasLogin(Channel channel) { + Attribute loginAttr = channel.attr(Attributes.LOGIN); + + return loginAttr.get() != null; + } +} From 63b992a94297bd7ef8e3b3865bd22e816f88339a Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Wed, 23 Mar 2022 23:17:55 +0800 Subject: [PATCH 55/68] =?UTF-8?q?=E5=AE=A2=E6=88=B7=E7=AB=AF=E4=BA=92?= =?UTF-8?q?=E7=9B=B8=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learnnetty/im/client/NettyClient.java | 41 ++++++++++++----- .../im/client/handler/FirstClientHandler.java | 35 --------------- .../client/handler/LoginResponseHandler.java | 27 +++++------- .../handler/MessageResponseHandler.java | 6 +-- .../bruis/learnnetty/im/codec/Spliter.java | 4 +- .../bruis/learnnetty/im/model/Attributes.java | 3 +- .../im/model/LoginResponsePacket.java | 21 +++++++++ .../im/model/MessageRequestPacket.java | 17 +++++-- .../im/model/MessageResponsePacket.java | 20 +++++++++ .../learnnetty/im/server/NettyServer.java | 3 +- .../im/server/handler/AuthHandler.java | 23 ++++++++++ .../im/server/handler/FirstServerHandler.java | 31 ------------- .../server/handler/LoginRequestHandler.java | 28 +++++++++--- .../server/handler/MessageRequestHandler.java | 24 +++++++--- .../bruis/learnnetty/im/session/Session.java | 34 ++++++++++++++ .../bruis/learnnetty/im/util/LoginUtil.java | 23 ---------- .../bruis/learnnetty/im/util/SessionUtil.java | 44 +++++++++++++++++++ 17 files changed, 248 insertions(+), 136 deletions(-) delete mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java delete mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/session/Session.java delete mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/LoginUtil.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java index 3a25d67..e36c730 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java @@ -1,13 +1,13 @@ package com.bruis.learnnetty.im.client; -import com.bruis.learnnetty.im.client.handler.FirstClientHandler; import com.bruis.learnnetty.im.client.handler.LoginResponseHandler; import com.bruis.learnnetty.im.client.handler.MessageResponseHandler; import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; +import com.bruis.learnnetty.im.model.LoginRequestPacket; import com.bruis.learnnetty.im.model.MessageRequestPacket; -import com.bruis.learnnetty.im.util.LoginUtil; +import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.bootstrap.Bootstrap; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; @@ -45,13 +45,15 @@ public static void main(String[] args) { .handler(new ChannelInitializer() { @Override public void initChannel(SocketChannel ch) { + // 拆包粘包处理 ch.pipeline().addLast(new Spliter()); -// ch.pipeline().addLast(new FirstClientHandler()); - // 解码 + // 编码 ch.pipeline().addLast(new PacketDecoder()); + // 登录响应 ch.pipeline().addLast(new LoginResponseHandler()); + // 消息返回 ch.pipeline().addLast(new MessageResponseHandler()); - // 编码 + // 解码 ch.pipeline().addLast(new PacketEncoder()); } }); @@ -80,16 +82,35 @@ private static void connect(Bootstrap bootstrap, String host, int port, int retr } private static void startConsoleThread(Channel channel) { + Scanner sc = new Scanner(System.in); + LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); + new Thread(() -> { while (!Thread.interrupted()) { - if (LoginUtil.hasLogin(channel)) { - System.out.println("输入消息发送至服务端: "); - Scanner sc = new Scanner(System.in); - String line = sc.nextLine(); + if (!SessionUtil.hasLogin(channel)) { + System.out.print("输入用户名登录: "); + String username = sc.nextLine(); + loginRequestPacket.setUserName(username); + + // 密码使用默认的 + loginRequestPacket.setPassword("pwd"); - channel.writeAndFlush(new MessageRequestPacket(line)); + // 发送登录数据包 + channel.writeAndFlush(loginRequestPacket); + waitForLoginResponse(); + } else { + String toUserId = sc.next(); + String message = sc.next(); + channel.writeAndFlush(new MessageRequestPacket(toUserId, message)); } } }).start(); } + + private static void waitForLoginResponse() { + try { + Thread.sleep(1000); + } catch (InterruptedException ignored) { + } + } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java deleted file mode 100644 index 6d03748..0000000 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/FirstClientHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.bruis.learnnetty.im.client.handler; - -import com.bruis.learnnetty.im.model.MessageRequestPacket; -import com.bruis.learnnetty.im.model.MessageResponsePacket; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; - -import java.nio.charset.Charset; - -/** - * @Description - * @Author luohaiyang - * @Date 2022/3/23 - */ -public class FirstClientHandler extends ChannelInboundHandlerAdapter { - @Override - public void channelActive(ChannelHandlerContext ctx) { - for (int i = 0; i < 5; i++) { -// ByteBuf buffer = getByteBuf(ctx); - MessageRequestPacket packet = new MessageRequestPacket(); - packet.setMessage("你好啊,测试一下Netty的通讯!"); - ctx.channel().writeAndFlush(packet); - } - } - - private ByteBuf getByteBuf(ChannelHandlerContext ctx) { -// byte[] bytes = "你好,欢迎关注我的微信公众号,《闪电侠的博客》!".getBytes(Charset.forName("utf-8")); - byte[] bytes = "你好".getBytes(Charset.forName("utf-8")); - ByteBuf buffer = ctx.alloc().buffer(); - buffer.writeBytes(bytes); - - return buffer; - } -} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java index 61086f4..f519576 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java @@ -1,13 +1,12 @@ package com.bruis.learnnetty.im.client.handler; -import com.bruis.learnnetty.im.model.LoginRequestPacket; import com.bruis.learnnetty.im.model.LoginResponsePacket; -import com.bruis.learnnetty.im.util.LoginUtil; +import com.bruis.learnnetty.im.session.Session; +import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.util.Date; -import java.util.UUID; /** * @Description 登录响应的reponse @@ -17,24 +16,20 @@ public class LoginResponseHandler extends SimpleChannelInboundHandler { @Override - public void channelActive(ChannelHandlerContext ctx) throws Exception { - // 创建登录对象 - LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); - loginRequestPacket.setUserId(UUID.randomUUID().toString()); - loginRequestPacket.setUserName("flash"); - loginRequestPacket.setPassword("pwd"); + protected void channelRead0(ChannelHandlerContext ctx, LoginResponsePacket loginResponsePacket) throws Exception { + String userId = loginResponsePacket.getUserId(); + String userName = loginResponsePacket.getUserName(); - // 写数据-发起登录 - ctx.channel().writeAndFlush(loginRequestPacket); - } - - @Override - protected void channelRead0(ChannelHandlerContext channelHandlerContext, LoginResponsePacket loginResponsePacket) throws Exception { if (loginResponsePacket.isSuccess()) { System.out.println(new Date() + ": 客户端登录成功"); - LoginUtil.markAsLogin(channelHandlerContext.channel()); + SessionUtil.bindSession(new Session(userId, userName), ctx.channel()); } else { System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason()); } } + + @Override + public void channelInactive(ChannelHandlerContext ctx) throws Exception { + System.out.println("客户端连接被关闭"); + } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java index 70a2cdb..ea6fac1 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/MessageResponseHandler.java @@ -4,8 +4,6 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import java.util.Date; - /** * @Description * @Author luohaiyang @@ -14,6 +12,8 @@ public class MessageResponseHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageResponsePacket messageResponsePacket) throws Exception { - System.out.println(new Date() + ": 收到服务端的消息: " + messageResponsePacket.getMessage()); + String fromUserId = messageResponsePacket.getFromUserId(); + String fromUserName = messageResponsePacket.getFromUserName(); + System.out.println(fromUserId + ":" + fromUserName + " -> " + messageResponsePacket.getMessage()); } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java index 033611e..c09b096 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/Spliter.java @@ -6,7 +6,7 @@ import io.netty.handler.codec.LengthFieldBasedFrameDecoder; /** - * @Description + * @Description 拆包、粘包处理 * @Author luohaiyang * @Date 2022/3/23 */ @@ -20,11 +20,11 @@ public Spliter() { @Override protected Object decode(ChannelHandlerContext ctx, ByteBuf in) throws Exception { + // 校验协议 if (in.getInt(in.readerIndex()) != PacketCodeC.MAGIC_NUMBER) { ctx.channel().close(); return null; } - return super.decode(ctx, in); } } \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java index b87cac3..fe72853 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/Attributes.java @@ -1,5 +1,6 @@ package com.bruis.learnnetty.im.model; +import com.bruis.learnnetty.im.session.Session; import io.netty.util.AttributeKey; /** @@ -8,5 +9,5 @@ * @Date 2022/3/22 */ public interface Attributes { - AttributeKey LOGIN = AttributeKey.newInstance("login"); + AttributeKey SESSION = AttributeKey.newInstance("session"); } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java index 1b7480f..32599fd 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LoginResponsePacket.java @@ -8,6 +8,11 @@ * @Date 2022/3/22 */ public class LoginResponsePacket extends Packet { + + private String userId; + + private String userName; + private boolean success; private String reason; @@ -33,4 +38,20 @@ public String getReason() { public void setReason(String reason) { this.reason = reason; } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java index f2254d9..4dae50c 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageRequestPacket.java @@ -9,14 +9,17 @@ */ public class MessageRequestPacket extends Packet { + private String toUserId; + + private String message; + public MessageRequestPacket(){} - public MessageRequestPacket(String message) { + public MessageRequestPacket(String toUserId, String message) { + this.toUserId = toUserId; this.message = message; } - private String message; - @Override public Byte getCommand() { return MESSAGE_REQUEST; @@ -29,4 +32,12 @@ public String getMessage() { public void setMessage(String message) { this.message = message; } + + public String getToUserId() { + return toUserId; + } + + public void setToUserId(String toUserId) { + this.toUserId = toUserId; + } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java index 3b955d8..372a33b 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/MessageResponsePacket.java @@ -9,6 +9,10 @@ */ public class MessageResponsePacket extends Packet { + private String fromUserId; + + private String fromUserName; + private String message; @Override @@ -24,4 +28,20 @@ public String getMessage() { public void setMessage(String message) { this.message = message; } + + public String getFromUserId() { + return fromUserId; + } + + public void setFromUserId(String fromUserId) { + this.fromUserId = fromUserId; + } + + public String getFromUserName() { + return fromUserName; + } + + public void setFromUserName(String fromUserName) { + this.fromUserName = fromUserName; + } } \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java index 4b08222..6ba48f8 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java @@ -3,7 +3,7 @@ import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; -import com.bruis.learnnetty.im.server.handler.FirstServerHandler; +import com.bruis.learnnetty.im.server.handler.AuthHandler; import com.bruis.learnnetty.im.server.handler.LoginRequestHandler; import com.bruis.learnnetty.im.server.handler.MessageRequestHandler; import io.netty.bootstrap.ServerBootstrap; @@ -41,6 +41,7 @@ protected void initChannel(NioSocketChannel ch) throws Exception { // ch.pipeline().addLast(new FirstServerHandler()); ch.pipeline().addLast(new PacketDecoder()); ch.pipeline().addLast(new LoginRequestHandler()); + ch.pipeline().addLast(new AuthHandler()); ch.pipeline().addLast(new MessageRequestHandler()); ch.pipeline().addLast(new PacketEncoder()); } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java new file mode 100644 index 0000000..33aad01 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class AuthHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (!SessionUtil.hasLogin(ctx.channel())) { + ctx.channel().close(); + } else { + ctx.pipeline().remove(this); + super.channelRead(ctx, msg); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java deleted file mode 100644 index d0d4679..0000000 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/FirstServerHandler.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.bruis.learnnetty.im.server.handler; - -import com.bruis.learnnetty.im.model.MessageRequestPacket; -import com.bruis.learnnetty.im.model.Packet; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.channel.SimpleChannelInboundHandler; - -import java.nio.charset.Charset; -import java.util.Date; - -/** - * @Description - * @Author luohaiyang - * @Date 2022/3/23 - */ -public class FirstServerHandler extends SimpleChannelInboundHandler { - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) { - ByteBuf byteBuf = (ByteBuf) msg; - - System.out.println(new Date() + ": 服务端读到数据 -> " + byteBuf.toString(Charset.forName("utf-8"))); - } - - @Override - protected void channelRead0(ChannelHandlerContext ctx, MessageRequestPacket msg) throws Exception { - System.out.println(new Date() + ": 服务端读到数据 -> " + msg.getMessage()); - } -} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java index d54a75c..837f2d6 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java @@ -2,27 +2,34 @@ import com.bruis.learnnetty.im.model.LoginRequestPacket; import com.bruis.learnnetty.im.model.LoginResponsePacket; +import com.bruis.learnnetty.im.session.Session; +import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.util.Date; +import java.util.UUID; /** - * @Description + * @Description 接收客户端登录请求 * @Author luohaiyang * @Date 2022/3/23 */ public class LoginRequestHandler extends SimpleChannelInboundHandler { @Override - protected void channelRead0(ChannelHandlerContext context, LoginRequestPacket loginRequestPacket) throws Exception { - System.out.println(new Date() + ": 收到客户端登录请求……"); - + protected void channelRead0(ChannelHandlerContext ctx, LoginRequestPacket loginRequestPacket) { + // 登录校验响应 LoginResponsePacket loginResponsePacket = new LoginResponsePacket(); loginResponsePacket.setVersion(loginRequestPacket.getVersion()); + loginResponsePacket.setUserName(loginRequestPacket.getUserName()); + if (valid(loginRequestPacket)) { loginResponsePacket.setSuccess(true); - System.out.println(new Date() + ": 登录成功!"); + String userId = randomUserId(); + loginResponsePacket.setUserId(userId); + System.out.println("[" + loginRequestPacket.getUserName() + "]登录成功"); + SessionUtil.bindSession(new Session(userId, loginRequestPacket.getUserName()), ctx.channel()); } else { loginResponsePacket.setReason("账号密码校验失败"); loginResponsePacket.setSuccess(false); @@ -30,10 +37,19 @@ protected void channelRead0(ChannelHandlerContext context, LoginRequestPacket lo } // 登录响应 - context.channel().writeAndFlush(loginResponsePacket); + ctx.channel().writeAndFlush(loginResponsePacket); } private boolean valid(LoginRequestPacket loginRequestPacket) { return true; } + + private static String randomUserId() { + return UUID.randomUUID().toString().split("-")[0]; + } + + @Override + public void channelInactive(ChannelHandlerContext ctx) { + SessionUtil.unBindSession(ctx.channel()); + } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java index 26cd823..5943156 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java @@ -2,11 +2,12 @@ import com.bruis.learnnetty.im.model.MessageRequestPacket; import com.bruis.learnnetty.im.model.MessageResponsePacket; +import com.bruis.learnnetty.im.session.Session; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.Channel; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import java.util.Date; - /** * @Description * @Author luohaiyang @@ -16,10 +17,23 @@ public class MessageRequestHandler extends SimpleChannelInboundHandler loginAttr = channel.attr(Attributes.LOGIN); - - return loginAttr.get() != null; - } -} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java new file mode 100644 index 0000000..133a38b --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java @@ -0,0 +1,44 @@ +package com.bruis.learnnetty.im.util; + +import com.bruis.learnnetty.im.model.Attributes; +import com.bruis.learnnetty.im.session.Session; +import io.netty.channel.Channel; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class SessionUtil { + private static final Map userIdChannelMap = new ConcurrentHashMap<>(); + + public static void bindSession(Session session, Channel channel) { + userIdChannelMap.put(session.getUserId(), channel); + channel.attr(Attributes.SESSION).set(session); + } + + public static void unBindSession(Channel channel) { + if (hasLogin(channel)) { + userIdChannelMap.remove(getSession(channel).getUserId()); + channel.attr(Attributes.SESSION).set(null); + } + } + + public static boolean hasLogin(Channel channel) { + + return channel.hasAttr(Attributes.SESSION); + } + + public static Session getSession(Channel channel) { + + return channel.attr(Attributes.SESSION).get(); + } + + public static Channel getChannel(String userId) { + + return userIdChannelMap.get(userId); + } +} From d0c417f21b9a926c83e58358476d834b035feb2f Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Thu, 24 Mar 2022 10:46:13 +0800 Subject: [PATCH 56/68] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=BE=A4=E8=81=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learnnetty/im/client/NettyClient.java | 33 +++++-------- .../handler/CreateGroupResponseHandler.java | 19 +++++++ .../client/handler/LoginResponseHandler.java | 6 +-- .../client/handler/LogoutResponseHandler.java | 19 +++++++ .../learnnetty/im/console/ConsoleCommand.java | 14 ++++++ .../im/console/ConsoleCommandManager.java | 39 +++++++++++++++ .../im/console/CreateGroupConsoleCommand.java | 28 +++++++++++ .../im/console/LoginConsoleCommand.java | 34 +++++++++++++ .../im/console/LogoutConsoleCommand.java | 19 +++++++ .../im/console/SendToUserConsoleCommand.java | 23 +++++++++ .../im/model/CreateGroupRequestPacket.java | 28 +++++++++++ .../im/model/CreateGroupResponsePacket.java | 48 ++++++++++++++++++ .../im/model/LogoutRequestPacket.java | 16 ++++++ .../im/model/LogoutResponsePacket.java | 37 ++++++++++++++ .../learnnetty/im/model/PacketCodeC.java | 4 ++ .../learnnetty/im/server/NettyServer.java | 7 ++- .../handler/CreateGroupRequestHandler.java | 49 +++++++++++++++++++ .../server/handler/LoginRequestHandler.java | 7 +-- .../server/handler/LogoutRequestHandler.java | 23 +++++++++ .../com/bruis/learnnetty/im/util/IDUtil.java | 16 ++++++ 20 files changed, 434 insertions(+), 35 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/CreateGroupResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LogoutResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/CreateGroupConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LogoutConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToUserConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/IDUtil.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java index e36c730..e195814 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java @@ -1,10 +1,14 @@ package com.bruis.learnnetty.im.client; +import com.bruis.learnnetty.im.client.handler.CreateGroupResponseHandler; import com.bruis.learnnetty.im.client.handler.LoginResponseHandler; +import com.bruis.learnnetty.im.client.handler.LogoutResponseHandler; import com.bruis.learnnetty.im.client.handler.MessageResponseHandler; import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; +import com.bruis.learnnetty.im.console.ConsoleCommandManager; +import com.bruis.learnnetty.im.console.LoginConsoleCommand; import com.bruis.learnnetty.im.model.LoginRequestPacket; import com.bruis.learnnetty.im.model.MessageRequestPacket; import com.bruis.learnnetty.im.util.SessionUtil; @@ -51,8 +55,10 @@ public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new PacketDecoder()); // 登录响应 ch.pipeline().addLast(new LoginResponseHandler()); + ch.pipeline().addLast(new LogoutResponseHandler()); // 消息返回 ch.pipeline().addLast(new MessageResponseHandler()); + ch.pipeline().addLast(new CreateGroupResponseHandler()); // 解码 ch.pipeline().addLast(new PacketEncoder()); } @@ -82,35 +88,18 @@ private static void connect(Bootstrap bootstrap, String host, int port, int retr } private static void startConsoleThread(Channel channel) { - Scanner sc = new Scanner(System.in); - LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); + ConsoleCommandManager consoleCommandManager = new ConsoleCommandManager(); + LoginConsoleCommand loginConsoleCommand = new LoginConsoleCommand(); + Scanner scanner = new Scanner(System.in); new Thread(() -> { while (!Thread.interrupted()) { if (!SessionUtil.hasLogin(channel)) { - System.out.print("输入用户名登录: "); - String username = sc.nextLine(); - loginRequestPacket.setUserName(username); - - // 密码使用默认的 - loginRequestPacket.setPassword("pwd"); - - // 发送登录数据包 - channel.writeAndFlush(loginRequestPacket); - waitForLoginResponse(); + loginConsoleCommand.exec(scanner, channel); } else { - String toUserId = sc.next(); - String message = sc.next(); - channel.writeAndFlush(new MessageRequestPacket(toUserId, message)); + consoleCommandManager.exec(scanner, channel); } } }).start(); } - - private static void waitForLoginResponse() { - try { - Thread.sleep(1000); - } catch (InterruptedException ignored) { - } - } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/CreateGroupResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/CreateGroupResponseHandler.java new file mode 100644 index 0000000..04125de --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/CreateGroupResponseHandler.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.CreateGroupResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class CreateGroupResponseHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, CreateGroupResponsePacket msg) throws Exception { + System.out.print("群创建成功,id 为[" + msg.getGroupId() + "], "); + System.out.println("群里面有:" + msg.getUserNameList()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java index f519576..282afcc 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LoginResponseHandler.java @@ -6,8 +6,6 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; -import java.util.Date; - /** * @Description 登录响应的reponse * @Author luohaiyang @@ -21,10 +19,10 @@ protected void channelRead0(ChannelHandlerContext ctx, LoginResponsePacket login String userName = loginResponsePacket.getUserName(); if (loginResponsePacket.isSuccess()) { - System.out.println(new Date() + ": 客户端登录成功"); + System.out.println("[" + userName + "]登录成功,userId 为: " + loginResponsePacket.getUserId()); SessionUtil.bindSession(new Session(userId, userName), ctx.channel()); } else { - System.out.println(new Date() + ": 客户端登录失败,原因:" + loginResponsePacket.getReason()); + System.out.println("[" + userName + "]登录失败,原因:" + loginResponsePacket.getReason()); } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LogoutResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LogoutResponseHandler.java new file mode 100644 index 0000000..78fd173 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/LogoutResponseHandler.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.LogoutResponsePacket; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LogoutResponseHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, LogoutResponsePacket logoutResponsePacket) { + SessionUtil.unBindSession(ctx.channel()); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommand.java new file mode 100644 index 0000000..dd41e27 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommand.java @@ -0,0 +1,14 @@ +package com.bruis.learnnetty.im.console; + +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description 指令接口 + * @Author luohaiyang + * @Date 2022/3/23 + */ +public interface ConsoleCommand { + void exec(Scanner scanner, Channel channel); +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java new file mode 100644 index 0000000..07a1966 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java @@ -0,0 +1,39 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.Channel; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class ConsoleCommandManager implements ConsoleCommand { + + private Map consoleCommandMap; + + public ConsoleCommandManager() { + consoleCommandMap = new HashMap<>(); + consoleCommandMap.put("sendToUser", new SendToUserConsoleCommand()); + consoleCommandMap.put("logout", new LoginConsoleCommand()); + consoleCommandMap.put("createGroup", new CreateGroupConsoleCommand()); + } + + @Override + public void exec(Scanner scanner, Channel channel) { + String command = scanner.next(); + if (!SessionUtil.hasLogin(channel)) { + return; + } + ConsoleCommand consoleCommand = consoleCommandMap.get(command); + if (null != consoleCommand) { + consoleCommand.exec(scanner, channel); + } else { + System.err.println("无法识别[" + command + "]指令,请重新输入"); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/CreateGroupConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/CreateGroupConsoleCommand.java new file mode 100644 index 0000000..db68b98 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/CreateGroupConsoleCommand.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.CreateGroupRequestPacket; +import io.netty.channel.Channel; + +import java.util.Arrays; +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class CreateGroupConsoleCommand implements ConsoleCommand { + + private static final String USER_ID_SPLITER = ","; + + @Override + public void exec(Scanner scanner, Channel channel) { + CreateGroupRequestPacket createGroupRequestPacket = new CreateGroupRequestPacket(); + + System.out.print("【拉人群聊】输入 userId 列表,userId 之间英文逗号隔开:"); + String userIds = scanner.next(); + createGroupRequestPacket.setUserIdList(Arrays.asList(userIds.split(USER_ID_SPLITER))); + channel.writeAndFlush(createGroupRequestPacket); + } + +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java new file mode 100644 index 0000000..105cf58 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java @@ -0,0 +1,34 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.LoginRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LoginConsoleCommand implements ConsoleCommand { + + @Override + public void exec(Scanner scanner, Channel channel) { + LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); + + System.out.print("输入用户名登录: "); + loginRequestPacket.setUserName(scanner.nextLine()); + loginRequestPacket.setPassword("pwd"); + + // 发送登录数据包 + channel.writeAndFlush(loginRequestPacket); + waitForLoginResponse(); + } + + private static void waitForLoginResponse() { + try { + Thread.sleep(1000); + } catch (InterruptedException ignored) { + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LogoutConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LogoutConsoleCommand.java new file mode 100644 index 0000000..2d13370 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LogoutConsoleCommand.java @@ -0,0 +1,19 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.LogoutRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LogoutConsoleCommand implements ConsoleCommand { + @Override + public void exec(Scanner scanner, Channel channel) { + LogoutRequestPacket logoutRequestPacket = new LogoutRequestPacket(); + channel.writeAndFlush(logoutRequestPacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToUserConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToUserConsoleCommand.java new file mode 100644 index 0000000..9ead2b5 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToUserConsoleCommand.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.MessageRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class SendToUserConsoleCommand implements ConsoleCommand { + + @Override + public void exec(Scanner scanner, Channel channel) { + System.out.print("发送消息给某个某个用户:"); + + String toUserId = scanner.next(); + String message = scanner.next(); + channel.writeAndFlush(new MessageRequestPacket(toUserId, message)); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupRequestPacket.java new file mode 100644 index 0000000..dc9ffc5 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupRequestPacket.java @@ -0,0 +1,28 @@ +package com.bruis.learnnetty.im.model; + +import java.util.List; + +import static com.bruis.learnnetty.im.model.Command.CREATE_GROUP_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class CreateGroupRequestPacket extends Packet { + + private List userIdList; + + @Override + public Byte getCommand() { + return CREATE_GROUP_REQUEST; + } + + public List getUserIdList() { + return userIdList; + } + + public void setUserIdList(List userIdList) { + this.userIdList = userIdList; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupResponsePacket.java new file mode 100644 index 0000000..6209205 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/CreateGroupResponsePacket.java @@ -0,0 +1,48 @@ +package com.bruis.learnnetty.im.model; + +import java.util.List; + +import static com.bruis.learnnetty.im.model.Command.CREATE_GROUP_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class CreateGroupResponsePacket extends Packet { + private boolean success; + + private String groupId; + + private List userNameList; + + @Override + public Byte getCommand() { + + return CREATE_GROUP_RESPONSE; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public List getUserNameList() { + return userNameList; + } + + public void setUserNameList(List userNameList) { + this.userNameList = userNameList; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutRequestPacket.java new file mode 100644 index 0000000..c66dc68 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutRequestPacket.java @@ -0,0 +1,16 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.LOGOUT_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/23 + */ +public class LogoutRequestPacket extends Packet { + @Override + public Byte getCommand() { + + return LOGOUT_REQUEST; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutResponsePacket.java new file mode 100644 index 0000000..73d2a71 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/LogoutResponsePacket.java @@ -0,0 +1,37 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.LOGOUT_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class LogoutResponsePacket extends Packet { + + private boolean success; + + private String reason; + + + @Override + public Byte getCommand() { + return LOGOUT_RESPONSE; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java index 7e48ff1..c5b780b 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java @@ -28,6 +28,10 @@ private PacketCodeC() { packetTypeMap.put(LOGIN_RESPONSE, LoginResponsePacket.class); packetTypeMap.put(MESSAGE_REQUEST, MessageRequestPacket.class); packetTypeMap.put(MESSAGE_RESPONSE, MessageResponsePacket.class); + packetTypeMap.put(LOGOUT_REQUEST, LogoutRequestPacket.class); + packetTypeMap.put(LOGOUT_RESPONSE, LogoutResponsePacket.class); + packetTypeMap.put(CREATE_GROUP_REQUEST, CreateGroupRequestPacket.class); + packetTypeMap.put(CREATE_GROUP_RESPONSE, CreateGroupResponsePacket.class); serializerMap = new HashMap<>(); Serializer serializer = new JSONSerializer(); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java index 6ba48f8..e04514c 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java @@ -3,9 +3,7 @@ import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; -import com.bruis.learnnetty.im.server.handler.AuthHandler; -import com.bruis.learnnetty.im.server.handler.LoginRequestHandler; -import com.bruis.learnnetty.im.server.handler.MessageRequestHandler; +import com.bruis.learnnetty.im.server.handler.*; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; @@ -38,11 +36,12 @@ public static void main(String[] args) { @Override protected void initChannel(NioSocketChannel ch) throws Exception { ch.pipeline().addLast(new Spliter()); -// ch.pipeline().addLast(new FirstServerHandler()); ch.pipeline().addLast(new PacketDecoder()); ch.pipeline().addLast(new LoginRequestHandler()); ch.pipeline().addLast(new AuthHandler()); ch.pipeline().addLast(new MessageRequestHandler()); + ch.pipeline().addLast(new CreateGroupRequestHandler()); + ch.pipeline().addLast(new LogoutRequestHandler()); ch.pipeline().addLast(new PacketEncoder()); } }); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java new file mode 100644 index 0000000..3692392 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java @@ -0,0 +1,49 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.CreateGroupRequestPacket; +import com.bruis.learnnetty.im.model.CreateGroupResponsePacket; +import com.bruis.learnnetty.im.util.IDUtil; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.group.ChannelGroup; +import io.netty.channel.group.DefaultChannelGroup; +import org.omg.PortableServer.ID_UNIQUENESS_POLICY_ID; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class CreateGroupRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, CreateGroupRequestPacket msg) throws Exception { + List userIdList = msg.getUserIdList(); + List userNameList = new ArrayList<>(); + + ChannelGroup channelGroup = new DefaultChannelGroup(ctx.executor()); + + for (String userId : userIdList) { + Channel channel = SessionUtil.getChannel(userId); + if (null != channel) { + channelGroup.add(channel); + userNameList.add(SessionUtil.getSession(channel).getUserName()); + } + } + + CreateGroupResponsePacket createGroupResponsePacket = new CreateGroupResponsePacket(); + createGroupResponsePacket.setSuccess(true); + createGroupResponsePacket.setGroupId(IDUtil.randomUserId()); + createGroupResponsePacket.setUserNameList(userNameList); + + channelGroup.writeAndFlush(createGroupResponsePacket); + + System.out.print("群创建成功,id 为[" + createGroupResponsePacket.getGroupId() + "], "); + System.out.println("群里面有:" + createGroupResponsePacket.getUserNameList()); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java index 837f2d6..6e223fd 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java @@ -3,6 +3,7 @@ import com.bruis.learnnetty.im.model.LoginRequestPacket; import com.bruis.learnnetty.im.model.LoginResponsePacket; import com.bruis.learnnetty.im.session.Session; +import com.bruis.learnnetty.im.util.IDUtil; import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -26,7 +27,7 @@ protected void channelRead0(ChannelHandlerContext ctx, LoginRequestPacket loginR if (valid(loginRequestPacket)) { loginResponsePacket.setSuccess(true); - String userId = randomUserId(); + String userId = IDUtil.randomUserId(); loginResponsePacket.setUserId(userId); System.out.println("[" + loginRequestPacket.getUserName() + "]登录成功"); SessionUtil.bindSession(new Session(userId, loginRequestPacket.getUserName()), ctx.channel()); @@ -44,10 +45,6 @@ private boolean valid(LoginRequestPacket loginRequestPacket) { return true; } - private static String randomUserId() { - return UUID.randomUUID().toString().split("-")[0]; - } - @Override public void channelInactive(ChannelHandlerContext ctx) { SessionUtil.unBindSession(ctx.channel()); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java new file mode 100644 index 0000000..8ee3152 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.LogoutRequestPacket; +import com.bruis.learnnetty.im.model.LogoutResponsePacket; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class LogoutRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, LogoutRequestPacket msg) { + SessionUtil.unBindSession(ctx.channel()); + LogoutResponsePacket logoutResponsePacket = new LogoutResponsePacket(); + logoutResponsePacket.setSuccess(true); + ctx.channel().writeAndFlush(logoutResponsePacket); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/IDUtil.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/IDUtil.java new file mode 100644 index 0000000..3b5403f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/IDUtil.java @@ -0,0 +1,16 @@ +package com.bruis.learnnetty.im.util; + +import java.util.UUID; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class IDUtil { + + public static String randomUserId() { + return UUID.randomUUID().toString().split("-")[0]; + } + +} From 73e7dd2adbfcd7f488c52d9500e8d020b8ab98a1 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Fri, 25 Mar 2022 10:04:47 +0800 Subject: [PATCH 57/68] =?UTF-8?q?=E7=BE=A4=E8=81=8A=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E6=94=B6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../learnnetty/im/client/NettyClient.java | 11 +++-- .../handler/GroupMessageResponseHandler.java | 20 ++++++++ .../handler/JoinGroupResponseHandler.java | 21 ++++++++ .../ListGroupMembersResponseHandler.java | 18 +++++++ .../handler/QuitGroupResponseHandler.java | 22 +++++++++ .../im/console/ConsoleCommandManager.java | 4 ++ .../im/console/JoinGroupConsoleCommand.java | 23 +++++++++ .../ListGroupMembersConsoleCommand.java | 25 ++++++++++ .../im/console/QuitGroupConsoleCommand.java | 25 ++++++++++ .../im/console/SendToGroupConsoleCommand.java | 24 +++++++++ .../im/model/GroupMessageRequestPacket.java | 39 +++++++++++++++ .../im/model/GroupMessageResponsePacket.java | 49 +++++++++++++++++++ .../im/model/JoinGroupRequestPacket.java | 26 ++++++++++ .../im/model/JoinGroupResponsePacket.java | 46 +++++++++++++++++ .../model/ListGroupMembersRequestPacket.java | 27 ++++++++++ .../model/ListGroupMembersResponsePacket.java | 41 ++++++++++++++++ .../learnnetty/im/model/PacketCodeC.java | 12 ++++- .../im/model/QuitGroupRequestPacket.java | 26 ++++++++++ .../im/model/QuitGroupResponsePacket.java | 47 ++++++++++++++++++ .../learnnetty/im/server/NettyServer.java | 4 ++ .../handler/CreateGroupRequestHandler.java | 5 +- .../handler/GroupMessageRequestHandler.java | 34 +++++++++++++ .../handler/JoinGroupRequestHandler.java | 33 +++++++++++++ .../ListGroupMembersRequestHandler.java | 41 ++++++++++++++++ .../handler/QuitGroupRequestHandler.java | 31 ++++++++++++ .../bruis/learnnetty/im/session/Session.java | 5 ++ .../bruis/learnnetty/im/util/SessionUtil.java | 16 +++++- 27 files changed, 666 insertions(+), 9 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/GroupMessageResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/JoinGroupResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/ListGroupMembersResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/QuitGroupResponseHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/JoinGroupConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ListGroupMembersConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/QuitGroupConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToGroupConsoleCommand.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupRequestPacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupResponsePacket.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/GroupMessageRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java index e195814..4a701b4 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/NettyClient.java @@ -1,9 +1,6 @@ package com.bruis.learnnetty.im.client; -import com.bruis.learnnetty.im.client.handler.CreateGroupResponseHandler; -import com.bruis.learnnetty.im.client.handler.LoginResponseHandler; -import com.bruis.learnnetty.im.client.handler.LogoutResponseHandler; -import com.bruis.learnnetty.im.client.handler.MessageResponseHandler; +import com.bruis.learnnetty.im.client.handler.*; import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; @@ -55,10 +52,14 @@ public void initChannel(SocketChannel ch) { ch.pipeline().addLast(new PacketDecoder()); // 登录响应 ch.pipeline().addLast(new LoginResponseHandler()); - ch.pipeline().addLast(new LogoutResponseHandler()); // 消息返回 ch.pipeline().addLast(new MessageResponseHandler()); ch.pipeline().addLast(new CreateGroupResponseHandler()); + ch.pipeline().addLast(new JoinGroupResponseHandler()); + ch.pipeline().addLast(new QuitGroupResponseHandler()); + ch.pipeline().addLast(new ListGroupMembersResponseHandler()); + ch.pipeline().addLast(new GroupMessageResponseHandler()); + ch.pipeline().addLast(new LogoutResponseHandler()); // 解码 ch.pipeline().addLast(new PacketEncoder()); } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/GroupMessageResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/GroupMessageResponseHandler.java new file mode 100644 index 0000000..3dc9921 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/GroupMessageResponseHandler.java @@ -0,0 +1,20 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.GroupMessageResponsePacket; +import com.bruis.learnnetty.im.session.Session; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class GroupMessageResponseHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext ctx, GroupMessageResponsePacket responsePacket) { + String fromGroupId = responsePacket.getFromGroupId(); + Session fromUser = responsePacket.getFromUser(); + System.out.println("收到群[" + fromGroupId + "]中[" + fromUser + "]发来的消息:" + responsePacket.getMessage()); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/JoinGroupResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/JoinGroupResponseHandler.java new file mode 100644 index 0000000..cc7efea --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/JoinGroupResponseHandler.java @@ -0,0 +1,21 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.JoinGroupResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class JoinGroupResponseHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext ctx, JoinGroupResponsePacket responsePacket) throws Exception { + if (responsePacket.isSuccess()) { + System.out.println("加入群[" + responsePacket.getGroupId() + "]成功!"); + } else { + System.err.println("加入群[" + responsePacket.getGroupId() + "]失败,原因为:" + responsePacket.getReason()); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/ListGroupMembersResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/ListGroupMembersResponseHandler.java new file mode 100644 index 0000000..0117eac --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/ListGroupMembersResponseHandler.java @@ -0,0 +1,18 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.ListGroupMembersResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class ListGroupMembersResponseHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, ListGroupMembersResponsePacket responsePacket) { + System.out.println("群[" + responsePacket.getGroupId() + "]中的人包括:" + responsePacket.getSessionList()); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/QuitGroupResponseHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/QuitGroupResponseHandler.java new file mode 100644 index 0000000..be82bd5 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/client/handler/QuitGroupResponseHandler.java @@ -0,0 +1,22 @@ +package com.bruis.learnnetty.im.client.handler; + +import com.bruis.learnnetty.im.model.QuitGroupResponsePacket; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class QuitGroupResponseHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, QuitGroupResponsePacket responsePacket) throws Exception { + if (responsePacket.isSuccess()) { + System.out.println("退出群聊[" + responsePacket.getGroupId() + "]成功!"); + } else { + System.out.println("退出群聊[" + responsePacket.getGroupId() + "]失败!"); + } + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java index 07a1966..d4759d0 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java @@ -21,6 +21,10 @@ public ConsoleCommandManager() { consoleCommandMap.put("sendToUser", new SendToUserConsoleCommand()); consoleCommandMap.put("logout", new LoginConsoleCommand()); consoleCommandMap.put("createGroup", new CreateGroupConsoleCommand()); + consoleCommandMap.put("joinGroup", new JoinGroupConsoleCommand()); + consoleCommandMap.put("quitGroup", new QuitGroupConsoleCommand()); + consoleCommandMap.put("listGroup", new ListGroupMembersConsoleCommand()); + consoleCommandMap.put("sendToGroup", new SendToGroupConsoleCommand()); } @Override diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/JoinGroupConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/JoinGroupConsoleCommand.java new file mode 100644 index 0000000..c3ff3f4 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/JoinGroupConsoleCommand.java @@ -0,0 +1,23 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.JoinGroupRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class JoinGroupConsoleCommand implements ConsoleCommand{ + + @Override + public void exec(Scanner scanner, Channel channel) { + JoinGroupRequestPacket requestPacket = new JoinGroupRequestPacket(); + System.out.println("输入groupId, 加入群聊:"); + String groupId = scanner.next(); + requestPacket.setGroupId(groupId); + channel.writeAndFlush(requestPacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ListGroupMembersConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ListGroupMembersConsoleCommand.java new file mode 100644 index 0000000..87e79c4 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ListGroupMembersConsoleCommand.java @@ -0,0 +1,25 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.ListGroupMembersRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class ListGroupMembersConsoleCommand implements ConsoleCommand { + + @Override + public void exec(Scanner scanner, Channel channel) { + ListGroupMembersRequestPacket listGroupMembersRequestPacket = new ListGroupMembersRequestPacket(); + + System.out.print("输入 groupId,获取群成员列表:"); + String groupId = scanner.next(); + + listGroupMembersRequestPacket.setGroupId(groupId); + channel.writeAndFlush(listGroupMembersRequestPacket); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/QuitGroupConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/QuitGroupConsoleCommand.java new file mode 100644 index 0000000..4b4b284 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/QuitGroupConsoleCommand.java @@ -0,0 +1,25 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.QuitGroupRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class QuitGroupConsoleCommand implements ConsoleCommand { + + @Override + public void exec(Scanner scanner, Channel channel) { + QuitGroupRequestPacket quitGroupRequestPacket = new QuitGroupRequestPacket(); + + System.out.print("输入 groupId,退出群聊:"); + String groupId = scanner.next(); + + quitGroupRequestPacket.setGroupId(groupId); + channel.writeAndFlush(quitGroupRequestPacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToGroupConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToGroupConsoleCommand.java new file mode 100644 index 0000000..90f8f90 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/SendToGroupConsoleCommand.java @@ -0,0 +1,24 @@ +package com.bruis.learnnetty.im.console; + +import com.bruis.learnnetty.im.model.GroupMessageRequestPacket; +import io.netty.channel.Channel; + +import java.util.Scanner; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class SendToGroupConsoleCommand implements ConsoleCommand { + + @Override + public void exec(Scanner scanner, Channel channel) { + System.out.print("发送消息给某个某个群组:"); + + String toGroupId = scanner.next(); + String message = scanner.next(); + channel.writeAndFlush(new GroupMessageRequestPacket(toGroupId, message)); + + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageRequestPacket.java new file mode 100644 index 0000000..3a6f812 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageRequestPacket.java @@ -0,0 +1,39 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.GROUP_MESSAGE_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class GroupMessageRequestPacket extends Packet { + private String toGroupId; + private String message; + + public GroupMessageRequestPacket(String toGroupId, String message) { + this.toGroupId = toGroupId; + this.message = message; + } + + @Override + public Byte getCommand() { + return GROUP_MESSAGE_REQUEST; + } + + public String getToGroupId() { + return toGroupId; + } + + public void setToGroupId(String toGroupId) { + this.toGroupId = toGroupId; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageResponsePacket.java new file mode 100644 index 0000000..986333b --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/GroupMessageResponsePacket.java @@ -0,0 +1,49 @@ +package com.bruis.learnnetty.im.model; + +import com.bruis.learnnetty.im.session.Session; + +import static com.bruis.learnnetty.im.model.Command.GROUP_MESSAGE_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class GroupMessageResponsePacket extends Packet { + + private String fromGroupId; + + private Session fromUser; + + private String message; + + @Override + public Byte getCommand() { + + return GROUP_MESSAGE_RESPONSE; + } + + public String getFromGroupId() { + return fromGroupId; + } + + public void setFromGroupId(String fromGroupId) { + this.fromGroupId = fromGroupId; + } + + public Session getFromUser() { + return fromUser; + } + + public void setFromUser(Session fromUser) { + this.fromUser = fromUser; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupRequestPacket.java new file mode 100644 index 0000000..26fb73d --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupRequestPacket.java @@ -0,0 +1,26 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.JOIN_GROUP_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class JoinGroupRequestPacket extends Packet { + + private String groupId; + + @Override + public Byte getCommand() { + return JOIN_GROUP_REQUEST; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupResponsePacket.java new file mode 100644 index 0000000..dce9a1d --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/JoinGroupResponsePacket.java @@ -0,0 +1,46 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.JOIN_GROUP_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class JoinGroupResponsePacket extends Packet { + + private String groupId; + + private boolean success; + + private String reason; + + @Override + public Byte getCommand() { + return JOIN_GROUP_RESPONSE; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersRequestPacket.java new file mode 100644 index 0000000..886b19c --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersRequestPacket.java @@ -0,0 +1,27 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.LIST_GROUP_MEMBERS_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class ListGroupMembersRequestPacket extends Packet { + + private String groupId; + + @Override + public Byte getCommand() { + + return LIST_GROUP_MEMBERS_REQUEST; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersResponsePacket.java new file mode 100644 index 0000000..dbc174e --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/ListGroupMembersResponsePacket.java @@ -0,0 +1,41 @@ +package com.bruis.learnnetty.im.model; + +import com.bruis.learnnetty.im.session.Session; + +import java.util.List; + +import static com.bruis.learnnetty.im.model.Command.LIST_GROUP_MEMBERS_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class ListGroupMembersResponsePacket extends Packet { + + private String groupId; + + private List sessionList; + + @Override + public Byte getCommand() { + + return LIST_GROUP_MEMBERS_RESPONSE; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public List getSessionList() { + return sessionList; + } + + public void setSessionList(List sessionList) { + this.sessionList = sessionList; + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java index c5b780b..7a81483 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/PacketCodeC.java @@ -3,9 +3,9 @@ import com.bruis.learnnetty.im.serialize.Serializer; import com.bruis.learnnetty.im.serialize.impl.JSONSerializer; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import java.util.*; +import java.util.HashMap; +import java.util.Map; import static com.bruis.learnnetty.im.model.Command.*; @@ -32,6 +32,14 @@ private PacketCodeC() { packetTypeMap.put(LOGOUT_RESPONSE, LogoutResponsePacket.class); packetTypeMap.put(CREATE_GROUP_REQUEST, CreateGroupRequestPacket.class); packetTypeMap.put(CREATE_GROUP_RESPONSE, CreateGroupResponsePacket.class); + packetTypeMap.put(JOIN_GROUP_REQUEST, JoinGroupRequestPacket.class); + packetTypeMap.put(JOIN_GROUP_RESPONSE, JoinGroupResponsePacket.class); + packetTypeMap.put(QUIT_GROUP_REQUEST, QuitGroupRequestPacket.class); + packetTypeMap.put(QUIT_GROUP_RESPONSE, QuitGroupResponsePacket.class); + packetTypeMap.put(LIST_GROUP_MEMBERS_REQUEST, ListGroupMembersRequestPacket.class); + packetTypeMap.put(LIST_GROUP_MEMBERS_RESPONSE, ListGroupMembersResponsePacket.class); + packetTypeMap.put(GROUP_MESSAGE_REQUEST, GroupMessageRequestPacket.class); + packetTypeMap.put(GROUP_MESSAGE_RESPONSE, GroupMessageResponsePacket.class); serializerMap = new HashMap<>(); Serializer serializer = new JSONSerializer(); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupRequestPacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupRequestPacket.java new file mode 100644 index 0000000..ca5342f --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupRequestPacket.java @@ -0,0 +1,26 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.QUIT_GROUP_REQUEST; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class QuitGroupRequestPacket extends Packet { + + private String groupId; + + @Override + public Byte getCommand() { + return QUIT_GROUP_REQUEST; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupResponsePacket.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupResponsePacket.java new file mode 100644 index 0000000..99529c7 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/model/QuitGroupResponsePacket.java @@ -0,0 +1,47 @@ +package com.bruis.learnnetty.im.model; + +import static com.bruis.learnnetty.im.model.Command.QUIT_GROUP_REQUEST; +import static com.bruis.learnnetty.im.model.Command.QUIT_GROUP_RESPONSE; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class QuitGroupResponsePacket extends Packet { + + private String groupId; + + private boolean success; + + private String reason; + + @Override + public Byte getCommand() { + return QUIT_GROUP_RESPONSE; + } + + public String getGroupId() { + return groupId; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getReason() { + return reason; + } + + public void setReason(String reason) { + this.reason = reason; + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java index e04514c..80741f8 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java @@ -41,6 +41,10 @@ protected void initChannel(NioSocketChannel ch) throws Exception { ch.pipeline().addLast(new AuthHandler()); ch.pipeline().addLast(new MessageRequestHandler()); ch.pipeline().addLast(new CreateGroupRequestHandler()); + ch.pipeline().addLast(new JoinGroupRequestHandler()); + ch.pipeline().addLast(new QuitGroupRequestHandler()); + ch.pipeline().addLast(new ListGroupMembersRequestHandler()); + ch.pipeline().addLast(new GroupMessageRequestHandler()); ch.pipeline().addLast(new LogoutRequestHandler()); ch.pipeline().addLast(new PacketEncoder()); } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java index 3692392..45a951d 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java @@ -36,14 +36,17 @@ protected void channelRead0(ChannelHandlerContext ctx, CreateGroupRequestPacket } } + String groupId = IDUtil.randomUserId(); CreateGroupResponsePacket createGroupResponsePacket = new CreateGroupResponsePacket(); createGroupResponsePacket.setSuccess(true); - createGroupResponsePacket.setGroupId(IDUtil.randomUserId()); + createGroupResponsePacket.setGroupId(groupId); createGroupResponsePacket.setUserNameList(userNameList); channelGroup.writeAndFlush(createGroupResponsePacket); System.out.print("群创建成功,id 为[" + createGroupResponsePacket.getGroupId() + "], "); System.out.println("群里面有:" + createGroupResponsePacket.getUserNameList()); + + SessionUtil.bindChannelGroup(groupId, channelGroup); } } diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/GroupMessageRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/GroupMessageRequestHandler.java new file mode 100644 index 0000000..5507f45 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/GroupMessageRequestHandler.java @@ -0,0 +1,34 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.GroupMessageRequestPacket; +import com.bruis.learnnetty.im.model.GroupMessageResponsePacket; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.group.ChannelGroup; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +@ChannelHandler.Sharable +public class GroupMessageRequestHandler extends SimpleChannelInboundHandler { + + public static final GroupMessageRequestHandler INSTANCE = new GroupMessageRequestHandler(); + + public GroupMessageRequestHandler() {} + + @Override + protected void channelRead0(ChannelHandlerContext ctx, GroupMessageRequestPacket msg) throws Exception { + String toGroupId = msg.getToGroupId(); + GroupMessageResponsePacket responsePacket = new GroupMessageResponsePacket(); + responsePacket.setFromGroupId(toGroupId); + responsePacket.setMessage(msg.getMessage()); + responsePacket.setFromUser(SessionUtil.getSession(ctx.channel())); + + ChannelGroup channelGroup = SessionUtil.getChannelGroup(toGroupId); + channelGroup.writeAndFlush(responsePacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java new file mode 100644 index 0000000..1cf19d2 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java @@ -0,0 +1,33 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.JoinGroupRequestPacket; +import com.bruis.learnnetty.im.model.JoinGroupResponsePacket; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.group.ChannelGroup; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class JoinGroupRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, JoinGroupRequestPacket msg) throws Exception { + // 目标群聊id + String groupId = msg.getGroupId(); + ChannelGroup channelGroup = SessionUtil.getChannelGroup(groupId); + JoinGroupResponsePacket responsePacket = new JoinGroupResponsePacket(); + responsePacket.setSuccess(true); + responsePacket.setGroupId(groupId); + if (null == channelGroup) { + responsePacket.setSuccess(false); + responsePacket.setReason("没有该群聊,请重试..."); + } else { + channelGroup.add(ctx.channel()); + } + ctx.channel().writeAndFlush(responsePacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java new file mode 100644 index 0000000..5418a4e --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java @@ -0,0 +1,41 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.ListGroupMembersRequestPacket; +import com.bruis.learnnetty.im.model.ListGroupMembersResponsePacket; +import com.bruis.learnnetty.im.session.Session; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.group.ChannelGroup; + +import java.util.ArrayList; +import java.util.List; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class ListGroupMembersRequestHandler extends SimpleChannelInboundHandler { + @Override + protected void channelRead0(ChannelHandlerContext ctx, ListGroupMembersRequestPacket requestPacket) { + // 1. 获取群的 ChannelGroup + String groupId = requestPacket.getGroupId(); + ChannelGroup channelGroup = SessionUtil.getChannelGroup(groupId); + + // 2. 遍历群成员的 channel,对应的 session,构造群成员的信息 + List sessionList = new ArrayList<>(); + for (Channel channel : channelGroup) { + Session session = SessionUtil.getSession(channel); + sessionList.add(session); + } + + // 3. 构建获取成员列表响应写回到客户端 + ListGroupMembersResponsePacket responsePacket = new ListGroupMembersResponsePacket(); + + responsePacket.setGroupId(groupId); + responsePacket.setSessionList(sessionList); + ctx.channel().writeAndFlush(responsePacket); + } +} \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java new file mode 100644 index 0000000..81dba9a --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java @@ -0,0 +1,31 @@ +package com.bruis.learnnetty.im.server.handler; + +import com.bruis.learnnetty.im.model.QuitGroupRequestPacket; +import com.bruis.learnnetty.im.model.QuitGroupResponsePacket; +import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.Channel; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.group.ChannelGroup; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/24 + */ +public class QuitGroupRequestHandler extends SimpleChannelInboundHandler { + + @Override + protected void channelRead0(ChannelHandlerContext ctx, QuitGroupRequestPacket msg) throws Exception { + String groupId = msg.getGroupId(); + Channel channel = ctx.channel(); + ChannelGroup channelGroup = SessionUtil.getChannelGroup(groupId); + channelGroup.remove(channel); + + QuitGroupResponsePacket responsePacket = new QuitGroupResponsePacket(); + responsePacket.setSuccess(true); + responsePacket.setGroupId(groupId); + + channel.writeAndFlush(responsePacket); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/session/Session.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/session/Session.java index 9779a96..7a7be2d 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/session/Session.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/session/Session.java @@ -31,4 +31,9 @@ public String getUserName() { public void setUserName(String userName) { this.userName = userName; } + + @Override + public String toString() { + return userId + "->" + userName; + } } \ No newline at end of file diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java index 133a38b..f4b41c3 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/util/SessionUtil.java @@ -3,6 +3,7 @@ import com.bruis.learnnetty.im.model.Attributes; import com.bruis.learnnetty.im.session.Session; import io.netty.channel.Channel; +import io.netty.channel.group.ChannelGroup; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -13,8 +14,11 @@ * @Date 2022/3/23 */ public class SessionUtil { + private static final Map userIdChannelMap = new ConcurrentHashMap<>(); + private static final Map groupIdChannelGroupMap = new ConcurrentHashMap<>(); + public static void bindSession(Session session, Channel channel) { userIdChannelMap.put(session.getUserId(), channel); channel.attr(Attributes.SESSION).set(session); @@ -22,8 +26,10 @@ public static void bindSession(Session session, Channel channel) { public static void unBindSession(Channel channel) { if (hasLogin(channel)) { - userIdChannelMap.remove(getSession(channel).getUserId()); + Session session = getSession(channel); + userIdChannelMap.remove(session.getUserId()); channel.attr(Attributes.SESSION).set(null); + System.out.println(session + " 退出登录"); } } @@ -41,4 +47,12 @@ public static Channel getChannel(String userId) { return userIdChannelMap.get(userId); } + + public static void bindChannelGroup(String groupId, ChannelGroup channelGroup) { + groupIdChannelGroupMap.put(groupId, channelGroup); + } + + public static ChannelGroup getChannelGroup(String groupId) { + return groupIdChannelGroupMap.get(groupId); + } } From 43108faea552de73ea1831c5090054f816f13426 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 26 Mar 2022 10:10:01 +0800 Subject: [PATCH 58/68] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../im/codec/PacketCodecHandler.java | 35 ++++++++++++++++ .../learnnetty/im/server/NettyServer.java | 16 +++---- .../im/server/handler/AuthHandler.java | 6 +++ .../handler/CreateGroupRequestHandler.java | 6 +++ .../im/server/handler/IMHandler.java | 42 +++++++++++++++++++ .../handler/JoinGroupRequestHandler.java | 6 +++ .../ListGroupMembersRequestHandler.java | 7 ++++ .../server/handler/LoginRequestHandler.java | 18 ++++++-- .../server/handler/LogoutRequestHandler.java | 6 +++ .../server/handler/MessageRequestHandler.java | 6 +++ .../handler/QuitGroupRequestHandler.java | 6 +++ 11 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketCodecHandler.java create mode 100644 Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/IMHandler.java diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketCodecHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketCodecHandler.java new file mode 100644 index 0000000..35aa573 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/codec/PacketCodecHandler.java @@ -0,0 +1,35 @@ +package com.bruis.learnnetty.im.codec; + +import com.bruis.learnnetty.im.model.Packet; +import com.bruis.learnnetty.im.model.PacketCodeC; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToMessageCodec; + +import java.util.List; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/25 + */ +@ChannelHandler.Sharable +public class PacketCodecHandler extends MessageToMessageCodec { + + public static final PacketCodecHandler INSTANCE = new PacketCodecHandler(); + + private PacketCodecHandler() {} + + @Override + protected void encode(ChannelHandlerContext ctx, Packet msg, List out) throws Exception { + ByteBuf byteBuf = ctx.channel().alloc().ioBuffer(); + PacketCodeC.INSTANCE.encode(byteBuf, msg); + out.add(byteBuf); + } + + @Override + protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { + out.add(PacketCodeC.INSTANCE.decode(msg)); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java index 80741f8..08d3f14 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/NettyServer.java @@ -1,5 +1,6 @@ package com.bruis.learnnetty.im.server; +import com.bruis.learnnetty.im.codec.PacketCodecHandler; import com.bruis.learnnetty.im.codec.PacketDecoder; import com.bruis.learnnetty.im.codec.PacketEncoder; import com.bruis.learnnetty.im.codec.Spliter; @@ -36,17 +37,10 @@ public static void main(String[] args) { @Override protected void initChannel(NioSocketChannel ch) throws Exception { ch.pipeline().addLast(new Spliter()); - ch.pipeline().addLast(new PacketDecoder()); - ch.pipeline().addLast(new LoginRequestHandler()); - ch.pipeline().addLast(new AuthHandler()); - ch.pipeline().addLast(new MessageRequestHandler()); - ch.pipeline().addLast(new CreateGroupRequestHandler()); - ch.pipeline().addLast(new JoinGroupRequestHandler()); - ch.pipeline().addLast(new QuitGroupRequestHandler()); - ch.pipeline().addLast(new ListGroupMembersRequestHandler()); - ch.pipeline().addLast(new GroupMessageRequestHandler()); - ch.pipeline().addLast(new LogoutRequestHandler()); - ch.pipeline().addLast(new PacketEncoder()); + ch.pipeline().addLast(PacketCodecHandler.INSTANCE); + ch.pipeline().addLast(LoginRequestHandler.INSTANCE); + ch.pipeline().addLast(AuthHandler.INSTANCE); + ch.pipeline().addLast(IMHandler.INSTANCE); } }); bind(serverBootstrap, PORT); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java index 33aad01..ad5c784 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/AuthHandler.java @@ -1,6 +1,7 @@ package com.bruis.learnnetty.im.server.handler; import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; @@ -9,8 +10,13 @@ * @Author luohaiyang * @Date 2022/3/23 */ +@ChannelHandler.Sharable public class AuthHandler extends ChannelInboundHandlerAdapter { + public static final AuthHandler INSTANCE = new AuthHandler(); + + protected AuthHandler() {} + @Override public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { if (!SessionUtil.hasLogin(ctx.channel())) { diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java index 45a951d..64c57cf 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/CreateGroupRequestHandler.java @@ -5,6 +5,7 @@ import com.bruis.learnnetty.im.util.IDUtil; import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.group.ChannelGroup; @@ -19,8 +20,13 @@ * @Author luohaiyang * @Date 2022/3/24 */ +@ChannelHandler.Sharable public class CreateGroupRequestHandler extends SimpleChannelInboundHandler { + public static final CreateGroupRequestHandler INSTANCE = new CreateGroupRequestHandler(); + + protected CreateGroupRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext ctx, CreateGroupRequestPacket msg) throws Exception { List userIdList = msg.getUserIdList(); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/IMHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/IMHandler.java new file mode 100644 index 0000000..8420f57 --- /dev/null +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/IMHandler.java @@ -0,0 +1,42 @@ +package com.bruis.learnnetty.im.server.handler; + +import io.netty.channel.ChannelHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.SimpleChannelInboundHandler; +import com.bruis.learnnetty.im.model.Packet; + +import java.util.HashMap; +import java.util.Map; + +import static com.bruis.learnnetty.im.model.Command.*; + + +/** + * @Description + * @Author luohaiyang + * @Date 2022/3/25 + */ +@ChannelHandler.Sharable +public class IMHandler extends SimpleChannelInboundHandler { + + public static final IMHandler INSTANCE = new IMHandler(); + + private Map> handlerMap; + + private IMHandler() { + handlerMap = new HashMap<>(); + + handlerMap.put(MESSAGE_REQUEST, MessageRequestHandler.INSTANCE); + handlerMap.put(CREATE_GROUP_REQUEST, CreateGroupRequestHandler.INSTANCE); + handlerMap.put(JOIN_GROUP_REQUEST, JoinGroupRequestHandler.INSTANCE); + handlerMap.put(QUIT_GROUP_REQUEST, QuitGroupRequestHandler.INSTANCE); + handlerMap.put(LIST_GROUP_MEMBERS_REQUEST, ListGroupMembersRequestHandler.INSTANCE); + handlerMap.put(GROUP_MESSAGE_REQUEST, GroupMessageRequestHandler.INSTANCE); + handlerMap.put(LOGOUT_REQUEST, LogoutRequestHandler.INSTANCE); + } + + @Override + protected void channelRead0(ChannelHandlerContext ctx, Packet packet) throws Exception { + handlerMap.get(packet.getCommand()).channelRead(ctx, packet); + } +} diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java index 1cf19d2..1188ec6 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/JoinGroupRequestHandler.java @@ -3,6 +3,7 @@ import com.bruis.learnnetty.im.model.JoinGroupRequestPacket; import com.bruis.learnnetty.im.model.JoinGroupResponsePacket; import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.group.ChannelGroup; @@ -12,8 +13,13 @@ * @Author luohaiyang * @Date 2022/3/24 */ +@ChannelHandler.Sharable public class JoinGroupRequestHandler extends SimpleChannelInboundHandler { + public static final JoinGroupRequestHandler INSTANCE = new JoinGroupRequestHandler(); + + protected JoinGroupRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext ctx, JoinGroupRequestPacket msg) throws Exception { // 目标群聊id diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java index 5418a4e..8be361d 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/ListGroupMembersRequestHandler.java @@ -5,6 +5,7 @@ import com.bruis.learnnetty.im.session.Session; import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.group.ChannelGroup; @@ -17,7 +18,13 @@ * @Author luohaiyang * @Date 2022/3/24 */ +@ChannelHandler.Sharable public class ListGroupMembersRequestHandler extends SimpleChannelInboundHandler { + + public static final ListGroupMembersRequestHandler INSTANCE = new ListGroupMembersRequestHandler(); + + protected ListGroupMembersRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext ctx, ListGroupMembersRequestPacket requestPacket) { // 1. 获取群的 ChannelGroup diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java index 6e223fd..0286a96 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LoginRequestHandler.java @@ -5,19 +5,23 @@ import com.bruis.learnnetty.im.session.Session; import com.bruis.learnnetty.im.util.IDUtil; import com.bruis.learnnetty.im.util.SessionUtil; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; +import io.netty.channel.*; +import java.util.Arrays; import java.util.Date; -import java.util.UUID; /** * @Description 接收客户端登录请求 * @Author luohaiyang * @Date 2022/3/23 */ +@ChannelHandler.Sharable public class LoginRequestHandler extends SimpleChannelInboundHandler { + public static final LoginRequestHandler INSTANCE = new LoginRequestHandler(); + + protected LoginRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext ctx, LoginRequestPacket loginRequestPacket) { // 登录校验响应 @@ -38,7 +42,13 @@ protected void channelRead0(ChannelHandlerContext ctx, LoginRequestPacket loginR } // 登录响应 - ctx.channel().writeAndFlush(loginResponsePacket); + ctx.writeAndFlush(loginResponsePacket).addListener((ChannelFutureListener) future -> { + // 关闭channel成功 + Throwable cause = future.cause(); + if (null != cause) { + System.out.println(Arrays.toString(cause.getStackTrace())); + } + }); } private boolean valid(LoginRequestPacket loginRequestPacket) { diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java index 8ee3152..4436802 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/LogoutRequestHandler.java @@ -3,6 +3,7 @@ import com.bruis.learnnetty.im.model.LogoutRequestPacket; import com.bruis.learnnetty.im.model.LogoutResponsePacket; import com.bruis.learnnetty.im.util.SessionUtil; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -11,8 +12,13 @@ * @Author luohaiyang * @Date 2022/3/24 */ +@ChannelHandler.Sharable public class LogoutRequestHandler extends SimpleChannelInboundHandler { + public static final LogoutRequestHandler INSTANCE = new LogoutRequestHandler(); + + protected LogoutRequestHandler () {} + @Override protected void channelRead0(ChannelHandlerContext ctx, LogoutRequestPacket msg) { SessionUtil.unBindSession(ctx.channel()); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java index 5943156..b9b83a0 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/MessageRequestHandler.java @@ -5,6 +5,7 @@ import com.bruis.learnnetty.im.session.Session; import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; @@ -13,8 +14,13 @@ * @Author luohaiyang * @Date 2022/3/23 */ +@ChannelHandler.Sharable public class MessageRequestHandler extends SimpleChannelInboundHandler { + public static final MessageRequestHandler INSTANCE = new MessageRequestHandler(); + + protected MessageRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageRequestPacket messageRequestPacket) throws Exception { // 1.拿到消息发送方的会话信息 diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java index 81dba9a..86455bb 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/server/handler/QuitGroupRequestHandler.java @@ -4,6 +4,7 @@ import com.bruis.learnnetty.im.model.QuitGroupResponsePacket; import com.bruis.learnnetty.im.util.SessionUtil; import io.netty.channel.Channel; +import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.group.ChannelGroup; @@ -13,8 +14,13 @@ * @Author luohaiyang * @Date 2022/3/24 */ +@ChannelHandler.Sharable public class QuitGroupRequestHandler extends SimpleChannelInboundHandler { + public static final QuitGroupRequestHandler INSTANCE = new QuitGroupRequestHandler(); + + protected QuitGroupRequestHandler() {} + @Override protected void channelRead0(ChannelHandlerContext ctx, QuitGroupRequestPacket msg) throws Exception { String groupId = msg.getGroupId(); From 75cd13ca018e7077a514463c478e9e51e0a720d8 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Wed, 30 Mar 2022 23:57:11 +0800 Subject: [PATCH 59/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Netty=E5=AE=9E=E6=88=98?= =?UTF-8?q?=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e69a07d..7181972 100644 --- a/README.md +++ b/README.md @@ -135,6 +135,10 @@ SpringCloud源码 - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 - Netty底层源码解析-RocketMQ底层使用到的Netty + - [实战+原理效果更佳!强烈推荐闪电侠大佬实战课:《Netty 入门与实战:仿写微信 IM 即时通讯系统》](https://juejin.cn/book/6844733738119593991) + +Netty实战课相关点位于:Spring-Netty,com/bruis/learnnetty/im包下,有需要的读者可前往查看。 + - RocketMQ底层源码解析 - RocketMQ版本:4.9.0 @@ -146,7 +150,7 @@ SpringCloud源码 todo -2021年年底完成了人生的两件大事,所以一直没时间持续输出源码分析,2022年开始需要继续努力,完成这个源码分析项目! +2021年年底完成了人生的两件大事,所以一直没时间持续输出源码分析,2022年开始需要继续努力,继续完成这个源码分析项目! - 完成Netty剩余源码分析文章 - 完成RocketMQ剩余源码分析文章 From eb95b3808d85715aa9b3f154449b9410c53162d5 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Wed, 6 Apr 2022 22:54:26 +0800 Subject: [PATCH 60/68] add LRUCache --- .../com/learnjava/collection/LRUCache.java | 71 +++++++++++++++++++ .../reference/WeakReferenceTest.java | 2 - 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/collection/LRUCache.java diff --git a/JdkLearn/src/main/java/com/learnjava/collection/LRUCache.java b/JdkLearn/src/main/java/com/learnjava/collection/LRUCache.java new file mode 100644 index 0000000..aca54da --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/collection/LRUCache.java @@ -0,0 +1,71 @@ +package com.learnjava.collection; + +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.Spliterator; +import java.util.function.Consumer; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/4/6 + */ +public class LRUCache implements Iterable { + + private int MAX = 3; + private LinkedHashMap cache = new LinkedHashMap<>(); + + public void cache(K key, V value) { + if (cache.containsKey(key)) { + cache.remove(key); + } else if (cache.size() >= MAX) { + Iterator iterator = cache.keySet().iterator(); + K first = iterator.next(); + cache.remove(first); + } + cache.put(key, value); + } + + public V getValue(K k) { + return cache.get(k); + } + + @Override + public void forEach(Consumer action) { + Iterable.super.forEach(action); + } + + @Override + public Spliterator spliterator() { + return Iterable.super.spliterator(); + } + + @Override + public Iterator iterator() { + Iterator iterator = cache.keySet().iterator(); + return new Iterator() { + + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public K next() { + return iterator.next(); + } + }; + } + + public static void main(String[] args) { + LRUCache cache = new LRUCache<>(); + cache.cache("1", "1A"); + cache.cache("2", "2A"); + cache.cache("3", "3A"); + cache.cache("1", "1A"); + + for (String next : cache) { + System.out.println(cache.getValue(next)); + } + } +} diff --git a/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java index bbbb766..2e2ec2d 100644 --- a/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java +++ b/JdkLearn/src/main/java/com/learnjava/reference/WeakReferenceTest.java @@ -1,7 +1,5 @@ package com.learnjava.reference; -import com.sun.webkit.graphics.Ref; - import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; From 6cbcb877dafb2bd1ea278f2b7feedca6f56be856 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Thu, 7 Apr 2022 23:41:50 +0800 Subject: [PATCH 61/68] =?UTF-8?q?=E6=B7=BB=E5=8A=A0demo=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/learnjava/concurent/ReentrantLockDemo.java | 9 +++++++++ .../main/java/com/learnjava/concurent/SnowIdUtils.java | 2 +- .../java/com/learnjava/concurent/SynchronizeDemo.java | 9 +++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 JdkLearn/src/main/java/com/learnjava/concurent/ReentrantLockDemo.java create mode 100644 JdkLearn/src/main/java/com/learnjava/concurent/SynchronizeDemo.java diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/ReentrantLockDemo.java b/JdkLearn/src/main/java/com/learnjava/concurent/ReentrantLockDemo.java new file mode 100644 index 0000000..0d04fb8 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/concurent/ReentrantLockDemo.java @@ -0,0 +1,9 @@ +package com.learnjava.concurent; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/4/7 + */ +public class ReentrantLockDemo { +} diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java index b07604d..384d980 100644 --- a/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java +++ b/JdkLearn/src/main/java/com/learnjava/concurent/SnowIdUtils.java @@ -58,7 +58,7 @@ private SnowFlake() { // String ip = instance.getDockerIp().replace(".", ""); // 模拟获取机器节点ip String ip = "127.0.0.1"; - long localIp = Long.valueOf(ip.replace(".", "")); + long localIp = Long.parseLong(ip.replace(".", "")); machineIdPart = (localIp & MAX_MACHINE_ID) << SEQUENCE_BIT; } /** diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/SynchronizeDemo.java b/JdkLearn/src/main/java/com/learnjava/concurent/SynchronizeDemo.java new file mode 100644 index 0000000..4a89467 --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/concurent/SynchronizeDemo.java @@ -0,0 +1,9 @@ +package com.learnjava.concurent; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/4/7 + */ +public class SynchronizeDemo { +} From 0b22c7586dd79ca3ea2c3aa3a492bd8a932b671f Mon Sep 17 00:00:00 2001 From: liuyang Date: Mon, 11 Apr 2022 15:10:16 +0800 Subject: [PATCH 62/68] =?UTF-8?q?fix:=20=E8=B0=A2=E8=B0=A2=E6=BA=90?= =?UTF-8?q?=E7=A0=81=E4=BE=8B=E5=AD=90=20=E6=84=9F=E8=A7=89=E5=AF=B9netty?= =?UTF-8?q?=E7=A8=8D=E5=BE=AE=E8=83=BD=E7=90=86=E8=A7=A3=E4=B8=80=E7=82=B9?= =?UTF-8?q?=E7=82=B9=E4=BA=86=20=E5=8F=91=E7=8E=B0=E4=B8=A4=E5=A4=84?= =?UTF-8?q?=E7=AC=94=E8=AF=AF=20=E6=9C=9B=E9=87=87=E7=BA=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bruis/learnnetty/im/console/ConsoleCommandManager.java | 2 +- .../bruis/learnnetty/im/console/LoginConsoleCommand.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java index d4759d0..8bf69f6 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/ConsoleCommandManager.java @@ -19,7 +19,7 @@ public class ConsoleCommandManager implements ConsoleCommand { public ConsoleCommandManager() { consoleCommandMap = new HashMap<>(); consoleCommandMap.put("sendToUser", new SendToUserConsoleCommand()); - consoleCommandMap.put("logout", new LoginConsoleCommand()); + consoleCommandMap.put("logout", new LogoutConsoleCommand()); consoleCommandMap.put("createGroup", new CreateGroupConsoleCommand()); consoleCommandMap.put("joinGroup", new JoinGroupConsoleCommand()); consoleCommandMap.put("quitGroup", new QuitGroupConsoleCommand()); diff --git a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java index 105cf58..3e632ca 100644 --- a/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java +++ b/Spring-Netty/src/main/java/com/bruis/learnnetty/im/console/LoginConsoleCommand.java @@ -17,7 +17,11 @@ public void exec(Scanner scanner, Channel channel) { LoginRequestPacket loginRequestPacket = new LoginRequestPacket(); System.out.print("输入用户名登录: "); - loginRequestPacket.setUserName(scanner.nextLine()); + String userIdStr; // 在退出登录logout之后 这里会读取到最后一个回车符 用户名就是空字符串会导致无法退出登录 + while ((userIdStr = scanner.nextLine()).isEmpty()) { + System.out.println("用户名异常, 请重新输入"); + } + loginRequestPacket.setUserName(userIdStr); loginRequestPacket.setPassword("pwd"); // 发送登录数据包 From 495730faa9e45dc172a4af0ed5f9551e7c79d441 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 23 Apr 2022 12:24:07 +0800 Subject: [PATCH 63/68] =?UTF-8?q?[F]=20=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ ...ile\345\205\263\351\224\256\345\255\227.md" | 8 ++++---- note/images/JDK/volatile-01.png | Bin 0 -> 129446 bytes note/images/JDK/volatile-02.png | Bin 0 -> 84199 bytes note/images/JDK/volatile-03.png | Bin 0 -> 90811 bytes 5 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 note/images/JDK/volatile-01.png create mode 100644 note/images/JDK/volatile-02.png create mode 100644 note/images/JDK/volatile-03.png diff --git a/README.md b/README.md index 7181972..fee20a8 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ SpringCloud源码 - [一篇文章快速深入学习ThreadLocal](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/JDK/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%BF%AB%E9%80%9F%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0ThreadLocal.md) - [深入学习Java volatile关键字](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/JDK/%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0Java%20volatile%E5%85%B3%E9%94%AE%E5%AD%97.md) - [深入学习Thread底层原理](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/JDK/%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0Thread%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81.md) + - [深入学习JDK1.7、8 HashMap扩容原理]() - Spring源码学习 - Spring版本:5.2.1.RELEASE @@ -135,6 +136,7 @@ SpringCloud源码 - Netty底层源码解析-FastThreadLocal原理分析 - Netty底层源码解析-内存分配原理分析 - Netty底层源码解析-RocketMQ底层使用到的Netty + - [Netty底层的优化总结]() - [实战+原理效果更佳!强烈推荐闪电侠大佬实战课:《Netty 入门与实战:仿写微信 IM 即时通讯系统》](https://juejin.cn/book/6844733738119593991) Netty实战课相关点位于:Spring-Netty,com/bruis/learnnetty/im包下,有需要的读者可前往查看。 diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" index 79f3bfd..b90dd17 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" @@ -51,7 +51,7 @@ Lock引起的将当前处理器缓存该变量的数据写回到系统内存中 每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是否过期,当处理器发现自己缓存行对于数据的内存地址被修改了,就会将当前缓存行设置为无效。当处理器对这个数据进行修改操作时,会重新从系统内存中读取该数据到处理器缓存中。 -[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTawJOHf-1596181331575)(https://note.youdao.com/yws/api/personal/file/AA87E3ABBEDB4A37B69D8E75B5ED12C1?method=download&shareKey=f9788b07ab72368f3613b2744614eecf)] +![volatile-01](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/JDK/volatile-01.png) 为了实现volatile的内存语义,编译期在生成字节码时会对使用volatile关键字修饰的变量进行处理,在字节码文件里对应位置生成一个Lock前缀指令,Lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成。 @@ -117,12 +117,12 @@ volatile读之后的操作不会被编译器重排序到volatile读之前。 2. 在每个volatile写操作后插入StoreLoad屏障 3. 在每个volatile读前面插入一个LoadLoad屏障 4. 在每个volatile读后面插入一个LoadStore屏障 - -[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1N3KBZj-1596181331583)(https://note.youdao.com/yws/api/personal/file/E11087F8FD5B4673ABD8C58F6F8DA232?method=download&shareKey=cf78d935c04cb11b039399e1d4825b74)] + +![volatile-02](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/JDK/volatile-02.png) - StoreStore屏障可以保证在volatile写之前,所有的普通写操作已经对所有处理器可见,StoreStore屏障保障了在volatile写之前所有的普通写操作已经刷新到主存。 - StoreLoad屏障避免volatile写与下面有可能出现的volatile读/写操作重排。因为编译器无法准确判断一个volatile写后面是否需要插入一个StoreLoad屏障(写之后直接就return了,这时其实没必要加StoreLoad屏障),为了能实现volatile的正确内存语意,JVM采取了保守的策略。在每个volatile写之后或每个volatile读之前加上一个StoreLoad屏障,而大多数场景是一个线程写volatile变量多个线程去读volatile变量,同一时刻读的线程数量其实远大于写的线程数量。选择在volatile写后面加入StoreLoad屏障将大大提升执行效率(上面已经说了StoreLoad屏障的开销是很大的)。 -[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pRcUS5Mm-1596181331589)(https://note.youdao.com/yws/api/personal/file/2A92B2D468A345F6A55C75249A89845A?method=download&shareKey=ac99a6bcd169bf4bcda8b0fbd33e0003)] +![volatile-03](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/JDK/volatile-03.png) - LoadLoad屏障保证了volatile读不会与下面的普通读发生重排 - LoadStore屏障保证了volatile读不回与下面的普通写发生重排。 diff --git a/note/images/JDK/volatile-01.png b/note/images/JDK/volatile-01.png new file mode 100644 index 0000000000000000000000000000000000000000..61eb672bbfddf1b3ded77cba2f2d4f5d2730a356 GIT binary patch literal 129446 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 z zXTyG5fUJ&~%?~eE9|5vHdw!~zTeXCZo54kZ))4|kGsiLeT@*QrTB)~vZI<%@iYv8d z1mJ0P+@Fei(n;%$~TGFx-o2bAgDkaf7@fQelsrBw2STdE+NYoGv#J6)fkr%>x~2%gMXy#6Lg^>@9k9GTKj62Gre zqv><)cNm=R%cG~@k;#ExdU-er9_j0i^nh4ug41* zQI#hZEEk*4BU%!1{4M;ij@|DVn|kGO=g$AuR_?mg_<8!T3@}$p>`Z-oRw%La6{a%p z+gi!iLUWTuvu97Z|HktBlSxZuRSxjhnaXA?I_hX!`UwE~SgC50kyB#^oFven%1C$f z2N<}xY_V+jN-93%eK?tMb%0(vCHyq^6%@o zyarMIXXH8*p%lIpQPH9wApz^GGShWC`0+S{8?G zb%>@dW@6)}Yb3$vj>br48I<1IuSYnGY*#Va-u0jUk^BKuHhcF56<95mIc!RjRxmF( z^LMRy!hMwgtvqVfU+TvW|7HDJ$BKOacB4#FMr@RAvVWG3M+O)t{a>$I|5r3CU4S)+!mT0_0Z;_YxDA09T!cJGjNik^cA1@#n1t{y8m6%|HEm;NINhv(w zY=V#2mGYE*VoMhs^UeIk*3Y-etaOt;e%lqCT4eIb1JN7xR&ce8Ii-w=R-Dir0dhu& z30jRfj;~V_qU$)WQm@igZmd3msh5mMf6|~wJJD%zL>$%}gdH~iGlTKY_Pm;9|^9R4>*aSZe@LP)2QlB)HrDS7@&dZJJYYK#SWOrk^EarW}loP;xzX?Tu7ya z0?YHG>F9%t=edXiB?So{gX_0n(lH2os`CEny?u4?Im=RU26Rc2)VWn^0Ct#cm-d_Ieq5CwgzVFkPaDP0+}N zciaLlDlAqr=2_@J`02*KT=gHBKi`l8!t-w+|EqmC!)s0fWN&yBeE1&XAY|5fKD8Wl zpjeHm#;{sJCx#OXqfG(1&Ylcj*_dY!A8@)KZXnG-c!<8&mFZ7e7v-PM2`MDBa>!WM zo9k&G%WV&0cN>+%Oz8DO6xCg%l)tSn%h&Ff)A=D^f}&ie6$}pYM1#SK8b0cCqwnt6 zaAxs0TEwKB?LFEL#jL)zdKL?weILl9^O8r((Jbq3*-uTB+ z@%AhgCrf``KHK#0)Y(K%U5}!CbexZD5BZBtMf6G(pTQ9>mR`@C>>{|_tE->y);5`31XR4j!w5y5grSP3Ocs#G`d#YNEm!95ov|+uGC8eJglM9!bEPT=85o z9?^UbMh+?^_v^}Hagw=|2ZFA4l`6|vdBE)~

7{CHq-b=gCX=8W7_i)YId`A+mF0 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 QlaUS`Z3C@p4ZG<71vp+LL;wH) literal 0 HcmV?d00001 diff --git a/note/images/JDK/volatile-02.png b/note/images/JDK/volatile-02.png new file mode 100644 index 0000000000000000000000000000000000000000..a28813637252325b36bb040290da28115db00dc4 GIT binary patch literal 84199 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 BuL%GE literal 0 HcmV?d00001 diff --git a/note/images/JDK/volatile-03.png b/note/images/JDK/volatile-03.png new file mode 100644 index 0000000000000000000000000000000000000000..7ace8b9ab6fa87467e5ebc124b4c2f32231f4ae0 GIT binary patch literal 90811 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İ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 L+*7GgvJCxSaFPo0 literal 0 HcmV?d00001 From 85517ab96edd7e1d04285e94de069a35702ee5c9 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 23 Apr 2022 12:44:00 +0800 Subject: [PATCH 64/68] =?UTF-8?q?[F]=20spring=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...50\357\274\210\344\270\212\357\274\211.md" | 26 +++++++++--------- ...50\357\274\210\344\270\213\357\274\211.md" | 4 +-- note/images/spring/spring-01.png | Bin 0 -> 57918 bytes note/images/spring/spring-02.png | Bin 0 -> 19434 bytes note/images/spring/spring-03.jpg | Bin 0 -> 28447 bytes note/images/spring/spring-04.jpg | Bin 0 -> 38826 bytes note/images/spring/spring-05.png | Bin 0 -> 100080 bytes note/images/spring/spring-06.png | Bin 0 -> 81237 bytes note/images/spring/spring-07.jpg | Bin 0 -> 27514 bytes note/images/spring/spring-08.png | Bin 0 -> 160767 bytes note/images/spring/spring-09.png | Bin 0 -> 149766 bytes note/images/spring/spring-10.png | Bin 0 -> 100080 bytes note/images/spring/spring-11.png | Bin 0 -> 81237 bytes note/images/spring/spring-12.jpg | Bin 0 -> 36141 bytes note/images/spring/spring-13.png | Bin 0 -> 97472 bytes note/images/spring/spring-14.jpg | Bin 0 -> 31715 bytes note/images/spring/spring-15.png | Bin 0 -> 80926 bytes 17 files changed, 15 insertions(+), 15 deletions(-) create mode 100644 note/images/spring/spring-01.png create mode 100644 note/images/spring/spring-02.png create mode 100644 note/images/spring/spring-03.jpg create mode 100644 note/images/spring/spring-04.jpg create mode 100644 note/images/spring/spring-05.png create mode 100644 note/images/spring/spring-06.png create mode 100644 note/images/spring/spring-07.jpg create mode 100644 note/images/spring/spring-08.png create mode 100644 note/images/spring/spring-09.png create mode 100644 note/images/spring/spring-10.png create mode 100644 note/images/spring/spring-11.png create mode 100644 note/images/spring/spring-12.jpg create mode 100644 note/images/spring/spring-13.png create mode 100644 note/images/spring/spring-14.jpg create mode 100644 note/images/spring/spring-15.png diff --git "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" index 436b444..248f495 100644 --- "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" +++ "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\212\357\274\211.md" @@ -28,7 +28,7 @@ ApplicationContext bf = new ClassPathXmlApplicationContext("applicationContext.x ### DefaultListableBeanFactory DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册及加载bean的默认实现。下面看看DefaultListableBeanFactory的层次结构图。 -![图片1](https://note.youdao.com/yws/api/personal/file/A91C9C5BB33B48A4B501435C157FFD99?method=download&shareKey=2b9a7ef7fd42d051fec83fe3f5eef7a8) +![spring-01](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-01.png) 从上往下开始介绍各个类以及接口的作用: - AliasRegistry(接口):alias指的是bean的别名,而aliasRegistry定义了对alias的增删改查等操作。 - SimpleAliasRegistry(类):主要使用map作为alias的缓存,并对接口AliasRegistry进行实现。 @@ -48,7 +48,7 @@ DefaultListableBeanFactory是整个bean加载的核心部分,是Spring注册 ### XmlBeanDefinitionReader XML配置文件的读取是Spring中最重要的功能,因为Spring的大部分功能都是以配置作为切入点的,XmlBeanDefinitionReader实现了对资源文件的读取、解析以及注册。先看一下XmlBeanDefinitionReader的层次结构图。 -![图片2](https://note.youdao.com/yws/api/personal/file/477FF4A409A94CBB8CF9A05A16D8F7D4?method=download&shareKey=de7d24b623d4c5bb7e65bb440438e271) +![spring-02](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-02.png) - EnvironmentCapable(接口):定义获取Environment方法,Environment代表了配置文件。 - BeanDefinitionReader(接口):主要定义资源文件读取并转换为BeanDefinition的各个功能。 @@ -96,7 +96,7 @@ Person{name='Bruis', age=23} ** 前方高能 ** -![图片3](https://note.youdao.com/yws/api/personal/file/219238FD61C146C99E137E303D52EA66?method=download&shareKey=d5e5aaa1e9fa782eeb056b89119c3565) +![spring-03](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-03.jpg) 通过在断点debug,跟踪程序运行。 @@ -146,7 +146,7 @@ public void setConfigLocations(String... locations) { 下面我们来重点看看refresh()过程。 -![Image](https://note.youdao.com/yws/api/personal/file/76AE8FEDAFF54B6881C336B056AC5B0A?method=download&shareKey=430f5263180efd8467df6e6434456f3d) +![spring-04](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-04.jpg) 1. AbstractApplicationContext.class ```Java @@ -239,8 +239,8 @@ protected final void refreshBeanFactory() throws BeansException { } ``` 这里先看看上面代码的loadBeanDefinitions()方法运行完后的结果 -![图片](https://note.youdao.com/yws/api/personal/file/59FBCD3CC1B54136A05309EA6B88FEB3?method=download&shareKey=80bdcfcbde0362b73eb633390c5b1042) -![图片](https://note.youdao.com/yws/api/personal/file/E258907852284A6F93A2C305319EBB64?method=download&shareKey=7e1dba96d3b53ca9b6af017552f8fd31) +![spring-05](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-05.png) +![spring-06](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-06.png) 从图中可以知道,loadBeanDefinitions()方法运行完后,在beanFactory变量里面存放着一个ConcurrentHashMap变量,用于存放着person这个KV键值对,Key为person,Value为一个ArrayList的变量,里面存放着person的两个属性:age、name。 那么,person的属性是怎么被封装到beanFactory里面的呢?请看下面的源码解析。 @@ -409,7 +409,7 @@ protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) 下面,继续深入registerBeanDefinitions方法。 -![图片](https://note.youdao.com/yws/api/personal/file/861658D89B0D4B48A7ED56B554CF3028?method=download&shareKey=c3bc974e751495bac74d9ac9ec56cb75) +![spring-07](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-07.jpg) 1. XmlBeanDefinitionReader.class ```Java @@ -636,8 +636,8 @@ public void parsePropertyElement(Element ele, BeanDefinition bd) { } ``` -![Images](https://note.youdao.com/yws/api/personal/file/75CAC9D21AD64BAB89B0D25C8BBE7598?method=download&shareKey=89e73cf46fe18b1b85aecf8d58006f8e) -![Images](https://note.youdao.com/yws/api/personal/file/CF65BB80EB934EBEBA49466CFAB261A0?method=download&shareKey=8b9f0078cf5a3171dfd69d00d9ba55f6) +![spring-08](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-08.png) +![spring-09](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-09.png) 然后,就会一路返回到refresh()方法里的加载bean定义信息的方法——loadBeanDefinitions(),此时beanFactory里面就会存在一个带有KV对的ConcurrentHashMap,而这个beanFactory会存放在Spring容器里面。 ```Java @@ -648,8 +648,8 @@ customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); ``` 再看看DefaultListableBeanFactory里面的内容 -![Images](https://note.youdao.com/yws/api/personal/file/59FBCD3CC1B54136A05309EA6B88FEB3?method=download&shareKey=80bdcfcbde0362b73eb633390c5b1042) -![Images](https://note.youdao.com/yws/api/personal/file/E258907852284A6F93A2C305319EBB64?method=download&shareKey=7e1dba96d3b53ca9b6af017552f8fd31) +![spring-10](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-10.png) +![spring-11](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-11.png) 上面的过程,就已经完成了Spring容器的初始化过程,相信读者也已经对Spring容器的初始化有了一个大致的了解。下面总结一下Spring容器的初始化: - 第一个过程是Resource定位过程。这个Resource定位过程指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一接口。这个定位过程类似于容器寻找数据的过程,就像使用水桶装水先要把水找到一样。 @@ -670,7 +670,7 @@ bean的创建和初始化过程是在refresh方法里的invokeBeanFactoryPostPro - 当容器关闭时,调用Bean的销毁方法 下面先看看创建bean和初始化bean的时序图。 -![Images](https://note.youdao.com/yws/api/personal/file/8B415614A97D45B481925159264C344F?method=download&shareKey=1083828cfcea581b0aa5cae56e3f3090) +![spring-12](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-12.jpg) 1. AbstractApplicationContext.class ```Java @@ -967,7 +967,7 @@ public Object getSingleton(String beanName, ObjectFactory singletonFactory) { ``` 无图无真相: -![Images](https://note.youdao.com/yws/api/personal/file/4C30C0DA143E422FBD27E50AE71AC179?method=download&shareKey=2f4dff65df0e9761ede47d26782dd977) +![spring-13](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-13.png) 5. AbstractAutowireCapableBeanFactory.class ```Java diff --git "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" index 7f8691e..89fdf81 100644 --- "a/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" +++ "b/note/Spring/\346\267\261\345\205\245Spring\346\272\220\347\240\201\347\263\273\345\210\227\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224\346\267\261\345\205\245Spring\345\256\271\345\231\250\357\274\214\351\200\232\350\277\207\346\272\220\347\240\201\351\230\205\350\257\273\345\222\214\346\227\266\345\272\217\345\233\276\346\235\245\345\275\273\345\272\225\345\274\204\346\207\202Spring\345\256\271\345\231\250\357\274\210\344\270\213\357\274\211.md" @@ -79,7 +79,7 @@ SpringIOC容器是如何在Web环境中被加载并起作用的?SpringIOC容 IOC容器的启动过程就是建立Spring上下文的过程,该上下文是与ServletContext相伴而生的,同时也是IOC容器在Web应用环境中的具体表现之一。由ContextLoaderListener启动的上下文为根上下文。在根上下文的基础上,还有一个与Web MVC相关的上下文应用来保存控制器(DispatcherServlet)需要的MVC对象,**作为根上下文的子上下文**,构成一个层次化的上下文体系,这个与Web MVC相关的上下文——WebApplicationContext。在Web容器中启动Spring应用程序时,首先建立根上下文,然后建立这个上下文体系,这个上下文体系的建立是由ContextLoader来完成的。简单点说,ContextLoaderListener的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。 先看看Web程序启动到SpringIOC容器创建和初始化的整个过程。 -![image](https://note.youdao.com/yws/api/personal/file/9755412D703C4DE287B26AF2396E57BD?method=download&shareKey=52783ceb34f405ad47140c22da34275e) +![spring-14](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-14.jpg) 结合着时序图,再去调试源码,思路会清晰很多。 @@ -272,7 +272,7 @@ protected Class determineContextClass(ServletContext servletContext) { ``` 下面看看默认的IOC容器是什么。有图有真相: -![image](https://note.youdao.com/yws/api/personal/file/AB1007BC2A7549D7898417D6231AE4E3?method=download&shareKey=e851d344aedd461f319dba3b8e2c6fe8) +![spring-15](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/spring/spring-15.jpg) ```Java protected void configureAndRefreshWebApplicationContext(ConfigurableWebApplicationContext wac, ServletContext sc) { diff --git a/note/images/spring/spring-01.png b/note/images/spring/spring-01.png new file mode 100644 index 0000000000000000000000000000000000000000..26d87c9bcf18274fd47edd729424b2905104889b GIT binary patch literal 57918 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 literal 0 HcmV?d00001 diff --git a/note/images/spring/spring-02.png b/note/images/spring/spring-02.png new file mode 100644 index 0000000000000000000000000000000000000000..e309335392c5f912d7d8d1f7915e647b42ed05bd GIT binary patch literal 19434 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 VuYSx3cD$k#WdAQ2P36nr{{b&%;( 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%0AG)H9CC(GTaQt7ES(t91Lp4gem>!T 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

&_WLGDs+<4gC`{ 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

S9+4>r~CWiL?suV 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

G%Ie_u7awCl{goI>cG5JNQD*)%2SkWJ4D|x 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˼ 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%0AG)H9CC(GTaQt7ES(t91Lp4gem>!T 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

&_WLGDs+<4gC`{ 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

S9+4>r~CWiL?suV z)w(yfql%=J9>s6G7&g1P+7*}I!A~gBW(7A403k_)K+CPq=~H^Hj>*`6N>udSw+QsQCj*=!OQmVo0Yvj zG7g(L_E|vXpJnLE4rE;_yxpNtGif?j!Cn*4 zWIZCJ{ZzG`eT+hiKxVX_XHFMB3vxO1o3@%Wkn2?DR7Ji2Y$2q5Z4d0*Vp8rr+q2^1 zH67+pXBXesHQk$%v78EB3&f^IrBod7Jf5g316W=3Q@S$xyZkt+J(469hy_ljg$!ly zMDo+B+SCh2nM42;tm`sP7S`kF=$D_rZ!A-MTd!_-jC9T zhd#PlA_FImF2zKOlYq)AmXm`IxVKWimh3E{o7kM9U(}pMjCCxp{vj=TTkEQ*yMmP~ zM6{OP97yp>gXzS#X>;4g8PR!}Ba-AQEZk(4@Au0e-UI1kvrLH)y zfLQ2vm+J7$V;}wIRUFsgndo_vAwOLH#mmRC{GmV5bQdXVKb2C6)pdo@(;ihd&Q7jb zK^dTN(JVay%%m7l$ps$Jh7* z0>yi^3xoGaMo~PeMp0m{wEC^eG}4;SW^$eV!6Z4SqyAOuJXcdTwd~VIEZGtpW(icO zGkCUgeiw8^@^hA{a{!kQMon*QJ#+_EXTKD*=}mwnkAz7dM99cV_v;cb>?NXrfI*e9 z@@;DTo+_@dDbar0c{mln;k=p+Cg^}-zS1fwZMR8shdQ{c9?ffYlp*)hom$R;{E>?E zNstLd@l!!bNxZ#XLcbGFaJMhiL0&4KF8pr3);c6mn*S0r^y|2Vp!j-aVXU>e_zf6; z{Tt~XU+`*y@{I8sZBe}-?o^>e5sMF=+h`=Nt=&{7mKnyZlFUJLm2!-Gx{;p~gZ}JF zdl&(wJKYKD_F81?#6v~!V8nIjx2@4P;Hp^Q6yyMhqs_2J+nGBQVz~EHgu&`>XbJtF z8ciK#XomSBMD=1#mn`^}DsEik(1zrT&M32{pQU?5NJiHoHei?bUd^j8{t`2N=h@JG zdI}u}0JGLR+xIISt%kuB12ti+5wPNFc~y)bkzEu~I^$Yjoebc|m5AW?M{jysI;C5p zl8BbY;}Fe{tV+XZK#5x_fi1rvCIZ0_EXl%1-eNP~-HB zf`3oWvW^zhW9~qnx3>0{WogpEz1jHg%!K_1N#T}X@M;$;0cjR)xU7+j3^EIN#biqG zT_qc=nc1+f;`IB|y)>ZxO;RA{tPjTeVUu)ArYo6ty0s?}#>i(#y7}+OC*LpRZ$K0* z4dE`J@eU~|Geo!j^J=&M@Bff55QFkxZ^j;QdKD}&=3r@2ogx@l*;%wdV+He^Xe#tR z8&G0K4Q9d^llt}T^Px--r<VLN;ufuq)C1l`5n33)-qFK_+xk z+9T8&H>TBz`23e~JfU&O>B-(9GRdtHdrV^O$kd<*nbCjF8vLAx7}jhpYc@286i$__ z@gDI%11-5>k{`%J$rf57aOwhE- z{<9sefRHuW%_1rcSz`ekb0e*e`|4a))7|#}m_DN#x!*T73IU~a-vRSB$DGwfgq0St z6PF}?;!p3&iv^|vblKyx+i|rq43?aIy^B~J)uH{9^cxH1{)<~w zfoH$;PGEAQqesp?Pdgzfg)oyCM}MxDRDgefAb7f~!B5x)Ooe0U+8d_e@kIw%&F$@z zF2pvx0@(m&Y)hbdWkzfAJHl*Voi9{dI~(Ip+8={TXh_IH`Eny6>?D?Og0m50jEJdB zQq}hIO0^1ScWFdPW4yJ~4IcYj6DQBR=3V_FHCL>K7QiSBk>a`|C~67@|P(R-=G5;8woO4HxV#cG00@_0lT(Wlic@@Z|+7W7GlpInOQ_~Ihj{a zlbm7jvT6%Yo&H0l5N`KV^_}dXYnX+WI=T|+0AYw-(c<(FhMaX&?7c0vA`KE;Q~LZk z_vyPzR`uhYUyFl2ND-Qrml2RJj=4;8#`()u%~nLzPu%%e!Kjlxl|*a%45A32d7gH_G5|1YRauA z^t)^VpT7$(25Z@j#dYr>{K##WK-SIjO5CB>%s`S2gSvlg6aTzMR6x0*I^q;L#_tet zrWvmRlKZ@_7A(pGbyU28QTTlx=8=r0ykt8$w2tIIl_Q(VAZw9SlzYw^v)0E z*^-zs*$pjiPsPv1?_wJn%13+qqeK@W*>8RcR4u||N z?gMUqFC1|48zPW{MVfu3T%X6Sy)zwE9+77 zc8NcU=~c=*@d^0$-9hFrBhL|od%+X=c&FA4TT$R-PNSI4;m zj~U&NKpBIwV{wJDSne+35%tnJ>%0PL#1%#%i9%Z|^IH4t6J(}bli_?Nw^2!s?QZ`< zTExB`AN#Bu&q#hhp0V+Vma>4JIr7~U2d{F35@p%>=HBVa2xQtb1zbzOuQ$4!NVazm zvybW(P-$Rdr|9Tdl^WadwR%pdav8$F3LB_gh7+s8N;NliSgY?(^j6s}ZxK(Adm~0O zX$~oAKU+~dJU?_cw8Z<4oabcNRD*qI(w3mzG$xmVIG0XpzC1-dL_ymE2!uuhO z9RgUgC-mgeos!u{$Ad}0@YofL!TKepDu;jZLlX_C+7RJxE7}`>LVrF92EF|AEr~ek z4uw5QrQSejPiRL!1H1o)xIl*SKYtXE4?sVPfsq6`-v9LGTr`TT7m|M)6Ca&KlHX?~ z-MtNAv~uKp>4xlH{Z&y$-v5PKkI?n@zc?&8UIS^qY(bH}7G4@EeaVjaZ`^jqloEQ< z5ox{WUP-7zaH$=Ptm=^Wd%xoIR)`MsD8#Y79)j66r^PK!dR$1}FPFK!+ii>dqx%;! zCYNp_(P(WCj%g{J@FiaH&`6Q-jmvz{R9plQPpP2qc|vIt{Ya*hzK-i2klFmKJ$ggE zSndu=jPXSCU%>R!2nYVb?>6{)8;#I1G-!JUTp`^-ulEdA(3RbuK0zp3kb}#L>Y|oH zVnEBRLq&c1HCc7OYW2bro`H>q4ue%%GgvN7^lp*omVI&T=>SsjCQ&;~xT@dCrE|cE z<5EF&W%3n7U}|KD{LmezD#IsaW(cjn)cxJN5vHK}J?O;NOGMBRB7}Sx_5_jtc8gZ0 z9z>>*8#SGXBRT}XO9iYk_a-ok$;P8%CPlNX1Y36S^Y2Fxm}0~Xu9~%e!C@L+AdqmT z)?M&kD4Ab=?FZQlyREl}VqMbkX{xAai z6!gPkfrJL-mmOJFnymg?S43^!zzP&T?6j6tbLWN!OX5Dp*_9+Vga(!N+#$)N5SHb5 z6InaY{q|+iWF+I?{i!8YG7PPkUBp6!{H?T%90t?1)t#rG?qK$yI%9zHxl`r!-Si6e zOQx)^M;5(AQ3DC~PFL3{`NvE8+6F+wk;rA1hS9{tmqsG{!Z{UC_bbjkSect~u^1Uj$Rj>!Vqi2qA5FjDbDJ%4%r#@Gd0Lto`wW zgD0AM8lfp}*vR!(uWR~LWbS@T83HaO#hufjz}{5Rb6$HcL-F{ZfrDcv!n_BmRx#^; z26KHN2oHu1j%Cp;Qu;R=_;eGSwV#{OrULxWS4N@!x#;-x_M>ORk_N@QZ>9+bQXLjF zrg0!lp;+gx~|2$LZc|I zljsLH@;s+xJ!f%4-7d(T+dn>; zbUryHNYH_hE?OupI;;Fk{(#K%^8j+Nme*d(tp!U+o=N2#Dv?tN_E?W0Q(7MZzr4g zUjdRnK@a-N2#6AKbO^ziuWPAAz`a#6v1#M+zZy7Db%+dowUs4Z`Ld^GjG}7o0*6x4 zE2I$pfV?)y&$3dI%tlx7v5XZY^B)0(od>`y=Ps1t#K1|4@?+G8ld=k@Boal;=OQ&X zrI9gE9c5P~ z*uAl1{dWc;4}z>8;0hr72efI6_u|{ho{>|k&hg*aM4`LAeDMSi=7n7MfNuM0Gk8{MHV|S`N7Vbxvqkx4DkE~JLv{q{3m~tn!{{6L4myO|r;;Wwkr?H* z{D>K+&RI|Q{o6@$%J|42EQo(p2-<QnB^)>s7`tp zOAsU{Vy|J36ZL&X9DMzO>0+Rx@^>FH;j#8mt2gETnb6xRDQ_@?X8#Zx;*Zrk`kCw8 z(~WEElmvtIvB;BH``+>^? z&HQdWk1InQD=iOo)kP2O#K&s_ErfIETDsiM@2U(oddpO4yGA&Ocp{&^J#nStP`>X| znB~Cc^(h;&UH3)hGw9`i!1nQBygliA&2N*Z|fN(#*(n!;sEsx?!GTepyAal zM_=?QFgX!@GvZV!Us2hpP2m5{qsnRbS2#f(4;T@q9D51Hr=0Ay1@RYCM)y|@(#VW> zI~*)yn;SKu$<#AumeF3^D@kQ*(DE_T|K)iHl9c&BT81T}#RK{e$b9_2NtXYwzA5j% z4oXap4#sAegi&FPEnCIL3$uu+x0q*K+ZRRD#`(~FO2-ie9nU7OB_<{&_84nTCvvf$t?V zI|ny6HzmD*2tTJVD;GECZ*$)8nweWzT3Nfey19FJdU*$Z2o4GT7#1F%@F_7V`EyF@ z*PPtE{DQ)w;;QPJ+B$H3Lt{s0S9ecuU;n`P#N^cU%#Yc*)wT7F&8_X9JG&>RXXh7} zSJyYUzsUs$K===_{w>)b@S zo@88hWjh)Tm+CRTvGdpy0$T1>x|82T`-fzIPq4uMEy?~Z*#DAi4uF9G2OB&DY=9Wx ziVot%M^tKWDn8T{5D70qbz$Tk?lDjQ2*|RVdAJ~a1Q5!kJpw2~p-l>pfE<$Mf;Gbk zy3j5U-f06WeO^W6VK(2GI@I^`TykZb_xHR}Co`FbT@>HIw3fUY-&0_Eh)I^bv55+4u-({rU)4 z`}zCRy#dz>3dQVeuC6hiT_>AlUGh_OpOnKlYimnZgzq>J;>FGNwgXYdYk4v$_n;Ip zT?8|ZR$#t4TY_ZvW{!TcHwkjsaRJ880-Xq>C=S*_z=|6^!iyV<;NN%YAA9)I^-&i| zDU|3WCiEh>+N;dgt~@7Wgio4@)*t_QN&})>U*A5XAAMJXm5a6D`#2L5JD~Jf z1WhlrOn=jjEy)(cPBo`MX>I2AOySJvTnkzU+3*JaZub0sF6mK53Okit>y8+nN3r_c z3AtsgEisX%G*7XL(|tMsBgx2|-q1$RavNM}HJ#AMW5Oz>dRDjgaary8 z+GUxcRFkxPDhiA^gCD|BKIbybIS&naJ31;dgPvU+7F4D1nEPDDI)&5gVT2!4@RS#4fAI8_4I#O^-9L5^G1zkWzGb(3wBS@tD6I zUq9FaMtE+COE!i8F7WBp#~%S3gm#Yry>4JG``2&=0Ia~Hr^VURJWR&d#8hf<#5*cG zqljCJ)hRy$#OEvScG;k;5u?|)6OVws71+WnD7RQkT%3yOEK^z=+48ZP%0_3#;kIu` zf$MyU=qPt@Nup(;_}B7f>^63_!k++X3HfFk^-@K;&!>~MRQ0$Wu-FGq3Cu9lvExOG zZXF_;6-smmF_Ko1Mv|^xx;KhUHM__AKTYb9f!7Ok9MDP}5y)LiHk^iu)RnjhDbL)B zegyn(2>&pk_}}k!JXV%N2~>ad=ZdsdMMHf&YZ{j1rD7XWU)fdGq1^V497#lbADFCR z6`2%Vk8dq44Sm7g@0pZ~^zbS!^;m7#>)}wJs@Qx4U|>%#S$O@moKe^1cPe%D*Abus z15%;H>It$zij|dTvrh)vinc3+O-)h{xc6E#-ZOT;^DFe)c?6(dr>qC-^1sROBK=@C zj|oN)puc&WR0plA7pZuFX%DV%zgGZ%)CWUlZVys2;1i5S*0?8Z_q3;-Uc&BYi(V?9 zR3~aAt~f?G@d^=YfmJhZc4})f$s*+q=5y+|DD%VwFMX3$s6&h}f@~-pyUb)HP|E1a zAmz!(WuU#X7|FkW>R`pan^&o>O{03e?!xTCwfEsE@xi`@|I4>pmR3qH^e9`i5Tb*) zb!~3TDnjgB(J!jwr|&wd^yY=J8=Hlw0VVNWq7o=nY{JF~?h&9F!&4I7ynjeL`F>XH z0l^+}R0z3l6#eD+l=7+PBS1T}GwD)SB;bo{6lcG0@C2*9!O0xHy9%u#v+y%Gqgmne zVkpxzPvT6ozK0br7;R!+Ih8o4*$n(mQ{76qPq@7qJKaBOnZMY2ypl=Xhwm@ckAYvY zuk@5sMTtcA>_agN$8#nUD-S*v?~&|*Fq)fpH*yG$_DbFw5r!Z6JSaHFYp$23eJ~~0 ze4Hz1mGY5a(LNQ4Nq*Va$rw;`k`Vc+_PfXUw##47oeXeH?RlzAU67)nD+RS6R~Jpf zuq#`Q9H~1Tu>o)TS>KNGwHnJ5G!g${UvPh-TJI&KVKOr56pjf{g8g~LA26CENZ}`4 z47sQR6^e*e7@ms23-#CphbZV|TObxWe;{+aEA_LUQqP1+YGxkx-vAFJ<0Kxz6)&GdbQ< ztFLazm~*p~97K#FEjJf;9FQQx5hLlGatrfCTC0;|b*OM{;P#2wDPt|qt+!kvdzZMu zJV44%L+hj3xOfA7vJQ6GQ-`R1Z~bKz{o4I2+{=WX$(prE#4H`?Usw)R4_tjpJP+sq zlq`{vhz*FVpDLKrUG(xp*9IZT_xx2!J&Ml{kv@5x&3EUGoW3Rt9vY{yi~1%uE$ZQo z;e0y_gKCd}1cEyd5R`IY_zPJ26*xJ1_jZx1_9~y`4Y#zU2-43+6~+-Ao@r%2`;Ocu!CNuTRz;|pJGM@G8HUR*^nJpv4@-WOE)Re^4i z7eUJ^pcB_$j@`B?SdzPRMIKr!OZ!27tJlnO^$Aj6$|&aSX3ruG-f?2s5t$pYcSSl{ zEqYez^Yx}C{B+m#Q7Brpa^Ko@;7(E1Hf8K`Xq&Hf#KVZ(&JeGKHt)Bd7%JT8UHr~Q z{%)o>Un+l0{gPKR4L;o=NOs(d$`j3D6r86AV`4B&D^y&FFIcifl1r=po$8>>aGcd>E4+rd|G$x?a zS2LR9{L!>gN>6SY;w6VT=Rdg#d1cdATrA&zI2S?xi-lJq`t1bTQle)`Krnsl*0Onj zH4WyHi=nl?yuKNef>%E~O;|p18sQlY=P|??UTL5Udduc|`+?70SL6)nHA;ZTZbI#d zx)``%8ts!21P1NhR_^`TjPWuEUVl)1is@MVE1MxFp5uRGL_K2A<<|8@(Y1}Hoku5$LFox<#_6;`3f{&`GsJ*{)M}Lb59N=5 z#h4osJMR6iFH?iCMgRO0bYXvlx~e`=CEQ+(2r(#VDj@F1_q9f%d$Z#HwWIy{Pv8mW!$8*5 z8D2H9xrkSKaqLF^MJqkx^pm)<%6qraCWP<%f2J%>W3W66x-}_Kj_)D1)sw6|`uh7S zN7SEcjGD8m`93Qc6}GJd?5;=~m!mH*Nr5%hz%Qc5EEly=8;(|2WW*dvXJDdr+w_mo z>oIHFp>}rL4ukjKMc81d3gtd!@t4K>yM^2V{@5&Cac$G3o1f`aFsBWyU2JB27d!Hm zj%H|y7QxBLu}Ov#ONrf?O<3B;;ds4+SFqrt>hzu-?`kdnr}<{yRs0R}xb)52m$s3~ zJ9~VMcM$CPi+es1*}t0HJjXLJ6;Ffj`QY^=K(20aUzZkyQheJGjHQhhlHL|LjW~Nx z89wu@?h;Jn)=ZAo_KWELwo^PN`@%FP(xEHJapTYc0mHSpuFi0Jc`JCra1V59QT%5j zw(n-}o?wFSX~6^$`J@h*rIMR30>!VQ)rHfr?q9JxHas2Hm=dMk6Z9piu_~BrImeY^ zNv9+7N~%DA(;c#(j7}CrgFxk^aC>)&F19!5GWKU9ct-imGeglx)`c!9(=C6_Gh<}B zy+4+BC9C;EiNBnA8&NL`)zqFL<(`u-s{@fW!8E6WBQ^^Q%h%X?PGkw2Z)>FYX#?CeF31 zfq@jBmWrN&9ebz{agK9dvar8Xy6O6~KNM2YkXCnAHiXVt!eD#6D1#-WUaR)z5fFp; z2=IbA<}{i=e{-OIE%5ojaw*w0-_PfX-O%g~DqrN#r@0U9Z)whhufy8fdXNFOB66;My-mp#FEwM%!%Bv;%Z0fuPizvH!G7?#*d^<^TjZYQMd|_U)2u>E^ zy9NmR{&jq3=iK=viS(py`KRX=;MP}jILb}W=jj<`WZ)K_s!Z3}``VC~R_c=Ds;8;i z$TX)8P*U|HiXSX=4OS<7XW|h3WDBVpTN4h)*N3bZ^fuCVAmcug5IWge-&xT**Bsno6B0bY2lU z>9mvYgSDOlYW!ug%j4fA#tVPD0btgr+s#RA1AZJkgkMl%8}8LzHNHt2`(fB`hnJPV zz@W!uEJFu1c1B(>NuQ{8xZQEMhMxuLgI2?iL@BO~AN1{Q>D=P6F|rJlzM3I^J7a$Y zG}{dUUCgRn(x+zc>2vg~aScUk0=*7e`#GYw)OC#8-Py(5>kN|2&H06MAuW8b42oH-rU~5Zm7#|em4J>Tet!MAP!>oV(tF46WjpY7S>UuI z$X}#ww8dsjYQ|CE#us<>#_s%Q@Tb^EfO+@EoPvWJGiTT5o-t~6XO15UK+UAsA9J#H z_G#3S?<9GDhrLO^s#VtOjAJ2MQo$7qN-0@4@(til9fp*Nn37 z$Sg4*&J|Fa;)QrKfc4EOo6Q*t1@U5s1c{&b9|0Epm$?(Z^tn6OM7G_>{vCE*IJsMn)J|iC}5C%7NkI<&K28vXY%DbhkPMDI9}0#V60{G};^~t!M*hX)0IL z=aT)Kc}f=aM*Z?rNOoz%S2fqvZqgc@S#|rQ^u;$RT0`$`SWG4Si2L=&{NqqNY7= zuX=cTJUiEES@?d6{_`%PQJ+%{+mK%2%1T_gSj8Ah=EcHX?X}Np1p68jn$jL$<-_L2 zxE=U?W%;&{Ry3eTpoi1iMhxNFy}g`dS((wImRGUSi_#Vas*}GZs(Uu(q*LwtdfW)C zMi-LHCRT%-dPz;oB`cshfJJGAfr7|E7M;E(FG_9o4QS2c_O5V#QCnZaiX|b}+&tc{ ziTA)cmweH~o!jBT;}H;gFL?=tlrIN338SrE8}QZEHCDR@3i(ZY2X{BPM!rM%yx>6P zh;F*x!g3YhD^g@l=mFMDXa=W=PL}ux_KLQ_heqkq001jN`uKQy7(x)#pEKT{QUk(w zmk!lmB`Gk?9=yqR0egl`^1`*z)04Rt+BIXY&MT^t%a9Ty4dKc=VcF-IhAj&XJhv-p za_R#h^k$WZhXXntP=2x?eoG_kWzBxbT_1UG?~L^bXxT*}7b(7s%lTocYwP_!4JFQo zl#AJC_M1)wAG7?fe97cnBzc&}KxYNr&+OA^EE2o_P$ssRaPtH#j)bQoj-);bnuHPP zhS;E=Hk!NnInb|cx7RQlR7w|6$vrmTPCNchZe8`THw$2zdgg%a*`(WYLWW+taQJPe zjJ9Rmn7xv`j zv|4!R+Egam!NR$xlwua`Lu3-Q(UHjXe9q$~N(S`2405py1&EYFD)!V8j|rn{nH;b@ z&B=|YfuCz-Gl(kY_6NBJO7{_-lcORc)Muc;C#YSg6zzgAFZ>*2!h1$er``qwr&4Vk zO&MQRa)X#ouH>i!l@0}VTq{E6G!tH=R6PRJ>%kL(sa$%9cFh}@ZsA&dRJ{KWk5 znQWacoTubEZlnh?xB9QASZFgmA_ZUNCZbp3;h>FZbF7%A+AV?~K!#c8TQFiCg8lr& zyd25|K3=zU@7ddz_i^GhOdxYgW)y!xrBjcH0dSU);dIHlF0vrVDFhm{n{Ccnoh~1J znK*vqOujw)*{z5UXCad0r1L^*pZ(jMs$<76BA5yHpc*Gq9f zt&!aEK=OlHZ^@ePShk?`bL>L%JA%cJLNZ-yv9e1eUK<(gLg!}>cDGMN-y7yV0@S#= z-ZP*0wI*cix98379QhT_$;i$(f8Tle2+*7jW%S_ytkYQ8i+7&zMK#Oj@3qosUod^7 zoiOO^tBxKstEMoLVn}r%(D33n?(-9AD)L3MbNVWkuWut*+dG>V2n2@FMht=3)APU6 zp!#f7#k=(L69rzaPJMZpF5teMF00m%Q+pfy2F@PQ8qf3wm`vqTQ=t~AHpXZF2-t)w zt<=qccP(s|@k_bw)KqIbdr(jm* z5pXP4^3(z5{(HOtG^13s`?TO?H2F6pDBh?z+BZuC_2YWvA^CKuI zFIrbDJjuygFt~P~z(7AglLdN*DPjK^(UxcfPF!Aq4Ef#BQpt5pcLp1H+?A=GyGcak zsFqZ&@6IEYoK9?ao_$l(57m2}^2eu3z@Oh~Pvz-$!t%5}%4HJ{I;0Wz(YlhwJ82!YQfeCx zdynsWr*;;WN~r|$g{hurA+X&w7a0LWb>76ho}OqHFv;EZu6=-{juw3$8skun*vxOk zGcq!nOx33>ScmFEurFXXZ%gHSvkBoxH*j@j?V=S$Cer%i%@-2A#293zUj8uev(bHDmCM)(%P*~bY+xmEF>J~P076MV()I}e~v z+t(1oJt(E~BA$xeI}Jjp6b@*n5%g10bN5${4_?GX=GzPm?GGyUs_6zDd?6L&eUBIq&HZ9$FThCc=|I$k*?;)u7|a%E)^o zfqrXRZz-O=vasa8k)q%T%5c$>{UAzfLvnE#65pR|5G6HwXI2);TD7yAGIz=m*E7+! zsU;M`rH^vYyok-R-dYca)QuOMwGI~!l6dhUQ*{UWclStEk|w%D3u%b(p!>zM;aopk z)Sol3tdxxAL1}FcJ2J1cTKxL5!9skLf`3&UQR4{fTFJ)7hWK7W05Vx>Z;?7Y+*S3E zLfdzGRf)-px9$>ohoSkR=>#e7J5RfVP3cc9Z?_skHW!w%=57KRQul&XDFV1q{vIqZ zfR-#u#KB?h-~sihGNdWBjd4Mdqz79+!Mhwiq@T=!)MYA|CHdmP>pi)|p2Y(Q7T8W< zNe*&V6qMn0)ayhid@FAAu|_6Wp=BISi|Sw zx^LQPuXPB9O2CKr?VBIQi|B zTU=q@sOS>f@twBzY*~b464t04Eg?=fx9#lGtK#<4S)r|76H|GUuLYle<$l=l97#qpZf5A!h+-9pKL?Pk)l% z{s?%^1i3PS%9KsXiEYq%K=(m?-xn|5RocU%8BbC{w?&Y>HRT7?DTZd2ubo+omJy~{ zneL`sUE@N;7$1`9!WQF|^&S`xGoi%}x7V<6uq2Ot1l-{8@m|La(omxfTC*wZjnVW*@qJnNb0ejw3nJ2l zlPrE%NtB45?-$oBOLNgNx97h`F1|L2wyj(!1X`aCw*kn`S5!P;zPF*ZL!q8_-$YA? zK0Bdmskv#-tnjyaK0uZQF%8uP&xmJ5?}XH3LIO|Z+*|6?D%aiuEO zi%2+nMRO!?eGrp#>yn@v(io!{Ex<#X<|;*A=oAZdLADn)e#VQ0t{4Q$ytqwezgCb6 zgsxpOQCI0z3s>HZyt6Qy8{M@3K@=I-?(FQfG3l)p#LYsoJH0h9{f;G<1*tOW(CPz6 z9cLkVpUP=;Mq=ljui|96@arT6(J1Gb3eluSUxtpoKH~14_2)!H+Z*le?fBDTF*Q>y z@f=pZ(;SAFqWW^weqUJ85Z(Qk=pN4i`u_ zQD6vBe%H#dd;0h~WJ0cC!i^ME*Bm#us6c|6Z`q>_*W|fEM(`GkpZ1y3`xqEwFE+3unpiXXP#&XOB{AT~_@_&Vc&nYu%<0po=vv>yOiD=O&k$hplbmtp-XI z&(kygZ#IK1Qm-2tkX0Tc3V@k)m{oYH3U9konrH)t?J8nwDzkRI%Z6JHz?XLY zHT5-d&xW_nB)Q%yC^w$tn~b2%|RWn2lXN9 z{SKOr6afa%eQP5lH~d=$!5D5Q<#E(Q0IA&R5Xju!oK${P)g}ED%NdJfykS_aSFo($ zt8Hf^>Sa`JOVn=?Lg&_V}(;su2-2#^%IBLP0h8LR;JC6jCCu$mF&2F zNv5o zP8YAu-c4z?&$#LR^%Ybb2>yPazuPcs->sHbHxf= zxy!4V{5L z0@$v{9!d&8qYo7iP{Wgd1Y8gFg`l7V&=HImjiUTd_qrG`R*n0rWGUv$mjLIh1r_iH zsVk#j84diPkBjR&Rq*(5_{5ilOtox@oJQCR)&~_%`zcbFHGmvUcOt zy?{p{OTjEF!JQ&7!V6$GutWTb+m=(}rcdA})7UPP>*L^+p?0L;I#&9!_8@b(c`udUlS~k1kJR0`Akv`8(n!DwNUK6{lt(B$*il!p zv*+G-(shr)imNbK+JU~Pjvj%^LhmF-=@F25 zXLxrHS(p8FGX0k8@PF)Ps|2r@Ed-m8ZAh)c|G~%nQNXu~K2|Pn#t_Pf> z9k6__pUvSKKMcYJ z1iBcENk0YNL_-P38144fd`SG_4T4#3&$>Bs=Sq1=jzcTXI(ov|&7D56~uHPx73 zFanEJ?5IxIA8zF3#qd`h`<3P8CmQ>z7+>ldls)9wetkwer}Lv{c*_W;;633cvPbcG z$^<)Au7`7$Wd#W0bp7%#I*rk2BjZq6t`q|Ion`=9MJn=^69-UD(&?)`sK=u&2WDSebm(}+*gq5>aZ>W7BiefEA?kwi3ylrH!}^b@KPpuAi}iP9 zmV~#)HY&P2lbFvkUM9PmMp_h(PEgmsx^~Em5(B~(+J}hObtI*ll~q4)_9<2*c5tl&TH46z)kvUn9)Hi5P1iM9T{n{Wt;)Z>`Am63H3ez z~#CRMiW|tQUc53G@Kei^QAY+e5%$_vZf$awK8I1hD3{O@=`X&b0Jhn zZh`Ao1Ly#^!+!0cIUe(o+1O`(bMkro2wtF&m6p}p$|I^Qvz?4k;!&QRPb%BL<=jzu zA3cDy_@ks=C#y7#UA*+w$cHJtWSrOWexJRN$a(Qj?-x6xo%PN#e!z#`Kfe@fh9xts z(p5p*6V#y-HXI~3c~=gn_sd+Qe39$sPCY&|IVzH4%eOmF@e568<0BxApJ2?@j;}rA z#YA~6f5qygd1I652h8=M4eCN;od5(xH<2P(cBM&>%rRZyF5y_z>pea#b1(6Pq4)1? z(>E}4GG8D5%(l8_tEYfO+zn*@9`5{3{b8ncaq}Om^$X7zK{tc6$|UPwT~T{Hmeb%H`|VLXdU$BS3Tpa{UC>F|wDXhGz#pj{yG)D8Amwq0rX{e5pGFB&Jr< z!cNXC3$P;`Jpw&NuEwpk{61PfOp|g1{}W043sL;1&tHwNdM#d9qc+fylqlW%SQ?-p zjrSJrZx%$g7iW}1$TOIuAnT;BDF~lW+uiH!eeTq2eg&w1bqt4-&zhUycoV1P;1sw3 zh2$xyFdFa5^I=pm{7b2Q|68q55zo*wlR_SBGWDtCf3VgKM?76;B;wVdr&$c^-4n+d z`#os>t2X`XJGgBM;YUF1J?P>Pa*L~pl>(y)fMU0YnYYi%jwnEV@5OGf3?I-+P+-yg z*s{zA4;VwB6=e9ZdYjG#eZEUT(tPE;l~bT-G~F>pa);^_*hw9J9sZ=3r%l`!u7c5$XnZU$MKcQjx=&&!XzON_EoQ7Trf+uW8@U zLhXVPGpfw=?M>o!qLNg){2Y^+LrlICL!S*e)FiPrUc2qJq*urV{a1%Jf z^~^4-{V#Y^Z?PuU=cTi5gmFyhIvWZRj z)`Kc8_T{@kr}PyIe8P{epqiHM?M(1!2&rNk7x=2}a0E2Bb1nC-ie$;YaRidFNM7d$`gEC@SGPGbS1dU zzexy*lkk``Sa5t$3s^>pYhP!c683v%Wt1?R=DfA~+@+|WE>ezICn(u-9v)h_jMa)bS3fYHj10>!)W5h;8|w5aWn0p@)Q= zl#DbrU;N1k?3FBWf3*0VAjm0F_#B8zIGVhQ!yM?h!T2~*sP}p&uvpt3mT0!?V@Rz1 z5V*8$70TG$3YsyKtc3iDvGJW*q*muDtLb4IW0%xPBbhx^dr~ zdrvRZX#>g@nKP5Hr=f~I2_dOl zZg!e*1&gEj!wcx<9?gZgLX<-{*pW7|8XvbY`#KDaxyyVNa+eJJlF&mry<(o32TIGh zj$B}=zofA-MVKpuMVxK&n3`UnqMM&e*Ti+xMmd_wI1=!v&UU0@xM=V|(DfBp-{t=p z={Y($5Y%HpHP$h6U_bSdrH$x)QIUyGHGOb_TK>wZo!glio|Qee|C!!4G}WTuc)eA; z4hsUhhbLVovvPkc>-y?Uw=Y~>!j5Z*sDCroWHzzW(OF`Y)Fr%uEsVu($%R>qIqpUq z=%WypM>_d!nWX3SxoGRPu%>D26Zh!#!O29kxV(5?8^3m)^49O1d>HGWBk8MVi2hD(I%Ec5uw@|b5kV5TCkDB!Uc1g8$SO8@+6&(g=2uHN z$_X`JNA?cUeXjEW5Ftb}z&4=3(vJln0s4@k@1Z@Z`iuM1?h)>%c|{Fpv^6Qzy~BwX zv!}7@fv9}~M9io-KRm&5ldR9d;j2Sc_r+^yzM+l{4DnTn=0su)Lal1C?Bc`Y!uYH) zgmK8(4jb||EHz_gN$qFyG)0jp9Y~zmk!1dYsz0HajpOSR`=(PlX|E?Xx#rtgcomvM z?#3Oc3R$}VSq}>dK?#tHDQFVPgWupqg9Q{fio%CJO*vj6>8DW zFA_}Y7O68elkdlh47Hn$1?*m9hm4%N_1OoJg%WKa&hYrH?5vG*o7L9eN%urq$H`K( zWm=lWqwE6FGiitf?iM}E_DBV0x=8Y~If#4%IQ{>&2GhLiz7%&QUh3CsnDe z-r2R;8jFiuQ|A@tijQ~9`~T?j_c@lPqWeR>*RQ!>e>{eN87mOOO!yyun#!AiAuppQ zJwB0#V%>jdu>32N<&@b1me!FP9zd^?zN*9j@0r*@{yq#+*6n|oRMpA1 zRMDIW$b$|40Vok`U@qKmZruN*c=g7JZHQ4m_*6hYOa&C+@CZrfux!78;~%94-@~-? z^K00Sp+(U7i&AnfsAL`JVo~h;xdA5VDs;m!(O?PRFzS94gfU7g+>JCbo z=*!`XiWTOt30*q}vN z4rJ5~e}&1+Qjb|G_Z!XeKk6fCP85#KzyrsHtIHzmUuVI;iK71m>;3@yuo>apXwyP; z@azuRftj%Ap*5ZOZ)j_fx_tQ!!S=-iEgtriiTVqw^7M79Yx z9FX*9DEKd~KjlB!z7K^3Oe@@Ad*@QWxsKjEnSBJzz`Td=!495hP^lBx84T+GRMdlJ zknOrR5leaX2WnA~#dsgXc(`UUwGdF3NJe<}ruFjKof!-qJ3InxytTFYnd}{P8G|%Z2FsZ+ zTNXXy96dl6OAev(-D~dyoJ{Z^=y;EQJUV}nJe?bS9e!Y2I)3R9e>8A|7Hg+cS+(56 zj{?|^7aIKP>1~K*d2A*4rcU#c-Trj#j=KWvLLgj|n;|cpnq7F!s%WT_tO98XROXx$ zGI=7+Z4Jv~kwX0Jpaw~_jTThh@`F?~TkRB6CG>ir=kyl#<`4o)z_nG<@j4`uA&NtL zWJ&`Z#691)GaNasDX$gX049xgte%77MVDw&uXHsVv0dYOw6--Qb z=hw=qnt#DiQ6%l9;V>T9V>hF%cBKiFReBlJ5w+P>;e^q{l5ODR#B^VUro}vw#P5cZ zFi*~(pLb+1vdr4iRJS|@vlA6AYX_3kJua*U57(29IOzR~O z0W##sri7G9t*bn}YUOQR!%`Jyz_khrvs<`@ECXJSLINGzo2saTzFEe#<@ann>q^7E z&#ks_2d2wh?Dabs;orCv^-QTmr(2Y1M6`WxH=mAGBx6r`Rs7uM6Gtm5b0j?yTK{5A z)U3dWC9I>^n4nq9$rnYcVw6jII*J~4+1cSEqX)_PHu)cWzRIg4;&nHqT``Lrr5x3q zXxcW*mgwn}^<>-G*^1S+_EOHWDjbRL7rei|Cc{e4)Y#FaI`(y+*3yh4#bRPV>U{B5}m~e$f-3(evH97qNLQwL*Za%GZ=wIk7PH;oyGSSODUwi&R2u#OWbK z+(D7>!r@F{R+QShil*BtXO?(0>3Cpb;Uit-KwNzJB3k|(P$Ve=QQDiwLJSRq}tc>O%36JS+Qu;LTjfoTMZ5@d`xyRT+n^^ zVwoWm1frsi;|K+Ju*^R5XYn<@M(H$50I|9rQtS#qAyAG;01viqVh#I-Cfv%DhUVw2 zuTsM%mpl=t&pMwlhR||EjXi08wH|pyL`=h<59v}!v*R4Oy_2u5iFgYJM(`%9bRe;j z;Bt9+Mn2_Hl7WgasZO*Hnz!d5k)?Gi~s z39}OoJ_9U}U$Va5FPj+Ij_PVChn8wWjfFwJKzD!exCquF*_}#W?;NTNw~Zre-%beY|loXV>a@H zOD{eh2Wy-Y3rkwm!N(5CW6-`a)>@RmaiY|oM{AtMkIuj|I}w(g!LQi@{yIkA<4WB zR1+rLmtrrRWs0PqBqnCeg=|~p|K5B%L2db3S6^mhVc47Ib5C4NQiY5C>ulq!8<%o% z*5%A^MO*Ikr!OJYaVPi(Juzk0-xnmQzdfsBsfl1#BH&I^ELSJMptR&C1IRFyC9RQq zb|t)ydrpPy5|A+7@NQ+Vu=J?3tQMW$_DDFJmb!lw6(0OT?@M2CfoRH+!rHYPEd7=M z7JgCh^QYAuDpm4qUjijECXyL%#Ni~o-Ud#8jYCjCCqS^lfjer)@3eGpr5$&jJ>2*t zWrM*&1+GVmFv9icO1$qKFBXe-)AC&CwD=@I+2kN8)^eonXU`!&%;W4=tg!U`Je3Kh z<92EUY#|JOiBscjNAZ@*gkod*!nMQNNmVA!swC@cIAh4)ff)ZXpE58yq86`@tTze0 zww?IsK=tqO2`~l(@wLCc+}$6|r(Y*?IPVn^%jn+i-=sOze+5d{7WgdE@Tlul?6ytm zG4Aw~Ax{4vkQ4hbu;$b2_=ia1zle`Ne!@w?0_CyDFcW70v#md0G{0{N`s0=6^xn0w z!H{&X)1(6@(f59ILXOnYo^v+<85R)(PK=+V0BG zSfWrs23oIoL78RpTz8ifZw|bb&sw~Ki&dlkSiPgF;tH#rL2++TAXoRGf}#w$ ziAqDml<1g=SmLFESaq>qvh^y|Y4A|^Y$7Y$_NkMbzIm^7pn!vc5v|?FZ}a_JmF@Is zB-La9dH!{L8ABq=O5pqgak(zjM}pNi?rN=lF|x6YxFqQmhL$V0Bts|A#A0jrIj0G` zy!1{k?m$Au6+EUMdjIwKr$<5$6LYnr0cn~9gjWRKPYfc6%C_qu8kSPkMOsVZPjUv_ZBcdc*?*? z@{UPva(AOJt}=NSSaS_8Zcb<4BKid?I&VKQJOq&WDcxVLuW+J!&Tpa}KPHWNLa!GP zZE5Pi8pM0jB4IWcErEby&!u;<+)3Nm)bL6FhxArin@+MKr4_aIB5(8j=|B@y1I`g& z)^>V2Z*?zd4anj=dp{GL6_(Xz824&mINpzbMC`{=x|-&9iqS1wtHzkiz(wRpX_nf~ zc539sNaq56a`lq;Jl<6`z?TP^s`d3!WXZ`D?2-~4{*@Jy-o?oGHk!$=$hH4H+20!I zcfPZto9e_5=SZTmK;YJ00xq?^s7-kh`3S%v8*glB48FzsC!0z0o2wOWie)m0G`A87 zgW^{H|E}n-DMdJ(EJ9V$)%bsFi`qY4_QMS6AMdI`q=;LCgS_?r;RHrJMzw zKfoAs5af31efZCfu)H{_J2q%$1?cGN5uh8hKTYYO(qedLS#T4i^)n~_x#?TzNHR3g z1Ck0l;RabKJOU(ymWRczQz6o1ADP1`XUAcViPF`XGW12v{toCTz0Xa-BLEk6ZyXY= zYC*$Wv?Zw3BcN;S;S1XX;t_}&_D?I;4|vX0RSdsYCsqwpqFG;#wleP(4ZlXeB9MOi zOLelBu8?!wmU~z@B&_6Ir7y5A`GZL&vKb5oWHJ&AQkoy!?=|H^ZtHGI2DCk2TRUX4 zrrK|R;tRV-o^QMvnTR{BFdS$cMcSR2OIwN<4EZF3YcEbTvVVT7l`&&?eDz?SeI5gI zu`9UHG@VNmY`5}W3Y1hgd<|!s6Z+E#$uGVkY9gR9?h5`j1JggFn3Mmoy8(1~`2TcU zE&oW0{Fmp2SrTNX$e774afe;&$2-60C$3$y&@BJCK4sYZaldXs_jO0r4-!TM8Jg{xV;O`Sf z70|NQ5P#v$TJN?>^v1&Uejw;BYlc zWV{coWr%1*>9^XHKp7m;L>`{ zruf*tz#=a{n`dJWCywH~7t2*6*2T&yiADlwIuw)MDo5hp%!V(9<-ESOiD)(2q9%T5 zm@ z{<>~Z;{>zNGY1R~@}WKJuL)F-(ZdK@<|%>cTGa07%EI00nIw6?A}>RmL-&MH5SI{`g5kiP7=a(v!N!0m-Y;p_ zcR5@~iS|@~7z&K9Hl!*0ggJajHWp*#$@vX z(uwyber}=0fpkmdw4W4NErccrw)23y47PO^?-hY6HG`RH^sc&&MtXw|z=&3LsP}2y z86R0{p-`FdfFkhr3<@dvJTrID-8WfFQ?_iCM8L(&L6?-l8ulX|~lrHRCKyOt6loA#Geww@}^dRh6yaiOPs^ z@vy%Tcpl-O3qav7Q_uq3^P~Q)?U36KvAuK*zlq^&1`;H zxruq2fhDMs(#)5yScLwN%s!gP%yRT1MBvE^=1C6XdjKW7001ip4`di7HnaH%K-^fp zj`I_(Fw5)yf7<)%xT>~p?TvH@lG2TIhoqFWfOL1al$5X$1Ze~Wq+7a#O{X9TNJw{= zlytMb%lEwJ{ovelj(YERzwiF>{=tv6*Iqm3+H;QajOQ6+%nVWH-V3(MC>9G%5;Zxz z1L|s#9$z*SbR@pRzTD&EjKZt9*^#DJr-9kZDU|MfYBb6gre=<>b}jSRm8Q-i%{KFm z2>r^CVM@rG=}Ei`P8km_zdNGJc}2?%^HG&(=lYiuBi7HQAxt5lw)vfJ7q){#d z3D{e2a~bu<-^@+|gt4^IH9`Hiu=1LF`v)uQ-4Y#w@~dH`^uOr%g~6P>bdjjvS=q?8 zoL>_1f0x)1lW%aZn*0`*0k!}I4-}+`RX6;Qkbn8^vjpx}lGbaZ{r#Q)>_7Z%2dD^P z{FP@90E!a#&X51_c;A^UgqDTM#S`%+<`ZA|2Dg(9@N_Bi;3K<3E|^8Nad*Pe**#Y}dm|YWO2NXg$i)(2i0dqTy^a-YwS>S9 zGPK~{Gw+?6Qbc42+tMq`CxfRWeSV$q)$7cw5(APWq5=$!?4_v6H_uk<2s5q7O)2l(el7yO67dpP&|!1QcJToTMEK)UXH!Ya=%#z@9m=&PsMl5)dFp zJ+}6ojma#sE7*urN2RCabbS(qNL6wlGqH1kHnsCYWjj%?u{kYIPEdGal!G>b$i${M z>Qg78BQYss!rn^nQAep2&D;2bep@^0K=%bdiG$a5F$9#ex)zpeC*ZHHEpL-#7hKKV zH1sJ4wn|K@>PKBpS*Rm>rE}^eo+|hlB6ks!dWV~rMsO8EAa(@iqXF#>te0}1>{c>y z(R7?y$?Gn&nEPedb`Gs9_LzG&t>WF(-QwA%KaxU^$J^DE9G5%Z@=5Qv-IDGXAL8n= z<+j*8iikU>N#56{lDOR?)UMnjd8?PGNFX+-PZcxF#G@ZIRe0>^%12_%xgx1OQ6kw% zCeIo#4k^0QtE9wODA+kV1KG=oyIK=J@r2CT7%&J_RWu zehucgR?gZspABZDxZiiMG&$Sc+c(=6v9)XA4L|6297|liq(U#uau4hS0*FV$tAR6R z1eEdJQh1vLug$0J;aFzPg}nq|=2gw^j-?yOr3O9I%Mdqla03@;TYa9si;24V;ziZy zq+?9~gVfBNsy#`6w@k2|c#&ob8!`8gLLp%)ud(!`2Qe|JjbF`f@3`TdVd{}t)dkn? zRnzeY5iIGpD`he^Oco?Vc7H!-ZS^?Ml*pHrjFv8^vzrp}ciuzYV!4cY!myx9bmO*H zqaExq$-ye&5W~sZ(dJ+m{LzW*(Zi9uqVlyi*`!am0w(%No>P4tr} zSbM5JfzouB$a5dV4fa&0~OqJH=dM5L)ZQF)>y zZ?76)QdWoMg#ddtYM_<-X>qpwLVC9IVIKT&WCNCxsQy2t(c0FO~jS0CDkD()>Q14RkE-sLR5V@_{yfz60 zm@o#H47E$sZW8AVj5a|##e?p_bTb@C4^nQ+sit)N9eMdrvb=LDBJ)Aq?Cp^aleVUl(0knl321)$vnQKlGf<5K?_Mkhe* zZGHn~a2tL}+sCZ{ideq@k5H}&ZGgsC>b~=rXz>ppOlJe$2MsrGjv8FSjYW=?-Fz7H z=2D5zktl260onH~g0IlJ$Q3Ce66Ab7Jn{LMP;Yrcmx(Rjn;zbV%xnOg#z3h92#2;ZDtr8`*3jCcN3FHv#Z2B#)AMEk?>Ga1kW75*1+Ma57^&`11E*__fj zqoeXo9E~KN+=AP%5+juLgjMO3O^Jw~lpQGV)4lvigzpOyaQ?`9ufpZFgKEQGQ^IjS zv6imYSL{5$A?50tId%p$GP?%NY0l?2f!f{pe#Ih<0IWt5JrCu!~6#Y|A+BAa6PHx->l);ztP#ymY*VW2l|FyB5I-{KcSSK=@7qlB2>=qcCV*opzfV2x|MQ^~z+q=mbt@KWh!Mw`@< zlru1i61iRf(=7&s<$P zd4VyObW=RhW6=|=76f#rdTfG4b?;Bi$GPzt16+IBU_%kL89n!1J9KUOszJ(KGiU}+ zk~4k4&O`~a6{#V{j6PpUpjIhuz+${C262emNUkzIDH6AoBxDzwYks0_SLuh%NQF!p zhlievhQbSH80Jz;cAaH8qEN^-%$z$qAz@dRbBYXX;Im1e#Kv((4aQ+iD9KI^fDg%I z=>*veqM;?u6cF-&-(?ce!nbtw!vx`4?U08^M95^x5NO3}`BJlRh#V3SoR5C?*)Z!g z*3QkhimQW^PLzy_J#Q~BIfq~~}0ZDh=(-gZLt>T8mxd>0|Bo!K)pK z-cOtAterOHsdxp?)Vxa}+|g)Yg%VZgmGUIn#Uj$3R^DH8H=^7jM*@FXk6EI%B4k2v zJx)vu6`4jo%J<2`BylrQy;|m3JmpFd*C=BVI}@_jeR{WNZp(VGL>CRbfk9c5cul9|-a z(CHW)JN^QejPd^45m@ft%~@iH+ouK+$zQ6f&MG6A^|Cb+XkN>}(xtfsy<_bmKTAe; zOci<1DZ%}AW=Cn&Q$OrH-mem}yU6_ROrxzYObR9Y9pdAjm5T8C{%*B2SmI<4Yv4>@5xiF~P3?m-NN z3d*Y-TZlBl?xH4RR52l6*Rw0>>vIp-E_qSqi*Y4tOi!YZ8>P886Zr_yI*-B{NaQLU*reuc+5H>*qdYt#SMAB z9`zDGN%{1Sk_7I6<#nX;r^i72pgt$A@S8IR?J;aOk$wXe4L<;Sjckpy-_U|k5ieb@ zTzD-nEqA^TOyP$EyY6^haeGb=pdvuifiXbMxL3q3{60Pd_W^>(2Tzum46DiJfFg;R z8rGFpH2TEPI-5_&lGjL^V?8YbA-oj3+sSq$6K3MkanWTPUIFA|3D1?Bt#ve4Gi>VP zD{tSiRIivS>QMD~6e2tS+?Nf^Fj_!1c|3Q}eew+iG6#@19dryRze?3;K83yi4TPy* zsY_X_GO(eWuXT6*?=MyBCtX?-6wi*@(+jC~D9V49>bzq5z*iYX+jl zV~-*$mn5yqVzEJai}v>$S6Lhz>^cqiQSO9ipgk$boA(dsLUR^Nwm(9o$(YdKg|Y@4 zCN5j?$4q3upJfctteTcK#q{<6G;>IA_7{T7XH2Fxq+3C0Ao9;cJxw>d&cOuqY9J>h@r}6b#C}aulSI_FcR@e93 zbqvpWCYgvYzgo{+H_4rwT5oGsL2*(5r;%_hi@q1HT+o0e!benSgT^1+P&EQM6&#hS z4Pb(id#Q$^RV^YLrv}<$;GKu2-+|Z|}l~bKCTh)rapqMTq;1Q`cRPurD zyjfRJaGwL(4^Qo(TSCSAKQQ0D;N1R#+91d7_sC!ZhG-iN;ou48J9H6slh!^)Nmk-< z-A8D68v9yjuOv^VFpa|Bs#+ezqdBjVFDM|dkysbinX0_WiPzgBn&}{AcfCsW6UW}3 zA;Vh$b}?86&21}BS=KR^#GN~VZMayuE88L2ITfHF@^2uGfglZGm7y@=y`8&yJ(EwH zot+YK4zlGCilT8*UT{P=nVRH7K@&?Q{4OOSH8VWZQ&JhCPgn>^XiQPm2j?q@@fQUF zUO=$NBDJZ}ChO*+5Krc3TLsvSm&c9Om;2wTNP_0mkY)QzJJ(#B6D9nxW23;~C^Y*l z*kOwU+!Wcv`54;-1@`H$)^wQ40H1Li;4}VVY0G0e2>Gf*wBE*Hu)8sIp{|knl1Dnq zI4l+;J7UenF>Oihn38z}AD-lH=L5w<7oGj2t5-Nm+OPlAKK)Jd`He*L>vFBvUvne# zfW33~$wm7H3i1L1GyT2kpZ(OwKz;EtOg?z5sQDbZl&sY7507ctPcxks?@OiMkZzZ6 z5F&0yV1I0DgIfUUQg{2-b@%mW$BExS8&m66!@rqm5mFkx>bAL~#FvA@SBW)=Hw^WH z;Wto3bIHrwWZ@*ez_7mja9B6ZaY<$^7!bv837?-DERO`zo+=+w=C<_nmTK&lUWW1r z?~q*~jlI6Xdi3=)2VJ2*1A1(P0Ft>VPoj`rcCsCkNEGD=~IK`beZK+u$Ft?-c zphKS_t!=0yYWB-h`eQA7!Cq;SYP2`)bZ&WQP9A4LODo(En-bJwZB+Q7(qTE{>ddV+ zXavXje)Zawg?G)DUIEQPg<`Ds^OTk15~NfjXTqWl&q7WLL-wfGW`e1nD)G{&rQvE0 zrGBA`??Nf=pR=7+dnB<#D^A@ka&f;hLxBF$13N&flfjr%X|OB)VZ9AeK4qM(UMBTp zUwtVvGd0~;95S%ci21OI-S75_+fT-h?J}&f^u?V_B04DUBv5H)n!B05mO9A+8P&oW z5@TyO(F|pc*ljWETNw%4%3xVaV-V$;s}sPP-r*(ppC-(1LWy8}+2F4`k}+)d)XG6E zgF~7CQ})&8*PT1BcC+9d!=hA3=8h)kcEK>r@0s0{#_T&UslHl}6tPJNhI^sLz3Gak z!Z$P_XJrz1YFn9KscsS)a=GG{+bpzsWA|Z5TkJrP9eG)K!LQsD(r>3<~08fZ7A7&3|4Q*UKh7rjID zCd4DEz9Oz;g+Y?qC{U&K2sFZ8x_N%YwsM-4A#P>i-bFiM?*_vD=)_`Plx z?itm_56u%L%S!ge&iG8KJd{gBu>k>Y`aA^+|32fkhrJ#MW`0#{U&oUCGQqDkVP>z7bjW=o}HaAclN0!I?n5kin z8fDxdn4h?AI8hZoH$`9iRj0GVMb{my#}u!5SESLp3+H&rlic(%Y&w|l2SJ?nr@Z4< zUhCx7L^>1mP@MUk5y8slvwU0X2BOdxv#B9ji$E=Dzu z3oxfdzW^Wx+O)xAfaOvwDX29uGd-O!I%8M-wkjndfn;ngLOl#k@=6mkLIjSm+HO%N zTyJOSk?+IfV|l7hmju%^uXM@D@rBGMPZXTkyv-oHFW9W3tTp)GW_i2e1TD(>-?_+V zpnFdlW^BHW$b0h1(cOMYu3^|>Fh~4&%1ZPu#-Mqe49;$|8z=8ki+-h?op3P>IDRd^ zK3BgJpr@)o-=eAwpn2@M;7fHjl31LpCH3}8TopT(NmT%)vgd*b?3r4k6J#bhd^-8pxY-{H|d+?OF6k z+H*FT2y5>;3U^xERt!%fJUVWsIhQCv3~&oCXT?nQ!W`S|^<+&d1oy|rLlK05q_wxLeO<4-GPE(pgmMnm=BQ?c$%_Y;VQ;ahz;zM=sKefX}E751Pq}(;3vube-rxu z^Mw9Q#IS<90RgRUODt%dapUYIESyJ4R5_og)|E-#N*d z*Eb9>3Cf_y7EI(-M9-wB88k*qQ&^xj>Z=={Qo-Hwtl1JNK07Q$v*Mh#cD72?t2_wA z*7Z)nlX3H&mnN`1Azsaae0Cu?gfI7(E+dqGU({@hmq%&4@SHx(f}Au(!YjXUe8-MQ zu^9aE9{3axDj6f1_Nt0=Clm|nzEn(fdb^o2Eoo>~+)aAPVNdRe&s5I~SLLN)@~`U| zs?rv`$>eJjcZg8k8WLsncCrJ|vZYrh+?E8K+F`zgq*b*kZmt0wOKZ~}3nVLN_^$Jp z`x;19(bRhnciTg`7AcAEI=A#7eC!u={B-URbi}?G?4ldK%_x|LWK_NzB3;<@#@zcYc(1(MDakH8(^>oYC>e2+v1NgB`yDAYd zJBZq(J9DG{&}MA^rlvigoZGP_8M$1PUgPZw@luM|u*5m98nFB3Zx=Xsc$zdy^Snn#M zLh-9=b?2k1;lh%=<>ed~fE^j8baZsr`E^H+(~BFFwK{r`gv9*V8U-E)01e8=F41`| zI<>c7jNL~VB(O!%3$^evx`QQ7RI5B^Y4HrdJ7y(aNVJ19bFu@-7C^=ge3{p8tFJYm z++!Yzg!ww5+w{OolhG%n{(2_^>n}kFk zNL4l_5=;uSEYed&nTLUZ7>=5r_oBuE|IoaHQ(i~JOE^J8G*u%>0}?IuN_(!3N&rtl zOZ}1QxyK6(Lq_w0@o|aVPKJ)YRjX7Bw+=b>enb8zh-J9eH%dNkR%-nB8oT^&sh#>; zqx8Q(m@#>fb~JeGtfaXLV0? zg86DWNSa3O9y&U>UYk4RUXii<{xr z^8bZk_&+x~gvTQ>c!2#Y|KDW_>&C7E5Qe6(02xyRAI32C=SF2`El%YHQf zdA2TBSVwQAKuo6 z=309ZYL8v|SpXdqfKpDe(ox0W(8$|!_)At~J!eX~`6f{@Pn}yG+&oI< za^$_R;sPhn33TyU&_Xh;NS$CbyC$U`QR_VA*K+_d* z;6fwDJM(hJU{aAbM1ko=;-klq&NpF0x=3N;%UHL79FQfD!?Jp8|M6^+041c|$@*k) zoa9BGl&d6m?nOb2lTaf=T*=&6`fS=*?2cPp-Ds@0w@`R$u9>5ULlie4ee6s4``3zo zT#K+ia?~doaD_{>+3c$7v~$bzj+oZrkcEp8{*?Q*kQZtbD$ghi9Rp*@ zSaB!BZB5EOJ-8|=a>rO9W7iA!5cfYq)TSTCh3OVdg8O7cp8tc|7D zLFBxP>8rx#L8h+_o?zoJTi=E5(n~Dm*@)T?qCwKAEZJor$RFCn#Z58Ay4isblMwRQVlUG}rp-C2~8?=YFb z@{*c5)(U~lxf+Fw2QfBxYu5*K#a)pSXDwI5qG3B)pOeq;3n5YM=KRU8lyI7+IDGh~ zXsgmW|KTVPW^u)oga=z~l*~s)v`{QeUzyiD+vBaMe$^^AgnFH!Bh0RTlP_56EFsmg zoyo8(&y|Aud&xdY_st@I;BIULivZhMou;NJbvdFj6ZUX9R=y}eFhsqBOzydhd=9Jc zRv=Ma9lGKH(Ua}wPQS*ZgwFWId2k_-F-Y0cRE9E2oGR;95r!Dj z2K`a+0`uH%#E0ZF9~Y`xGxe$VuvQL4DSFS!R$lm7`NtURg17tfNUj6F#eIza3$gRixEOz9~usf^)*S5W*S) zfAPTw18Wx#KBk23d!TmGrlx!YG#~%|CnZq>5mZBH z?tZ=%UCuk)XaL&0`Oybs2mmc&E(3uYxy@-{yA0iSvc0{#7fWYjiU5gwc3TG!k81#e zKe5&wytK%A(s@vdh<)j{@nraP;)`~3Smn%p7svaPxn!-FXQC(eX>m3Roody!L)#_P zsc;^~8m0$`-O_L&A4e{+bFGQ8tH?}~4_=c|oR^*&L$ zY7a`9Ec3^*SZvZlHPk-bG`Qm5VIWlmlCg(AZxpHd92JAFUKxU7ehch6ybJ()!!lkM zf>guqNFgNQD7B)9quCHE<*7czM?nO^jH|5w*26L@dX^xOCk}tvvdfeyJ(l{8^x=He z;l1okUjj6Co%gTW2&HhWaWQe=AM=9{MHT;K(*0$fq(iWtzKppr|#FuJFbUH5}vt_|E5ClI&uQ3 zDl;S)F^w~{=N-)tLvTXgYRd7TlrspqbNy0ICFY}o4x!#^bfl99vCI-2h4?2t)4WvE zKila6__i=uf1J|RG-`L1*&N*nr$GuMsen?%yqZJgpxaqF1tg*^8w*1S#oNL7BAgjCTMh~o{ z(DUh$gablI`S6c~kUu_;i(6M9QV?G2sKTj zsefBeNxH!7MTKD@R@RvRFD2E%;B*(6Oiw+Tk8}n~dsP_9L!Ir~{Dk^*ii$#PlyI536tF-zwl)=~~Hw&g##QIQtiHYDyrUT{%>PSs2#9=t`^?O0HBB5Ud);KRjvQc;tHUEr#nYyB{MstX z%U0ufuT|E4-N56s|CbCr^MBXCUlmB+K6w3DW5BEota7Fb!7BK}nV)U!!BAvMWluD{ zHeF8bYxZB=W7M5w2}x$=FNSDe@DE3`v0w<(Q^1f_=~8o ztz@GibTEMb{i)^oeMxahw+C=Imiw!$|9o{4KGiL^c)@oCOY4fKLqGdEQ>CC+d3-&b WKBj4#0Ju5-L*db%QDVa1CjJAX{kMMr literal 0 HcmV?d00001 diff --git a/note/images/spring/spring-13.png b/note/images/spring/spring-13.png new file mode 100644 index 0000000000000000000000000000000000000000..5f32cb1741789a8a63cb264c0879076ae41da8d4 GIT binary patch literal 97472 zcmb5VWl&sO&@Po`O6oG<}Y8sWMH5^XD~cm)xUfp{vs_V ztm=_@ngwl`B>w!-turI)#Yyu07qap%blzY}VuliQI9lr5>};>%_w(v(1SJIp{|CMa z6(nyVKF!1FNLN&C+N@jKZ&t_&r{^D8OQ+`U^?PfkiO3#;?sN|8>F)dKo)+uw`<^+T z60Fu@e-I&rU1h+6yhTKKRsEM3X#l$yH#rJR9QEy# zYqZ?to`q%r>qt=_}Z_ z&*mBk+&LsT$Hsa#kMn|+meuCFg7?3ow(+Sa>(m8H$K4aaA2t9#I2eKmL+}b%$cUo} zAkUU|Ch^ziJrhtNwpiJncJhuesBWF|+~Isz!zKqg-T=aA9Qbt|vO}!yKeOUKbtTpw zH$(x0a~eeW*7 zJAbYftA;I(;XyDnCZOMJp(P@~C1vM|LIqj&VY^JYSjFfx;bf;P%+7ySzMX18MF%rT zmPUNzh~zT-7M<{9KY{`LG*dl)&xtgo4(}+&d8@h-0VXjQIkb-2gJI)#c;N{jU@&74g_qVpHY4@=D}mMQ-#(@| zc^TT%HQPv9o`yXySDJy=gaiR;`~=Bs$)2shCDtXEA5I%X^W@pyVq(3A@dIZruple|@LoXu5l<%X&QCkyC6x_1t(mo5v-XOKHa&H7=is z?un!A+c3aP)pPlokJ~0e_nTQaYX|q<$aO0Y)%N`bPE&;%1;ZRW2VU@=hVaGG-y(9= zYVz?PcQ~X^17%eGv@ub&zl)9m$W~cm1i-?E52x~1s;AvF!7yl0KQM+MZM97{raa)XizRME`@yN`Z$g@^qnq}8 zx6X5mETiOvU+oZ|C(!TNN2eaJwJ51?ya?BlF(_h;wSq$X+jt~W2t zo`eZA$ScLqzeT_W&)WT^-f|1Y*NO5Z%~x*iQgyW?A-ALinO2Q8p;yCLPa0a*hh&_( zu>Qu?Mdgy)vs|6bZr}|D2^Q`BxUG5xDovMQc+L>Up9Aq2s*h?1cx0Hu2zGgn!|3+NX^FJ z4waE=4MbsKKMZ1wr0ZXa)AHlLg6qT4Ap2}aMsJJMiR6ec<~=TGDz;|+k$WEk5b3ht z3Pr|OawWXcH@Y0L1qB&Z%XC9LJX)^0l-oS%>IT;WzIPLE*?MY3Lb}Js_+tJP?{3(& zR<#ztC5oDURk3VwZdFUG_J`s3eN*xg95j1k!9cvJ?N1^7O^WesJip98wEK*d@|%*u z*y3&*gerG+aslh+rPhqIFmz8OvOG;rP7wovNW`A)fJ>Vx$~!%+xd=mY8plG<&x1mX zZnQ&UuI6_ajiL(~?f*|a7~kEQ5R}xwb#U5KulAb?M8>2%1m>u{_ysi;eIsOnjiX)5 zD{Tuq4$|4;x}x0rQOH93LOC(r;<$XjX{%{W>MCw?xpf1X_O=BsC3PO|b}~0l_K+EA zk)0hnxzF^{mYDS#y~A#01EYOZTfQdAuh;$ zqx+G0#v#)^*T=!|pfcoWc}!DLbxF?HJ_N=IQ74elTF5j1(R zsUKZme;-F)#>fQDjuFUV(J9rsvjrB9qWrdq+*Vo0l(>3Q;k?1dCIHtv!hF4zr=g_p z1_w9pt#L3Yyc;4>sXbhGf?=J#7$&;fR~Xd3w$a~4pToD;JRbBR8N;3Q@u%VsprT9z zjNNX8RNq6I7+F^=)s?G*cIdBX4oXEvrUA^XC0a%MC*b>CrfdqeW?TgVVC|zRfjAQy zRlC=VbUBS)Mrn-RJ8sCy(QXbtb`4Ri^fGJ;#S|O5-72U(i+cee@rz zn^mmB%dq^a*_bB_HL$+$Pb_c)_&dirT7S0>R3D4_>H8A?oVTUp?tacBC>zd-k}*x z_{rDun3iB0E!@3yj>=xy7VQBJ=O@2{!i`w+yl$2a<9{MJnY*lTHfxwpQ|l0gU25U|(9A{m_sR_-sQYfvDSK8+JBC}r_3%*VK}F7yG_0ZU zC<7=b4|!rr!DNzz-?yV$rSxxz3bg3g;)4sfhl^*fj)*W#swLp;s#h+X%_6U=3$^+0 zuX-?rU?qis;1{Q%>c|BT9V>B){YMK`<405A^uAD=e zm(>^@0JzQR?ot~espHJ{ks>U38PbDvl*xC|=QaeU?RTPyZ+ARUu|C((Ch4B|D9&}P zKggvuA2~0Nz$33XbwqfNS$teSP)YOyRQ#%W>-6CTyCX6{pqT?_zh4$WeO9{IJ%O3% zZ#{Cb!&2Bqy<5G{0jWku!o$yN>Te-h&xTH_O?uEXAw5~&%CZ?i*scNqBSk40LgV8> zLUB)v$#MgDF9`{f3s=r#CIgY!zlM*{01-XiUlG%!Qx8AjzxJT`7@PdMyZRjkZds;C zW_djp=XnDu4lHR#@`0kbX({r}d?TPPFp_EQr>vd=|8h5;U*bw9YClepCSXtd$NvMW zHN}_Tl=Zxe3$DB47Coj;kdPNV_SK1yuv;sV%bzE&`4xo{_~z2pE3<*WKY=wjn|`R_ zj>sd#(ED`)*5h#t?^l+?wot~c+gOUm(HptA$v_Ey#{+PX8e`;eY*}X&OxEEU3S=;} z^Y8~kU!(Z#)n3&_3 zfL7xi5T~x=_nkne5B0jG3edjS^w~RCs&Kg+FfjFkz1_WnG0qKL>jxx%5@$*q-g0!9 zcduzYM0E3td0!Dl(ZB9oso#rE&J`_L<3*=Vkc#W3V?2$j$CRKs>Vx{Y*I#^Tu+>?y zcV^UuTs=$EtwFFP+1H>W>Pf$nX)pCG|hO0Z!Dr()XpR-ha&9WF~25 zbHpaQQhibVJJ;hD!FE{GcBM{S{K^wTQq1XOX_~(iGPT)&*ylB<)wsM3=!84|SqSu| zjDPFe$}Sn1(HX5VsZ6deKh@4zKSxZ~d1i0-)9rng#zcp^7%d~tucp2wSDHcJssMJJdeijIzXn?Fw0p$tL}9~Q=A=q{4W`m@2H#MrDUNS1tA7FJMa9vW48a1%u0=LnlbD_sMb=nl13N;(+3u3)lZN1Xzx5S+FbsHe>U(D-=we`d?<0(3OkLvs zI!Ox1a?{UrHNSGPvvI*6OOw~H`SI>fZO4hhCHL`mG4VZ5@$cFW^81Zbo8o?Y8b%Qc zMX}i%0V-~ea%r&X25kl1bYp}CZR*y;=xJEWCF183eXT+4aC&{vMZ|M2F!PjmZ_E8s z={NDgtSWg%%m~AI`st=o0qheX^p0I(ib;SPIK@5~M9X4k;#oijFPflpJy{|GsWe^t zo(fic4q#aP#e5;l`4NaSYKZ!br4vyC10S-wfW&;VGfx1! zvWCMUNC+Mmu$B?b9^#$cZb3C0Ch01B0>HcZxOwp=B2$U$S<{1kh>+84RY_YFA0+v0 zCyRm#MyWJ@1@0q_r(>?#Xag6+C3MTbrZcjAbTsZS5g2evw2&)8!u6aIZ|WEH(1d>Z z(l?!uiZ9uO3lkNw!&i1iFmDc*`14M^<74kDb(-=(FT!*}^ke5zU7vlne3Bmg{Pi|# zOhf?ViA_iQ71#t|_%QnpL*48MncIu>PY6~d=?;W5azshmh}CdTzT320&JISBk)`6(SvE<5xU*qfrZv?(sYpwHr#Do zP^Zl}(Qq@?XJNXktq6PZCCumX{@dYH2EY&gJIN?``u=mG`9I5RW2Ft53^GlZ6=o9} zN40W`YP1c263u##B4-@G$bm*pJy%sCloflsMjkVBsJf8XH*nEtCH7hoJ_%TP^GFpK z9@>oB33&El(KJhFIA5=ed(wZ+b)%o<|Lx9gZZ(jOx+0c2{v!O?d4aA8+nFkJXhnp! zxzlEQj+f7H16|hB_qC@g-!4e1{kyZ;f0o;(#QKL)17{RD>bgu+Ek=wjUPT!}| ztgNs~G$c(eFLEpuMDs;ZHJ#fIpM;$_y^4N%Web$MyL-WST4;uf#q|b5y@k>7t~A4i z>{jyg&2gh<`xX~K2s{ss=x^OYc7L5kPCwiP|1Ug|<*p*9vuA`FHk}Z)`kxkCIw%S< z=<9zkc50Z3&Eb>_LWE4-;*T^lxqooynEMGk;ZA=mU_c`?VpdTd?fPDx`wfdS5=b0^ zLr=B#z&(Jk70^4DY^69kESp(a7hWsAP0cFTj^n=5XF^W+ZpebVm|99Iy5vpDt?J;W zKDz7BrEdR+z9!XzZtyIhs8sVqGu0OGby_)G4&Md`DZy_uVtMMf?_*-HnX*vv# z&WNTmHCGW?d{S;)GzM@K1Jf9P#9gfO5SRhVNTJdtI{#) z2)qM$Q#>Wa`89i8KvBmR1q&o2Zg7FCJ2j|=&Bh9aOj)x8?CZ^X!e(3v6yVu$a*0xO zpsF8bQnVm0mL11{!_O;KS7-GX6TXB)KKHevd5~v!d`BhkcxQ0VcxiDeO_e6HDNK{Z zp`B$F+~n*p*TU(ik39EqB7~~(R2@bXZE({3j*)V$m)ZUuW*y}aFs zP5Nhbk8teiH=q3i1>?Xq;3HhK7gd028dVK*i%>14ncu%qnIwx<9UXMgX#%(=n3C*k z(ow~GP7=?U$@*@7Z`95j9U2AZ@!3+vIJLB+UXlP1532s_2XeBA-hYdIYv1rd_&M6;(%l zY~n^=D&ewzTj=B8npH4$VHb*t7R>~ljDUm~5%U3!EgPFuZuUiXxft1hM4|^ zg(b)_={Ynk5zv5#friYV%kX7-8R~RA1j#F4vF3wk+V*+3xcgDKv4>|H#FD1k<4NMi ze{7R~oHcVG;UVtv)y0NcH4pGMTe_Tj=ENt5^SEpy6V$1tZ6FDcekXn?CKE|(d5Foc zt37zTs(>F&2VE~xvK#pl@{~`9Fe^CSk)iIJz@2(B@hhwe_~yCZ)Et|3b+U6D2S5Mx zb38o2iAZ{H&KGupJeg7Fj`HV-w%NV*=>*DnI3UfPNrJx|y6uYQZe3&RIt z2Qx!RAW}Q}CuW&df<13;QO(#)c86L&y``<5qMEE~@CxY@%-!Nmo07)kSkuo!kAbzvaBfkK6ie1 ziOme5jD%!aR_^#T3JW3InmmTcY%wKTQdWViFLjR1$qEVWZfBh=yf`Tqj9J}(ZP6u~ zot_V3@pw!WGL&+Ln6KjC5>3$@jabY%l`&GfDPxPBHn`j-^82px=yN_}H8KMV=-}3Tm?ap68IvfTtNWZ^Hw5Wm2bsvC+MRVB=Xo%PWdF&5&36QcTvP~)ukT?(SWf{9ml zBdIB=Q-B$V!eZ3S^oC#Go#NR~B|aJUu0``)G>oTB!=h5MunxYp)jA3XIW}$$0|rKw z?11}5ZO85b(o{PYs?Og7Y=f}zz2f?caZV?upOV;cLS1#pmQE+Ll?&e6ZXnre38>%d z>pQAIBb#I~mwd{D1tIj2a?tt4>sm!$G$AP&>lcFY89>$~;TL$Un;8zq;PQs}12TD< zVSQ=PSHKq&`rs>ulWr_(|Is>=T&6c47#RB`#PN-0R$lY5Q~sK!J43StlT z@g>vS#7Z9K)roAi)_;BNvE}1d^=xwi#ibDGoRi6(sym7u#LVnR{ZPESXLf})Uh90mm^GZ$G=Ym{EF{44 zFz_p%b7!PsS<&7b0`h1fFlFDSuW(OROIH~B9>rq0k^wye-gZMP@bA|vDI98;WMA~w zZ}FfSvH3zjD^ib~a3fDsf;}13Ea_gt`OLw30(QKrSr@9C(LhkLDzoHeiV5#8ondr> z%3n>=Ab;^e+E$A6ulF4r-ajeEH3)+;5;48>1geZK;D-fC42<}>O(j@?isTIpXg1YA zQ7I{wguu|{_~yNBb$jM zJ(x4A5~*DVn`e>j%Q+xf3Wx1S^{R1@{JpVN2=Xz9CHE`Ug!tcCovl<>aMm0`h8|#U z$<_#lZUr@m3$KHz2W?R)Id?)+st!#0ds;Q3`SYm$t@Kt=drOGP$hJ<@H>NH+nLiLm zHeEaNY)g!+G8qIp^{;DQY=gPtQXBs2IbYoI%QUjN`!>5}u*I-nd&xJNv4_nKfHzk& zZLVFBJ1P&c%-I&s1&A{|SyXfre;{BZ7OH_?yU;0#gz9e-iTYf)9=7-IPpQs0kS3Ti z0Q#qtk#RGHu7;gyDG%whm+E&3?^7Av6|NN}wA`6736tdHFgr*2lJ|`Ty*?cR4}|Y` ztN14|a^mxaJ?uo`rD=K7eAyh&$j&`)hKQ;RS;e?n73yqM%wei3&~ z#Kps;a}trT*^5pFr;j1-X9R^@bA0p7dNgzBWKV+~HX z!-s-Mzjwlr7|*s<^{Ax~DxDI+<(vN_lGaeCw`6bq^Ctt^^}{Jns9_TEOPb%HT<iYK8+vls z;LucnE{VqZt}~{I04ytgdhT`#s?P%Y96NoNKd$PS?`LxjucJ91yNAYWCU5J1xd8qH zJ6uStGC^8BqwoH3w=rkps~IUBXU#aNMRNnrI=yjCUIz}`B#GfNpzykuV8m0h@dh0o zW|on$K+rlrzTqh+{VStA`3eeSK0?j-@dt`-7@3a_vX7JQI^0TWK=w==AAxO(g zi#L{wJH1<1qnDvY7q&dSY^Jet+=fHDZ#?SzZG+>x$)I-P9z@0H9YSM?(t)DxAbZQqxq)Y5n_ zP^E5RJQ@gfQ-D zRu)p!Rhs90gs-xP2Mp6YFvrpI+1umf%pB0!Mp|L;PVUEG+J09X(Cb(6$c;j@{y@C` z11f^6BW!^_MF4lxsr92u2*xSnjkUu6E0I-d#uK8Wj7~tIC)X#6{s8;5UOmz5!LaTD z`AWD5nyD#|D?JHz&Evl~PsS#|rPF#|23%gffiCA8_Pv<&0jW7pn0wiTBADB|t{4P* zO!h|?TU}TVKoBVSTHc{G_C#MdEGPKuXRmcfy18SMc{;-48+f&=Ex%zGd2M*?TxEu6 z1Or~L;qM&u-!XS%luzSDMv)Z_zUmV$ROR#NV~n|%wwyk1m1(e7Ym=kUz=~L*q{Y~W zt5UWD+?U5nne4wvIj=L=v04Vq#S^VKtUJ!%RCf2Q&#Aq47kd_OY>EWirx`r_EvN~7 z%FKr0bc*iQoM<{a(c?Z2NnN+HawZCy>*`6BKAYD;V(Mp(E2(sB<+}Y-tawyjjIM z)m=)~`b2{XVz+u=W4FUu#`g4|D1SzK!_%a&>d@qPpEqmX=Y)Ga<_T?uC#AG4-JPQ? zYX7O`1IO4iiwo`}qqc#o!*FIKl;NUsC$z`KjyTN%5GO`zE|`6-E+#tvd#w|~8a0mrR2?Oe~^Te)Ll z9TUdW);6s;p?a``>AD$jJ0F`XWX$I^N7M`!$Nd9d20jB4=0P2zj=)5A`=0ngAH_EL@ear3@zK}P zkPC*&rp9SeMipcE>%>=2|BJo_+n6JG-O3%@A_!V)bCYVv+=4hhQLd1u6WxTQQHFR# zkQw4nRp)cP3(M1ES$;`33#9)*=(Xq_A)l~&>LxI-*R8Gd0N@`HDT!z)_88a2Hcx*d zBHhdun1mvz4A_?8LJwP0egg$hj}6A)&`^?&=Jk%#Xe>gufp%R3q)G{BBqK$KvB7Zl z^8P)L#$(C`A>nyR`3#@B8ORG47dHE4>15iSRCw*Z518qTUq{+ z$L?dHW5G0+T5;w2o6-{fYCs9dP#!j`ivnd9a&Z0znXWz!OJu`~c0r|eD5pdG2m#u1 zv4C!uuD?R!`EdAOp^+6=vTE}=(Aite!Qu5?dRI(cGxecv`P&|$*L$(7T6nY8F(t8O z`yxsoP3$z@?RT{^!kq;b{*`^y>NpbVz!AULsa2TCqRq(jWqoXVpnQlwn>q=32NKfD<;S~q)ZjTvJ79gC zP~CmdAaD!=~w#JGlpjO($E?(a{N0mJSm?>GFF1~#=@j! zY+vft{aE%mbuGS=77S9Zo<12KL#!x$R_FcKgj#$K7k&|A)yb=*&tYt5^Vw0OA~t>7 z0OZ6s%C1$5^Y+MYs$llT1YyyRr0eRd{bT&%5%cm1?nDVmGBv1NUA;|iV>Z@8bYFXT z`@+pSF%tLQ)jWlxLDv^|Qg-sy0BcFCd{EU6aJI+VVvYoSE%FlDJc+)uaGoX0g(>tC1t4EoTyO zA_4!c?<4|gH8pa=jMq1E8w)i*=)ZAImmn$6OxrArG7}?9pdAE7T#raJ7$o!j_-Qya;>8P}yHVP7*4sEEJ zui-ol&2RP#M}a8#@Fn#+DIehs8I@gIvbY*}zo8h$?N!M<;*egSy`AawY+}8Glv87m z<|`U_ir5?*V{8^%fZ4Y9>qk`{3-v8A1I5NWJY{@3tpAa6S_rl7K-TZoYQ^Bc$yO$B zK`WE{_z;W>U!xJ8a~wy{3mn1^FpCWzp~n6MGK0mQ4HiFB`weXgBmG z#08V$3nV#kt>1;xyHKtAc@x#K0Z2-_A;KrSpA@*w50X{{Iqt7mxC%%~6MPImd3GFP zu>`T3rwohUQ(Yq8(ePpesD+H!+*+4(G(d;L?Wtz_NDzV8ryQX03t`etUp^GNdc1)E{EtpQKzhW0eFZ|+*X zn;RidtD8D%2Kj6R7QXft&8t>ss0`EM6S*8u_&$`RzE{3!*OB%6n^M&$R; z=8P-zbf$?O1K1~^_Q^z48>~gcSseqb1XBIqG}1PLe=unGP2yeKG2VYyLO8jJns5eM z20R&({Ie4L8n~@o{#EIXG(J6jX?VKMQMJ&>;KvXgkHVeIItO`m= zjxhXR+*g=CHjXzc#8-KOmnSEgLgJ<5;2Upe9Hs+;qW|wY;2i|jBe1v`Fy>gQ8z}rB z@qML0w0m}vbI<7&uprec{;!<>bNd#;IT#_a36-8Tg(=!7nx;_xNj%gLKb}9bBq7!X z1{v4?E2&-#pqPtt;`hRwu`Wi9m*L(2Y$Xd;`ZmNO4iz;W0@gn&cv{jPekY<*=r(j! z2I}zkfHB!X_$naMZX_~EX8|UX$g{0noVbd`J~rM+>xa!*8%H(~ojZOh0fYziPD~Q? z&D+_4oMYqCHbix# z3PH`z|F-0+!LHH3Fo=K)ue}O-bU$4aAbGG=x0U`?B!g?}lj5N2$|Ey4E)_1n15977 z!pxiT+#({n_80OwanQV-G}tV1?TzrK?)nKt7h|XooB7@#=|{P(pQNP;L%aibm~$uZE?Rg zxpcZPdTlT2`j%t&q*1)<%dvTO9+|Xgbx5#^q#O=0ms;*v#*79ne`e{v{G%0&wi^aZ z%F{QF*PjIObU6@|di=QYgUkK)2yf2p`t_-GVXBwu3snq$Us<)_=0Udao9~e6vxTu_ zw}GZW&2t*Zh5hU81`;1T)4yjYEane?Ii~&l-k|^uww%UqVwXhYOYqLz(gh&hEP-}( z3SARpIbPhA=L&`neBElB#A2Pj8lXt%ECrI_x1Ww?`!yZD!ba?$4wuC`bBbxi)6ljS znyW`^L$P!c*Jf@nE}N8=SfMg@N#-2o$iYYZ&-s1FQh^&I2MYnBKgDsnmXCNL+XBYjoE6lBxm0nsn+3eXm&DS8tBpA)BSgfb+txnP@GU70z zkBz#)$8HDyj|2JmfH{Cjm6)ljZ1Jw-zXxOr1^v8K?7fQBuVUtCbHDtTMOcP@Eybi} zu~n+EOgUT+g8w5OO>-L`Yb(BB*Si#U{4~jt3_0p;#A&RsG#M}X+kKq>JH5{v*prjE z7OaoYEhe>~fY;{fa77h*QS zkX-TULB#dZFtzwBEVRgLr~8z|z@_yYwETH+JFxZ4L5~Jdel+sz)>rdRLtQb{yT#U> zuQc0-AfpT`LU9uf~IC?!=z{Ig?=G~M^HGdUr$ zl!Hb2LZanUhT7Ns<(|ww{9cBZ-7JfVopT;BG=Q|zplA3H-7+!z9+uPbb#nf`MnsU1 z|E=+($Me>T9?@nfN&OUG4bySPajgcm|IaNJfE&~P^W`r=Y&xrxZrVYQq<=@syNA25hu9g=+`ENh;2V$bT87I zy~y7$)vsK)%KaD98=Zbu;wrbI2e7OIJtP5id(qriT7s_2P1WK_KUgoV)g_5l-)mk)N-Esluq!aYM{{3E?HNT=IJ@-0`C zf=0EYCOy+aTNXxjwO0oYifR6c^}*7>3!VA!asSK7Dd4UZW6olQ&K-s`Ta5Ag+5;R~ zupED;9J1F#*!+7^nnI*$bQHQIx9sQ0HNZ zMr&4YyWSevn0VusjxG%ybB$34gS0i;+#kcWl(xL(J?W9(!%`uRC}OBCqIM3Dw*C$i zVB-kH(}^$E($q`R|1G*Ts9|#fpZ$z0o>H`kS@ufTi10*FwN5Ivd@g8BW)=PE3A(aG zyhM_}G0@XJkABV&ty*wDml|K51bl4wh4f0Da-p)OgHfnKw)pI!(prO%(c*uB5K?oe ztS(oka{dxl6sm>1K8sShleI`<-tJ{jUF{1=zD-ML1@IcP^Ec;*txiM`=tgXJPc?ogP1B zp`!wA)SVhvB4)3KFbrz!EVc$wV;=W!uzj(RaS@+$@ZNKG^*@{2Xj#O&YIihX z*LD#vKiW96GpJZ)4M!ggd1;f8%D-3Um{=h0&VR8%VwphFnaHU;@!S4Xn-z48Z!c3C z#|NV++=Tu;em2j6{OM|e#xnwuchIG*Oy2_08yw)_YIf+uKjv(3;rgVENyGRh{O%P$h^AZ~!{U19SSES(58w%c&uJ^} z%FBF9O{;u=o=-Vk5n99g=~`4JZTevCj%f!VkmD$>C9+$R^7;bb+k|H0v3@6)TFd9n z_6KMzp1hH3xSV{47eUM9SU5Heg!gC(*SV+O_i75BnBa?}J4^E!MG;hS4KM7x=4Shv2|;PWkUuxDG6_ZAL z_)O}PMFfHW>Oo!UaV~N0=XXyd#Eo~BsCDNP4toEP6bgMTOS!I4yp%-jN1uK?DO?uB z`h6xbq>t~W1bk6h-IWreLEImFozD_mDUc6&ZDpv(+hD~v4{$KR)|n;qgOMK*QG;E6 z?;fuqT%*7Yc7~CT=|4W7S(M~lzjN2CjpH>n{(5(LGJJ8JLW7o{N_x6@;NI?_ehb+X z!LUW__%ebrm6ejd)fshN#no~)RMZJYZzn7(gr}5aiDG1qb7P5nPf%3PE03Ja?_LJ4 zk#ZTGka~)sCyay9akbfqW~n>3ivZ`u$5ZX1q1xS!=cF>Xa?g9q-qY@3ynFi*0dE6>J#+0?Md-1 zkJQeNJYC#8nEXC}#SX8~`c+@jS1Hp!Pwoi|cA*sL?X(w5F{g&XFo;F>cz8S;_z z!yTSLfH3m?5zFVcTEkX@zYRLp{?FNt*3McR?5W1PmeZ; zex#)+v3HEVF4ZUNDRR+%cS)6IE{%ooCm`#s)2pgoZ!>bF{dCqyIJ4rXji8LmGI(Z4 z2_z(cdowfQNxr^Q2O0h({gze5;_mk!2;E(Oe(;D|xuJyKD+DN?hjuRM zwCsrKSO$kz0)V|@@3^lmXKcFGHRrplN>6;a=9R9euV3F)hLXZA1khb1H-avHt~3#{ zS8m*oTpYeHmv<*bfSohhYz*6(9{}!%0N}+x!xBDUUIe{*y*xB`HatA3xLlFGf(Nzk zp$9Q&anbXz$9e7&+o!QW3ktkmHHObsvON`_t@JSD!-Ejyj8f#GAd~zJ!&D{~J{?VV zsojpuzVm@3wTP+64~imo`|clt?B`eneEJYL_1ayckvr1Op2Yds0m4?%Ak@hpaiq5p zrc%Q$<;A)jYonU8nf$wJYH2Ro<|m(nmUw)C7IQMce} zEEkLrfKV5lKgQ5-iJ7$nkCI4d!pE;6J_j`EvY|El@o6j%j3ypV@19b@=A%hQ6d|4^ zW%OJ+MWqd-K{WTfTydc1yY8oNlf9A=@Bx#U@ zsMe{J4{Ce1?t+*>)wx^Ie ze!6e|`_|zHp`^ zyb%9dA(-Yo5pQ;pOMF0Y4f`*QQ6)Z<=fgGOKb${dxWCHx#IoX6`ti4C6_$S|y}Nqz zV*vig?)Wy&gU~&HbB8e+)IK_w)hu@(ygU%$vo19op@#qj8@(wQxO~tS)r6nO8ck*~ zlR|no*=_zHhjJ+rbU9zc<~0X_VZAF7~t73lSJ2eAdbW; zn^=HTr_GlDN24Pd+Y*G*mhGWo6f$x&&h?=uwA5SR~EN_(*`cZ`&F z;%42^5uL~q!vB{Gkn_HVy*@en3lC~+yL~K+VK|_D8cr}re?d<@@(LXaVB(bJxu3RG^B1xK1|_2Wp3%V%=McwE(W?x})#zbS zd)5(50zsI;aiRuoL`oGSGeYYV9eQ@c>?_@yMj9Wx9&`E3Y+i-`3-v|CS^eL{?Bgx;Pn*9S&DA#94` zx5CH#_oqaWi8zwA-Y0G9bXMuikDKH6e|>`6nD3x#Vu`dFHUiXqQ#xyF2$YT z?hqg$Brm<^+;e;Hn>TMJvnR86ep~voD#$C7Ax@S%Q}HHV)46M&3b?%i1rQpv5lDf=->!mfGs zXN!oth?!6g%Et!b);A$oiVYcF^70Dnsc5bq9YroIL}|~AQ=KylpB@Lg-CaW@d& z#rJ^=Q@h;Ms8PrLV331gUdvH|C{(kdkcfzY!b0XSIo(@JK9to&5P(DNcg~17F-!!_ z7dU>ErE(Ltr$OF}O0TvbN5T473NfgB1JTr3_;b0+9s!LBG-~a?&U+J?S)(h?rt)9f z19f#_H$wr}>Csw4919#V|EUOpLbTihlv-%;3LeHehyQusk!qeWTt8N6vr#tHcsLv0 zUD;lahj=SiuZPC*j^QtJ?=MJ9VM-#ceDq`y}(LP)G!&$LdL z6hmUZNkZK&?snL?-6n>AyF&k&^STf{Nr?f1g0+5O2s$ZvdU?KY!}FiVU!RxD%Qj9c zxd`e16$SbC08Z)IK~3!BtZ@?W8n<3B5WM@J$NJ9`;!Q5RK{+Oe@88=uevQq!j~$_W z_&tv7VD~s?s#R%82T)I@40YdX+q(4U`n^*Z`p7q?{lqmb}J^amnF1r2y z+x%D6pVWAgvnVk{@Yh-Tn?APptCs%4fd6KsCMq5MCj}x6@$B_Y6x10j$s)D}zbmp( z;o9z$wl>F(6FPLqae=lbUj5TgNIC6VUB2v(n}m4X@^xtCRpe@CE8}mKL^G_idMu!w zdalysZ8QUKuC!bX(lGuV?@_cSkdk>>R)H;#K6DyAfLYk3Eo^y|UhA#N<2IoHKkf16 zl#l+0w|B{tC7}(wFArCozM{sUE7Y^(hp*5&AGTz5Wb*SFhZNgQXZ$BLq7$eu5Vu(H zs+pGyz9EUgI(QaZXy6-6^SGq*Y?rs<%yfM}>mAlZ?*;pdy3XI@`p&d8>obKHCXtM$ z54vf4{j)n#ny90p0F)Z!AUX4`>$UfwF*LHwKu=0_@o=`yo!q;odWzMk@CD0KSqBGP zWuGu(IxG#o|Jb57+jT1 z=+jF3zn$3j35v@2ys`IKCp~Fk>+}pF(-{)~y3h_URO+ii%pDJlwN!8(nEHGyGqA$& zIiQ?{?Mt*Wp5NhQ?&Hyn;eEOBCnTKiD@dwQ#oyWeLtT)id>s|bYZ}-ctvkYC>4fktZ@5Th&tni{I3z2UWG6YFFj77h{ z!$KK}s@a@9^_gv5T_k{WO%xb86pbT)_dD>`D`FCi-4{TihX0g^E>Azab&=l$JUWtd zVcE?bDK(h4cStMGW|yX{XNjV zR%iL?YJSxFL2xb3q}(4r@Z$=WzwX{Vym^Ga2C<~+>9*!K-E0_OVdZSMJZU*rK?oBA zzWxeXxmmk-mfXB5=HcPFVRq$&LQ@T2O&PlVjcj(UOvt-MQw9oug~ni=e_Ms7D{93) zm-P8YQ6rkmR{bT#OvdZ**S{RxHt^W2VPJp?4j{8Kf^=;&~#KSNsx? zLqv=-M05&!KhHrlSqw-KFGytPkvuiui{S1}fXA*CYMUM(X!u4}GxM%(90a4>w4S0R zlfjG-vAaNL1lRrn*9FxjlOpIlSJ#xyt0IsKhQUgk#NFkp9ES$_12P#rC+Tr`AfD09 z9EA$75!a#Zoai@-%m{>iS#A(T7-P#(e&GW65Jqb5^L$#7Q25SAbD-h3$GsE-H`%NX zrhk+``Y2I!CT(iHG6r+$<(n`_A)m*!BYjYbS;MDql+EW9r|>8?5BDa|W}w^cv(jYa zR<4=^o9t!pTUecN`a9n3)ma)b_b*ca;q&Q-to3@I-_D*5rE^ZtJR$S}d{B?C#WdA; zGxHl>N8TMJIRpym_@z0S0k&6ar$`G6iZQ>4cbp#KqpDT$xGS7Qe1g>*`jWr@LDWi@ z+W?7Aof!E6?^8;Nss;E3#%cH6fS;M?-|YMIN3KcAD0h>vA@KO76W|UO5EroN7@2Rx z4|z;{a%!})0*tNvo{*5k;NBo~Y7L#VF`(AXy%$6BPA_gB0)SRyZmQ=yW|V74d!4)1 zaplRxTDHpFY$X1(zd-feT#ot)dC2u)$uN_ZCqnb&pp*GVaQU=p7| zH$zRe$zzwf)<)NHe~*JLX8q^S{$V($+Bbt`_7bXyM@609+UoX#ompBYT0)bE{|CAy z*;-Wdy>^lV>sZoNopGw?kjWd!JZY+n18kP&W@bhsl zA!>D!A=E{5yyGz;BcaymzQTaE-L6o4?P?oPt--PVH(ucC%GxZ ze74~0)Dh@b`02&1fY;^e|FwTj7}mFL&z+<&ot5&MU+G(Hxfop&Bh+3j^SE4ku){VC zQJK32m7bAF^?3U>ki=Kj+Z^2sG@$nHOA3hVpW}pSgCJBT7z7%v7gm9V#0UIdkZm#N zdbK-v^{iA?FF82%L@T0V#hVaELc0Kk@^Ex?ub0Ay`N`tmeMEtA6_4@=(pAxzk{bM& zJH-cbJ#HPiYUKa1Qo3s~juLn8i)_L|TML(9oAXbPX>D&eQ?#$R!8&Wcuv$#DCht?= zvZ%<&XfuB%e?TfVMQM04kZqeV3|c&4m8zoeijTrsbhey+l;g&z@`#L#6Bdw-U7ubA zzs+6y4S_haacq<7e?*Y&J?1uD(SL%Av-1*#(Z5{}`40s01Y1L#DUP;Olfh!Rb%@j; z4Mp!|U9$doC^Hi)$Ts}hZyiv-m+C0~;@?-U*qm+LP z6el}cEUXh~PVMJ=KtR#-z7lbv9ZQ0oeeL8kc6n8!HKV%#G42j_HT+EuE{m`CP@6cFazf?~%z<`=ayitPDiYm;2m3#(fJzyQ^xk zM6`WHQt-0iKL&z(qfdZ`p7x%6785RqH+FonZzCm#R~eSLKXJY<7?yC9C7nTD@}X9K z(yCF2f8L0NLI3`zjZMIb)C;%h1Z;?W3yXA|dGnfI}6|s}KAiOS-=2xT>2P0!e3-Y5wKm z?f#=QCF^uJv%B9x~B&&lB)`>LD@VK>vjE1`@GP@yT^nqx-YVo>W8d=72JGe^{+7{+7*H zCh@En;`? zu{Mao(%BJBpH^{6QpT?POqjRhtb0Y2_oHdvVuueWCWHO=1^1jSnR+y$#G+pM3g{{E z$G5zK?zL$>vyGvX8$O?ngOLRaEn5y=^ZWQWK<68jFRgAwJx)dwW!fKZairtVg;gG1fC>?L84|o#4g)*(2Ur$U-g$(7BR6<)pYZC*xt#n;o0B`gG z>%BIx>$LjKMKoxd&DzkKy=lkzQ2Uxkhy3uoo^d7YYe$y}Q*`~us3RC<2?8$cc}OwV z^2C4qLZPtY8c%e*f{zCS>K`QaE@vfhpKQ85FlWVg$)Jsgwga>4^GAXD?rrLi4X)_% z3>0ZS=Iud}j^U=g-rM3lsjF^b1FIzzSq;lPF^c?wCeHaR?LXw-D3LGOUSWPW<@oS0 z)EwcZ0>H@;%LYC?sF6doLT1C8^KpvG{XZQzv0N4O=h5Ku*n?ZqAkUs&OG|paOiQS( zBxYu@r_Eh=?A3`VzqGh3vVC~Skx@q^4wFDR8LAUpgydaEyxAeIH+z<+?$1Jp9323} zGorB^s2#6E+(C+Z0Vm~;bIF0qTDJ?CPA;<=@g$kO1@6coe_j5peG`n=Ef+6V?z)iS zwH^xmyYKG2t};RUw|RkKAoyam3e$ck#L$O*Vm&Z`xC(I!M2Pzpj#+Vh)DJxx%lx{Q zYy48zaqp4`T&Zm6Efz$8283?mZCQ@C(=p^*4xRvE9kZK-^~aayUOC`epeHA0Y&UMP zgN5n|EEGn&;|oD#V3L>$qE({i(mVfG z9D-}`Oqic0u(>=t7irk68DTD^OJndfk)@?!x{oJCK~`3=ujo5gPU73+tZY&qbBn3< z6V`l7Wm+CSNxuqKP(Z*Y5mc0i4~Ha*IwIc+MN;cK8@rEBZb~bfB93TUAJ}r;uF;0` zAjf1s<<|j#y(9V&xx#hbIuZAD7Kb+4dtH+ocHcsmb>FTC<-WCX^Sca~6fd1TVN+?% zg^{o=Y5#CkUocG+n;`fcp0s9T=P&%@4#P@^PS3nHC7i`Rm$ZM;q!~xj+U7x2{Eb+} z>zwZZ(Jj;oeK))6>?@E1{WT0K0+l-}>nC7U^5sOgeZZ-a9+m5}dl{Dcf%Z-2a_j4v zqvj-)mujnFD&J)ShZ!1%Z0X3&8DOB5A{zT}jN?nGhEF;5=BHs?NR|l-SR~`xB~Udw z6Naoxi9&#y#C7ahXHFLw9pn!;N&x+;G+#6Wq~*NO5ikcp=lU&8 zS37?0_>@s!A_x?kyU0KI={z{HGfnqcA}HiRj>)`jv5J~TPy+B=OKkbB6)0}7W&~Ys z#u)|*k9`ZBR-nkUxpg1S(*;Un#+z1erc`K2>?aKdDq=` z7INx;;i)DWWWJPfv+vnw;u45>*Ifi9c9>{_$xy4-R%Ih}ha zJKEn(({}v~>b(v>*qo{5M_wRp27wovZT_WS0&i9uk-a#0zRzX?7}5l5NDd5vs!D0K zowb{@^qJ)8^;^)%bPmmIRH(8|1v)vwm8}k{S-)nc6(v-w(2W{70sXjz$xeY)^o~%+ zC=E?|?&iwSf1g&m+k4sHP};%(peOW+AhYH2@vCWfkuQ;M&_i$oIi3iVNDO&;#2K!W zy`JgaN5W&hhI4ZnnZ$FjE$sAh_VtuT{NSfCR45w{ap_WjIjP?i*Ous4$kj}hYsv9> z+^W00mgbRsd0$aNbOwT6v0p@alTUeyrpM}y=Q|!93i6&apO#A?sBm5^*&Vtn2{+l;Bpw-I-6la?DB|2ix2bweG^15OS1G$~~|RuM-0avk9%3OsRZ ztFr*c-VSchqNQ?aT}c%KoSmk-jKCjff!vp40T;WESez_KgRn%kA{_Ng<8_~k?lBK^ zWG_W0Gp`pp#1e|fPZ#xNn)vT+lQ~k0F$?9mkg{6{@Kb$tf^k0|y}uJIEM)c}4m{L< zpR^a}>n8{`i#mSFVdPUM+|j^`53CUkk|2eK!$?O5QS|%?2RdRoF{dSN^CwRoz8tIy zHXe0ztHbNG*Yuh-d&LPUUI=emw!cY~uHh(ed^8#voIOgID1NO3_*|kF2LnC}ClYvlx2pSELfxuYNas5uYS3=vcNm z>-3)G?%;_#-cYbLEF|hvFvS1jBDXy>TxcuY?)C~l2(diynneN-giTvGaBp_r*=Vt{ zJx+>x>D9oYPh|@Hv&HTBblas-Bp&<4@g|qn-BahiW8?>wG8&z`Xcq4cE!Bcd8hprE zEORG@|NZDtfk?u~lK4*jUb@6{ob&}?l`Sy!OfIY}0r?es1Xhs(c)?$L>mP+MR0jzy zFt@Tuet!-d?W80vb#mmxXw@tInr$eQW|r^ugIwpb2(jOS+}%e`4Z4rYl0M$*ICAcQ z_A-&4B;)j$UH0JnA>~XHluUVx!!O@3g!s&9ma`d{8u)>L7{uQ)62oBfNiNa^wo9)m zup`GSQyL~F0q0QkL+yGwCGI-k8>Kf|xvkV2-FZV+p%@rzA0WXm%EcDgS{gO&+MtVZN_ebdN_N&54S(#20 zad4bFp=aU1Z;L;y*>V%%c6Md&5i^OzK3A~txz?)(M5xq9c#g4vw_~(LLn7R3Q_X*n zZYtAY>as#cZ2ElsS49Ra{~17k=Z-@3lNhc&?3GarKPB{X%8)A_!8eP5C)cjq`?Q_o zcs@8RCGnr9>#8gBB6%b!W6~bNBhc!gSrLzy4|3f~{mEEJCx3}YqD+m&QlfH}L7IOiTi&_I!L2xCBvFUjNw;T;>N=&OyReU`?bijWG@2^ME0Qeu?i>+;P0ImMzXh zEr@}v;FzAk|ogW3Y3I;wK58uoB@vMBT=X&kY zOF&q%tkvL&G-WPY-EA^yypUeV!>LTtw;^cFldO-M%S8*bLofnf=Ct#ZeTW-VWb-qT z$R*ki!zdzsQ^?d_s~8`XeD4eK2R(ZhtUgStDJ-fdca#DTt{?I6ghW4(E6Izd@k*&s zpkiVwmAGzJy6?H}{ucAi&K^r<5$&LcGSqrz%#Tc^;EAXEle;4!&dwgQ_j)G_?!9Wj z7O89>jN+2s4k&j7%|mI0_$3KT`;@tP(Kt4Bl%z<)O1>SFEu25*^OjobGxt15;;K7Z zlu?FoF$MKXZ)|C(U0-cfQIRoYdX8znIjfH14KaP{iw+;sllPmbczZjJIUAYWotsy+ z2*uI{C?)LM0J49Yn`i&Xk*M{vf&glsZh}{k<;hFGq0y_{WJcO7KJYzYV;iA&X0sSNHVM|$DqeMDmJdASeG@w z<%AUksIzq-W{44Z$ut;Gyf0hGNn7YVa3S&S^mdl6Avz;iw?>qa)c{V7&97}YPCWkn zT$}f$@#|D$2bEb42l*DvC+3Wfb-wpczbAX>i8y`G;iW>Qk_$b%de6n=&pJOZt1uFe z>otIX-2_5JAJ-V(?A5Dk_+Sc3cYV`WVM%XtXTBSl<>*S$L`Lx5x_68(ge`=M?O(F6g9e-cP26zGE`k(5=WSuev{C_U!x^tRmpmQtrqBh4dGqYo7OGdj5cKg%H z?&GOq*#%&pYGR|i)QWz)#VJ6Hx;BF<8;$5)uqyWZmR}NY<<;VrY?S@gC6u3|S-tpo zF2JqqQ%Ly_rDc+#@$+2)I=AppY;B@nS!&sZE1MOYaP#){fh1jQp~%VZc9%PG!6$i+ zDNjfVHiYT4tMQK4F`w&V>pTuad#!lfN_gAEL`u}NQF@~nXjw%UHJ+t`Tg2*1zB~J> zpLrC$itd!U#9k#bvyOmtox{XP=kQb3!3uE36wN|qGw)3j+@O1P1+wyb?5bK;^~8zg zc*W<#haxX!#8~1xHY`zCe&OQrxzLy!MwMGO8n2?3auSruFYm#3%Q$g^if^3mAsx-6 zAJyQOiGXWMI)t-oo1Mu^x6QA=KE;-whcYz{Dr??RF2n#P!0&i?@_XV^lyvKJRoYgX z_Otj`%N8(_l0Oa(#MC2f_YCQm08~}Qj+(X(GADF~*o*G>M1KJWg0<<_7~~^1NVZJw z@AX6WzT9JDah_3{;Sh)9(gCt(P^S37;N#Yg^2)|Vs9Fh)*FtoG9yvs^8kv0%XmEc) z=bLF2qW2M3X2>qT6f{^DRC``gh$z`s-aup(A~h!~IH6K)%M5Wv-rQj>{e1UYpGe9e zX_W4!*)q9+;xLq*F0cD2T>>1`;W^poBZk^;3 zhIe$}tWXd4dlho=F*Ms($Q5@s)=*xIkM69FpX1IOgE3PB(NqFH?mdyD%uT{5g&rW+ zkAYqUw+kH6baaLdxZf+*uXgg`K9x)43VvfkYKF^aHPf7JeT=&fG%+tS3!2E|(?r5l zd3PRBp47s~q^B-Z<5PkLW7muF%QS)6uxNL`3)`jZZZ2*}kgk!U9Pzp4!0SV4<=cKD zNV!Ou=Lbn4!SWw?OKq`F@iZlGrP!HqkaR(95JV{W7CG-%AJdR4dsr$e(&zd7Hd>{P+)9%(PQ@|=w`PI0p-!E0b z_!4z z9Yf_i&7;iPV?6S`$D4omzFH8?LZ21*qq0e% zlarcX+c|+!L2l1QLWR+~fPdZ!@NO(cauP)8^KB*C@fPTL)}oB(Jw1hU4h zpoFVwWFn&W*Px;DelYNEzZ{`wR~Az3+M*#sel8u`wt{G(Tx!A1wHWT&^A&DJpHOV` zJ&j5G9v)<06D^xKcFad(GH(iwu!3t!-D-?GNa|A&OibiUQyagMnep^!fYFC@okgjlgYw4M>f)(E_AYdKdThP@}!PS2c-K-Oea2rz_ zaC)$IUTu+kBPv}nrSrMA6_|}=E zZ~OA$ymaFIU#x~tsbKV(nPOvKX;B=4I$MO&m+_ez zcT!cgwg~6z*dOcg*zoZ&{o#fS!I%~8OF@8Qet~b&VuD7@(RdjnTBM}p_ zb&oh5&4aAyb;q-dCDldmzy5Af z=q3vI0DUe2!@&p6K~hx?fUZ-(X}I+g&8x|40y&V^W^PZ-Wd1}|)nb4u5HiS&F^=48 z1BHu`c`J2r`wFDV$Tx8=L27`JbS)fbFWM=0JSAg$5}!JXjP8Hm)Ge*!-07_cEQ9WJ zm7f~`=vJnRR33hhPTFMM}s=G!pBPdv5S1S6Ql=O2V`LJj)e!*fWTpq+y8Nofg* z^oYe*zD;Lw9W;E<)^A-_O=28{G{h^AtoU~hD0^JzT$+O8&UT0=#@VQFvwN(7~Kwrirr0T`+VY00c&0*N!DPmUcm zXhzQW^f=A5Kd4a)tYSR_4XkTF%o$SwL;8{3IH5Pe^UDs4UX!yECuhrx+}BsPTNJL= zsxG}%!kcHEm2sW1W8oUNGn1g0h-=X^`FUbu;2GP5GO4x`zRr>Verku&RE-Z+3{`sl z!vXP1(vT)QV!^Cj@hn<(xY+Ucw4ozRGb%~k_X$@=d>fD7J+2~fmN;<5Rdld<(N9G6 zT|JG2c`T{V=B}>LW30sC(r4_-=b8>Il$5r5#+5?=3SW8p7IZ)^wEpAh=Gb0YP0f$X z^l_)-wO#{Z8NM2a_#%5u#&fV06GXmEw)-=9=R{UgEVIo<@?%o6poG$>m3M#(_Q#hY zu)H_c^(~I!Xu@{FF=uM9&7?w6-!haMb`}ngI-e}glxyv`vXeP0&ZTMcvl7FusU0)BtOaB$bPUSKgHQ*h72fp&tOK1@NAjH)dIDA6 z0iKUMhfObwNjI=pr!sYMyT|*`-h&hp;M`r;Alz;dggMB`7T|mG%ha^>NnPw7=-^L3 zeO`iMAY=%6sr~~EIJrB?Lo=xqbx5!+Z0U_wz|7utssDic$n?zH)UC+m@V;>T$;RH~ z;uNv(8Z9(^g^1sA%407e#RCq?NXqo@Q|?8$0hq7-kd{9~L%WEaI0c_k^IGBuDI~K~ zNhoVK-QR1x`-zB5@==DhHY{oNygIJXRZw{6h?FO#Nv|J{prvpK5!a5-oI)hkH`?4y%zoe z_w)~@Z#H`VKF}ULI`bPp+?U>0&-@$HM7@-orHv2Y#e?jFFRtl_aG-br6!g&0=_3iA!go5E&q z*^!?^&f831iQ|3R#%!(d+!8eO#_LhGm+O@YhS))lh-LH0Xhe?HG=#eKlF#78(J8f^Js6vfMh z#}@ropB8fh93rpWlz)kVr*Tryc;7*8QfXgj{h|OK-gmuQV(JUVtc0i%ZJf_uZskeh z!_)(gVAlH%DH{2J`_km}J=EgATbV*Umb4u>P-O5$EfBHV2%B0>m zv}dLR@ezg@Js0ffc_p}PZ+{)kIM^=mi6LGp^-zYW3dSI_z4GM4X3~yT4b6xnm8?9m z&a1{>u52|Lzhy;N!Wndp$~nRp0Pd9w}M|T5d%K>?3OiH4A86b_(pm_Hyig2|m(4 zvCCf990ECCydtfBpM6PqhaA7qhaIY%_sj~o2*ztNDP@pP84rBRky5Wd7SXsTd#O<|5$$i;vU9@Gzn_o2zgnkw~lxAM?O}vfxJYvz6?+oE1 zF<5HCoUqL4$_3pxFy!S8oOGns+XnJtf3o{@&>-+pVE$_{+b27=?ep=vPO_nsH^-mp zwAR-19fy70A||BTh3v`~_E#KVY@OS^Lj_hfFkQP@yzGUo(uYu)YFO2=VOtIdEJkqULv$r{j;-jn|NBn&jJ*B zx|;Wun7Qnwzq-=2MW!CZ>A3!jj8bG>n~a}_9z~>LO~qG_mC61@6)&mWKLYjsH#JJA zuc4-&b8)P!?|&Tl*!T?NBSxrzpNC;-&!0>ZDkwt||CS-6vpP^by1A}2z(gLM;CzA=A&o8m@2;0A`xXJ-aU}KdH43u7 zyVPqwec%veoZN;X9B=vO_^{`D{eypHJN&cof-%)EVME{h2e4>?SCH)GOVIxxL_2S~| zovPd<7M@~QFHJb!PjNG8$JCgyvrB$5s;+tbkS zzL3{MUW3jYwOpvFGQC1c8rpNhXYd0NUW7|7nIWb5Apv4zzMv@2yX!eUHJNQUko~oc z$T8#4Nv9<8=FVRKV#`4c-$~F*PI>dBL@$4_|E0$;Op0mx7HnWut;qgR@3SDYw4aci?eCd~&;Xv=F(z0EY7^V4 zx~$n)1%(qU#qV}IypX+S|HV#;V`}lfzAKjloS<~EcEQa&Z=?`{DN^qJ&6TYo7_bF?ic%%AsW>2rZDxx3fM2&iDTPq%X+Uw)k{- ztYW06V#{6Z^AW{t&W}p*-y~^0jN)2P2Z@mIHezFFB*V``9_>9eh{y-<3 z&1g{WZC5Y7W3!0q*Ld?d;~H0mh4hg!t7fghAW_S#h8%wT5Mq1jFO0loe7ez+PS-e4 zeOE=t_}O;#Mbd;D91B9CIJDjxhK6E_CMs$>X!*lo>G_|Lhj_^mRzg}4GirWVxv%;I z?^{aB|AL6tUiF|3hu&SoQf{Tu>z`-JAfur&Ssre(ImeYyreF$WOL>|6&4En1csXWf z^q9ceM0Q5sGRTp;U`+pOQpTOK2y&Q<$9(4gCNXxrF-;r9xqd_Uq9au_Q96>szO{aF z_EHMbHn@NXjaqc=LaWy<&u}Img00g9Qt|Va`9tTmScYi={xkA zG`8U8a(w$jHj9@5{sazRc}61&9`tZ0M_Mg8y)ar|{<*f$zM zpe<)%4tjr0sit$E@~S{g%^-{=uA#%zYROIFc9VL-tALWjQd+be&melb(_6Al%M{;L z)ZU1Af0pLWU6AC@C^DAw<+H=(Z#IOk#rR<*CC4=jBq&+(sZ1p>?Bz-#DbM-{dW}%C znA%ISCE0LyQ$Hk|+H{;HNBg#GiHd>F*Ztz5xh7-2g5fmqkq0(9Jwa?NkKaOC$Y3E$ znBHd!UMC%?jaD6QR9c6eQh38ktKI;Ni&e~j^Fy>@Wbu%>tejj7IPU#>$L;PIt*{wO z6*h2*D(LumBE!gtB3fq5rkp(hp+M}5_#(RKA2fc(T1|XaB}GL#8Mj)rXEQRP>Bukq z%O_{*dY(+O>RHr~>x5i5dwN=Jq!q`HujAxiSThOOb~LUZ7U>C+OkTAcMYaq*0-{`l zMsA7B@ooi(mNZv(r?-5YmT?F_y`K~sc^$QXNw&I9x!_S`&a(Rr39kjifEzw`+22e? z8ZYSq5j8@^c2Tt91nC*Q1u=|uPKWb*qvzt4eLM?9USMNk#(sVnj+UA3fPq3q9L;r} z!9DyRL`U$OxD=q_*tP4*P|azrdrI($j(ye*qKL6oGjed<=u+dfE_=p`iH_ZCS+a6* zC+2<5vd!7Tvzm4}{Bg;7tgC;3?ajcvn#W1)j&Vf=mcY(2moL==bR6-P=^)=lerVL> zru|h8#n$G)$2ueAv7J`+IZlHfl_#mFQ&Uldd<@e>?iS=9G$&ZXflLJYwLVZ-Zh^GNx*n0Rzy}%_~vuwdYaO@H?0Q=4y&tcT0WCU{euTGyuhhhjojiK z%8EN^{YyQ0WX!K<9cW2{vh@6;yaI1xL+4wZH*f3uJSzvxzIKfV1@bS28Rz!V^U)K6 z5aawmSA(7EE`mKUX zh;wZ{4ejt?cze)!@>x@sJQ+n0z*+>jYjUMR9yHS0_y;GPC zHTzM6_=!F0Z^9GSVB2jb>{!ANMN~yme{LGX?I1Hd&>Fi)y4SbWE{#$ebUIP)3R99> zWAWb~9^8CU2{;^);gkg{)ScyU{p^v)BGqA0VQ2D;Vr9m8d$!DYxnpCG@01o$vVtmL zDLC*GgNiKfqvO<^G1v?HxS-B{FZekd`Os&DS0`*&y9#}f?7_Zx(&%^!rkuUGN6F4= z`Hae4R~xd)A0BEA7a2B#HG8u!O;cZ!o;~o_ZJ&2fmpHI?%|sPP>WeMVI{;{c+{xa(mX`{J3<&-3*D@P)FG(45y#GantP`p+qe%yVCbN8 z0%Wd&t23tA-^0q4QFBL4%tnp%dVlPzXx4Ajt=!H^cfFM@h*pyxVJxxLd{l z*3jPCU)5;?x^<@CxdK@01Ss-v%w(hcxD1AZk8HZ8^yrT%OgnoC#3Lo^i za$+m;uP#n1;Oj5R$;wIi>X)6k``=`IOQUog9eyN#) z@M8iL?e2U9ckp8cSewkL(Ex1DZ3krHn(7hf%<&0CxyUTqn@)Q0siIhYscxV*wI}7L zo=wjKOPY>{V6Yw&kY6|uYMjrvD$4Q>VK z^kcJFq3KL#{>^el=9GeAiO+45U+8zN^1fAk)6+p3gc>JyjQ!=mPR*{^8!Xd~BEmjG z;blUhixXX4NKuW^!6TNrKadvZHHOd{1(hzubTkmR~e}EKMW^H zXX8|XCpacwmFAf65_Q`S7nQ;W8ZqASD+G+&Bx=yvB^4W!rD4gtVd`*c|CzA%>7~f@)64fM3_wTjpAkuI~ ztO$hOC5xpEcW>Pf^xeR3B;71`xY`8vst63(sw!hCDUrkncrA9;OdEKpQh9+B9^_!D~=S1au!rt`4os0>%}?1O|;tLz!EkN|7R zRRY(6HhVx?8E!If+_zVjL^c}7-)79#_QCO)VN6bCfG|FTJn;BvT8>x`MtW?5DGL@S z%KY742xPBET!l+!obV)WrL^ziBEnKdx2O+FHF1RTSzR&44 zoAVI8BIkgO5$dh4w$pi&s&{LBct_H@wrs_mNgF7bpX!U=-fzVLhMzxX5d~@}Jst20 zOtbM8^z+Ds!#7)J9gi<|*ZJIv@cUXNJ?X^COCXUb<)97z`+Uqec6S7VlyyenbQjV|a zJr?3qGjL-Uhdy*;jrN7OMMo*VGdb~>-Q80T%fYSAToTdQ;1@JKW&z^;D^kSPSzk)N z_R=$cdn=0mNXfgp*l%eaRwHcj{H|PEA2DH{&O`;a&1M7*70HIvS+;@`x1aaP62EvX zqkmd9rn5FKRp$G2yOiiViDd~PdN!8yZX&Vzzh%yD?_P%Gk{;#l{*n#_Yvt|a{lDiHP5 z=4@Q!>=!-cxaaBSvi>cdJn;^kyr^=NpK z4T`x?5w0FKpbxnr^jMkO@=Wn3BU5%;fsm1tv;!=A_W-6Srzi~#ym%ovwQXY$FyKr` zleG5(Hipc7r*vw$>=Zm2mO|r&IuzG-P0tyVS!4~k=Jpl)uS8hLRnbDWf1u6Q#;f19 z=>~1m8NfZ6hsvAK!MgBaGK>tcA8wJgcXDoBw&u#E4Ai!y)Zh1REo;r|T*lM!!)%u- zwU0c7U{O8M7M<~^>{u-`=ex(-=Q{X+G$rtr)K_9$>w`l658e1s~nq1N>MFd zjuTj$L5b@A&Mq;_8L>dg(FB0l4*!(}Q(!(&Qi4*C!w&5(rO{AmL9WCc{?KmRb%8?a zt{exS@Hb51(jKm>DPTx$*_nAQ=yY0T`L)_g#Vow^W*CDAm-={d`=!w@l{5f})mtUy zgBHTlnuw1)9oTKYjHE8dSRilAE7) zO^+xZO00=QYQ!WRBrdaZs9#R#LkH?(b?#0mQPGTsZ$0q?R2#vU$cwRNz0kQAdJcF)wvE){mx#66xuG+FRY@C;Xt-e;!QOxbP=Iv zR-BwN8&`216=U-L(rJbuFHp@3S{gadIG*QzGUi6jJeDD*>a82?D-09P#d-M&05X|x zA~%wWdLzMOLjeB}F5_PA21+G?QB65EGEKGB#P>s=v1>9au*vFE{1j^D)aF;Ob?>}t z&$BPmj%Fto>8bp{>FRFFFpS3>(7oo8$st^Y@2njas;u;7C{;8q_9Sd$t1=jD}&!q{8V+-;ayV zCO7HG1V@>6NsXz1(Rk#zS=-^d=ahyf`p3zdhcSOeztxHKGry+?r`k8;-MZUPQ`9ETu+#F0`w)NFL{2RKk#TOX z?e?0E6~LhXJj&;K3y&RBKnb+B_BqjfEm=X-jeEH-IpdzRLe{eqZF@)+_UIR$`4{yd z{HT5OKX!@tzr#hlCQwh-l# z%GBt##pL>_SyZ_wD8nLY{ts7Y9o5$M^!;0-rC2E~E(Hpd;_jprYtiCPuoic>&=&XN z4yCvTcS!M~!5xB2&;S7vAiTNvC(rY|XXT%>lAN{9UbAQKna_7-#}Nfie{ZOLxjYd| zwlMmEa1ZyN<)!hBqbO7jM*g#CRCIDeRd_cJSRL+@_H1Vy-1|^bEoPWxFMe~ciJ3U& zndszGoo-Q&SMiS743kH=HizAK_DTGgL+{qtc|N4_Xo?PB+8YpP+->R%EyK^--gH?6 zxhoJ;r<88Z=yCO(|7rJ6z^*3EqS#V4yq*)!jU3Rue@Uc0)P3~dVlN-Px@^;G-Fz)6 zVLt&*!hl^V>dRQ(b%RN9mE;s6fwevc#udOk59)f4nva&;_B1#aD!5wfO3U`^PH&sy zjp`_$$%r1bIv~qZ&L#7EMhH3L$eAU5ammXn6E_lvvbu4Y>DIZx;H8~IK*su{B72jq zg*^J~F*yQZeY+S#3AY`eSor?ZOkFAA*NCmo$2$&Vt04w^z2@U_M>BYNu(0RF>lyzm z?Xg2oegwl%;7Cs8DNSA@$%H|h)%RwTy^24hBmL<_EAJH(EKlBdSn$@m7MO1}&vJy0 zB!{VDFhYC4KDv~}@Qj{(yPGl%CIgTJqq{Dm8*;V!wpOdE4d)1|lMaCmKxEn-7zS#4_+?)JkecOKCoY8jo4!gCgY$}255Y)6M@)X8 zP3R70r;tOLki~8Tr%Uw9&!w6fml{oUPW&3D(7GJyD`Ug`7bIU!b6!^{t0dB+`aV|W zGY$5}Z|9NaPk)$LiVGW34rJn@;jkRa@3v!b(9J$SlW`n5gZ&~U9GHy_Wn$FJPYNj{ zAq(s)O9m_^GQ5V;;%fYQnSA4>8?uc)UF#Kpr4hmu#VT|22joIUCj#~~v}pvrK;>!L zCqz8cNn~pb5Ihv;;IN5zOfNS87_ZBp2i6v<-3aWqtW2*z(U-)j#hsB7;qFN@QL16c z&J4fyFOsmg-(eFN0+gSQC)|B`y#9DcArxMi`C>0+C^74Puie+YE8ck07^(F{dTwT2 zV)@Vf;&c`LTncnnG7}6)CyqbQV@b31cPT9|m$k9mfrWH(RiyE5x}QybHaK28vF@G1 zOaRAwmNj^e8@${x$o)NWdH3nsn=;wSPFEU(=abJjyIi`n`G{>jefIV;zcvegP*jw5 zcdx&|k{6k%sVU9WkuP&pEi2|r>tB+@YzS*g1>dI$d)thO^+2qw;Ws$4XO6n`EXL>BTp@e=V`hg$APnp(HU}iOn+&Kp zSy>eW+^S-OT^!#=M>%YJUb}{eQQ5)-liTclj-V0;#7kTBcMw=$cO;c>2N)|r*A|Xl zmf|D75nQZxWZs~T_lK{x;esP)sby3(uX(qMaxok23oLx5(xe*Bfi>ezXKp zk_P3`&#h$j6c4Xgygx*7%jmWn-5qIgcoJQ1xrAEP;c?s4-SgeXwh_6y%F@|l+o31~ zpB?7hh{Z3!UXcx>AlhDz?-u(=SE}x#9tBtR^ybwUP^56aFh>pwsd?}Ss{BSykev_h zZj3w2-9Rya46qQ6gnB{r1D>+7yuz<9(-yR;;a8?8?$`Qz_N1qu@5M||qO?axwS9G{ z#92(HRX&%cheu}!kk%ejoEBktcUbhw@Xic2owXDwq?IBrq<5dmx@7mt~ehQ&o$^VzW=5(Dk^!$z4=3M>` zPX7DZGZ<^=L1u7u`yWU&ES*|9s;igF{%^Ku%KvJp;!*84Whl*NF9#P1eE*-aU;OT% z9vj7;@?as8!^e)Mh#Ik~t;yK&DXZ9eU8RRkR4-nS(1j=Sy$qvD3{EEbY{ga*Rj-SE zaevw)V47|h670EVAFlQV-NvK~nhm__Be}yeC7-PS@GIR&XXTTV4M14^6MWa+T8sIt ztBDQtbv|3k9riV<4@SAnhOjbsM|3{SO+2}WXhgOvDwq4q>psnxju?A0`qlfxBCMyA zYWjKC`WjNA@+;WQdiCa*1aZB@A4Z;(dQB4VGE@S)GLi7RNCP4tPLmOxa4dK zX;!gRQA^@M&g9jly^YgGwLfjTN>_5KnNMp6qShx_PSzF!r2Osc@##MC)W|GUMF_*|X09sMwv&9areheIn4I zZ&+>5+Wg%W>yh^+RZaWt{v~Z>b&!7s79=19sc>F+oPYE$xibdsJeccn=18Zc`e%rS zj;rV@G=W-T-SKz^a#C;hVNv^|h+i`N{~kh;^nd7AFA5}< zVKDAd{gl9W^xd8u-Al!;Lm<+nVp_HFk0siEQrx`A{W?zA@p}sT)bD;Zue&8lX1%^cF)Fpdl913*=`oufxc8;Eht^+iL-KepB6roIZ+0tZNJR z^c!sDJ6<*rTwU*TF>rFyx~8yqfBlu);o4xY%LphMF@DC#D)Gru?5-ulx#P<1_xnHY zjZ1-Ew&IwbJ>buRdWy4T_I~?IKnOPTnTTKHI`RdN)Gz=~l7vLE(I6o3=A+BWPTSjD`6Nlv=x` z5Uu#gHq~MZ=2qAHzo8kI`NVnisV@)?c}zfqn=l^bYN_&& zx(LR%Z4}!@&**fqIiC7w#--8_e=dI2;{x-SHqRUG0+yd&rfJF7m8w*zA6}yxPpR520}u0-6Vqe{vKBRlDps;<_LGoN zgy=k-aegpf2f2!ffSC4woMR?wE7tf6llR+G}|C{v)moc9jeua3sm=EV*pKy=c zD39A+&WKc^h8H@&>Cw!V1vC{*>%Q&}{>D%eMj^@ZgSH^kGNFCCja<81SF9+5`U_VF z?hZ6NaZy@7BO||lGSuw76&M^{Z*}j7`%HYsao>2iuQPnE^J^6kNugOm>fH3K){wZJ z?wRB%8c8G^TA6FhN*GZFewT0>zpi1%aP$L`rNV+uvR+r*Lr2KeYxyHHogSiN#3`+=9&wYM82_D*C8kHcPBKs*WgLx00yB@< zZiTQZKtJlaS_vz1njBtRQ!d4+Z#)vXG3j%<3FNLC<8@&2N;EUMI>~Bz!w|1W;&kWy z7&S>+OJwW(w{4Pw4rsPnp-XW`%MF-S?g75GtFH68+^y!Y9QovPli`S!q_e5*4dJ=dHwvAOuYQU{azU3Fi{@(_(0a4J!ibrAJ0z=Ia%8iU{V7igv&4=ax z##Sv|8x?}=x;|_T*bF{4C&jrZG-vA{36S~X!HLc8?7JA32+!y`_PaOw-P_k`kK8Vl zTlUUxTmHY$uJ>V$O33)8&p(VVn!V@ZcqK%D4fb_tYif!JHTqF`=(nrt9sba<&lA~h zxxot2eMuiOY-|~a=iWKDT?AtRA=#CfNmgzb@tj05n{F{&LmPEl@a#}Jd6mw;+7Rot zO}8uZrph0B!t)+)HYlg#@5ccNjvK%xyUVBUci6J(%q39Og56xBzs9@NWYCie^ci+F zk?H&`b?+2CM5==FqL6SF-DWq8;3p1kuf(wh_&t`tI8HRRL07zK{W|3aT~~B~-23y) zJ>}=AoA5%_Nr(ZD-MLr(7mM{-02+sMsp|gZ4yT;n-lMjYMWF2<7+dx>LnLu(9ha66 zTEKQB1-g50ePQT>5Z9-q+CsoEaQSqkM#bMrl=d}?YEclHnpLRaxPa>%X8bQ22g83W zZ9PE2t_KP&&E#644h_|A*d5jJd}aGwKFLT@tKq*uZu5Qu*{P?@+IFH$-SonE)nSn1 zs-h%$`NmVzK?PzK%GEZ*Nc2emro~&3=DlH*wUwma+Z>QS&JI=pF1sXPHRnSe6FCiX zc^&pqw|^66t7VcQO1_QJbJC9Rnx(_GXq()c!M(23*v!A@9IR(0VsOv(%X6h>YbOEz zJky<$uZKXJQ(twitIgoXQ%s6L~j2T)>^V_EUO zPelX>S9Z5c6!c0-#9Ez;Qw>zPO&Zsq;4=P+P5k+3hD*FD2`}Y;7@m?!qPjzBSfM$Y zOmlw3y&7DC#aKpDbz&2qJkTM?D1oIOZT3Y-&$k2 zW5Tb6j=G5=*QxWeX~471KWU^m>>(Lq(-D^3Px^<8I z*g=cJDm6Z&FI8);=qIwBeN5)^8Jrcg=U#uj{rk`*cl%iEN1NZ%DCRsaLJ36Kcr!5R z)PnifmRG-wM53S1ppNSG6M4uu^AfrwDWKvMZwIp{TLvn-;F4opGCQ((W*>*|W0(Vb>q~9ddH<#XqYX4IWe3tb2#qn`2ypa~wbqF(?56HmdwP?5Hs35-d%}e~& z028yNlDTvFm@RDp_V{1;%iC5rgn==c7UX_5D2-l$s)(;V)ebxCn?@vbp$ z?~};h?=v$iK>7|$a%=T=pwN~Klr9uz7MFsmt2jeCJHg?5$~~ z?b@!VLwC`k`iQEWM?$^sqRFbv&x)Fyj@T!7Yn^URBu7pX&y|`-zAVch|E#9JT72c{ zpm%(2%#D?#gb(ZuLT)MS?TwK06B9wMma2ojHA7nkR^!#bWl@6Z?7Da3t#egqe~~mQ ze!JH(G)s)#mcs@Nw?6H+r*zfGT2(9p(WRG!KHSwt#S=reAr#zuo%`iy3)eIgL%_opR3ZjmK)=F4X$xMWvj}N780ZK56vp zQ_04LOb#g|mqakoBP=xPrUCll=Q!$ClmKhSQn}p)V`%51I~n_42|?b??0_EN49HIP z;k1?)Z7?g7!KhYUL{CP`pn*|+T-ks!R){vX+7EF4r>IvNcn6qkbj8D97Vv6lf5_g1 zRVSQW7lGK3d0K#f$bQOCAv{7ViF;U%DTWm>;6{W*C(mj~g3mFFIkLZ^{obOTJ)e;T zOiXrBIrbI`&;^yVu#_3TnY|PLWuV)Co}!v;Fsk*_8(4iqDkK=$zsE%+MxHhcH{6_gR0w#PMxw-lLkbke}+nAZDng-O+azG=vO5y&gQ*IQfi^!~0vefyxkGzY8axC-r%1__`Ufi9fY=XP;Sq%WISC1HYuLysN8NNtb_XyMZY zbBZ4X@}Fs<1_b%TT?(Z{l}9tT>bZ%A<<7<Lj(+aR&&gpIo*pGuM)*T&}A`N0O zT?c=A7qP{KF~_AR^RYj`Ee-2Wt^MhQxE1q(Y~WbBbe4S{j_vG4Z*q#gJ?@N=Dj_$T zv6iJg=QFbFjX$n;y;#ZZJMDXw+_!W$+bMvrohCm>IBQ~F6^&q~W@i|rl|23+oIlH! zoPXOo=2K*A6O*ht@>*rPIy=sePtX=58pWy(*gUaCy77W8%SHDD!SzeQf#MfqQ*%*@fEz_FS^0 zoHCt`qsfg0qLr>d;B}<~YC0@viVIq~@!rUy~^8`ld&k$0IcpNw3-9|@Yh8)Rs zz64W+dT$(=XnU968_xpyYChCOeoL91_&_)((=5{aRRxjIZ4wn+>{M8mjmou%Lm>y`(jXw zAT@l^z%A?yd}y@eCN0TRP}FeLBFFPiVx!fVO`ICVx+M59$WdgwcEUSQ$8Q??ln7GE@Iv*Byw~C%-%n@OG6irsP zX6HWGp-)WWv{0i|V-x+ky9DC1b+*Oz;jW;_?;{vXxv_cAH{>#ub)Qykp7;q@OanrO z0rfdDZ0eOcs{^Wmsb7tYWx5N^d5y4Te2HNF+weqCp0Y4fL-p>bHfU`LkedgxodLu( z7(V>P>tGuwb*^=E;fhRzwA{cicbtx4KG$>%`j?*d=nDA`C$tbl@~x0wn%b?kq}FyM zou@*b3+C|dwKWtpN zegn5DlNBdx34&Z5Xrv0;b0#mN{!*Xdb+WkQw7ark(l^Ku=(c8%iToJp(8jUZAQSMn zv=vXR^C#|HxvXMqJI6R+xh4H=bNe4MOB>3L+k~R~qu7FNQro(7>8t$~u}JT~Wi{V$ zC%@#LcX?+@Oi$CL1Z39P|Cu2`P48ATj+E@lmw~K_9Z>m&mQS-Di*^OkG(-QR1?VvJ z7`QZ2gkZ^XzJQ9oGEk^dOMU(DC*OQw}Nk24U^D)e7j$ z>=o)vP7Ok*!@mlB3()|CcT~dir!*5IJ!qoX+V3tx8zOeLFNs>3k{DxBjCWg-+Jv|* zUw5h5UUE=BJ3pV9-<`kz(GiE2Y5s@L+0@s4{Xx+Nl8Kq`UWgq#x}|0~rQZV@SGn&y zjW80;h3u{3L*ah5&^z}m=lKki57pt{OrGoCG;EBykE%G2uZ~S0ffZwK#)Gm;TNkPC zkq~vwTZ?5BQGeh0+sO4E=tj82aa-o!C~H$1mx)QNt^IK%MF(4fF^gwb*YtY$Y9hWv zeVZu&jUT*t!P>XynT&7^cL{2#2FJ1FzESH(Wwtg*F6!Gy+j+J(YYkkgOSxy@qT7-! zRqUEkaGY~zg0){DBgc)>Kd{-_{ax}s0)yDS^s8VEY|Sj0f-0|n)-BPrqyB;Wcz#vx zer4n*gss$Uz1B=;2gYg42^)PRfo*QXfBaudjiy8z=-l#A=1-G~Bnxd7bY&*I<;ZKV zP%OKd-qJY+FgV}MOy0@hRs4^sHnQ>%IyiF?h5@NvQ8c#nwjG_#PDsz+l(SEY@!RnS z>D$mNPi{84sIdkciq~t&?Q^49&gIXwdX?Ebbl;c>j4e;4{r%XnBWSW;LMWD%Z|8AP zLQ>C#vh7w*@AFvfxsYp}-~gh#Gaz90rAp+dGHeqac4H5gi^HXen#f!hDVs=+^TN97 zgfD|lnaiovB$$NWztOnVp%;?HKVZ#MHP~&vyddYpyO^CF_BP_=Ca?0zDl2-J@N(Rp zf_xd~AtOBxE`bMhgnQ|fzP+Hp(wF_~!oVoU$?ePp7b;cX8QSf&MWi}ZF)$nMqmpdm zvsZbOH3Vc6UqA-37b?jmoZFHPuh+2bU8i6nCb+%BnDc9#?5j1$y%{pJBUdZn4xglO z1Yy5(VL6;n!7EOhI+4(7=gdQvueeX%l}gUlIK=M&ptwP|@$2@WkY$%cjlbh!pQV&^ zTXXgv7vq=DZsR+bzvUh=*+EIGR*f{5oC;j59C}Hj#Ej%6ne`VN4Xp;~?C}}=!L`O* z{8j}U7(7FD7O7Kk0q}dal~ClslUubmT)vQxcL^~bG*-c(jF9J!A!V#iybigCcnl7M z35|A2btApUt+fg{=I#~fJqZ@gWqJz3tjzHYUX7Ma$EUdg4Ai%%A!2rn(_)IaJky=e zLXJMBZXrb*-QoIv+L7jzqJq@AVw_|s(g_YWMzx{Nz>{^i;ml1~-?qRz?YBy8mk>GT zQd2k7BdB?!?^TJ{9;_DYr@vLE9l%fkvm#Nsotgv$y@fa(=ji`!gN(NHW%C<3YJMzb zRCm4n(-_&%8=G7C*GDiPbdD9atr;!{s%sAxrh5Skk;yPjB>JOTWR9aYyBAE#Q8YN# zboY?k&1%O=^mLsz+V@`>aab}rVFuv#iN+U>-@CYzCcJ5JnaSS@8ka-U)8FB-`fRn` z)Gf61#4#`%*XhdaL{S2iIq%1rf8jbW^*IfeMTi*@PK6H`swMZ1{1G7QDuQ;Y;B%JT$wkI zIQ|3hHUACp_a|a?z{wY?cgL6+n&ekI?jhxzQSU=L*&%=4hE$FWk9I5n^1D1!fTRIs6B664|rd3^N-9i9?M@PSQoa40zxsMF!Zs0 za)3E+UaeI3-)tT~%*sj8px!E876a5@$hjG}?NpvGnaE|cmw2^PjmSeQK5lrJ*4Szz zuKjy6C^`FvGG5kCFp^(~CEx`nQh3u)leYG;Na1>BMuXXpvxynLZ`-F9k1UjGKhp8? zo4)EV;$O8xI1EkvfGOVmxu0L2%G|ZlJ@(~UbMGtY`$Yj4b#X^RrG`#X>mQDhkJbjT zR(w&3(wXF<&pM182wnoQoXT6jk&~5F#-3GMd9(RAgt|9A7=N1XwCwZGPV^qHUSSMc zP8A~~-0rY)Cngo+Hhqq*@veu*n32pf^?09h!9xq)$ioxYT^b$ZP6l4c-07ny;~~<0 z*nNk}HTv#g`LUnY)-B)!N;B^p`q#IhXWCsWzKq@9zDF38RaDF@%n+7U)N9#ZLeRGM zw$m-8Z{EC7yjbCT_T|;R_fOI+j(zWTd^v>zUteZ!t~|S+)5z7fvE({>DZV2j@Lb zQnDm^hAho1GZWJaeHJW)ITJm{A=KER5Up}`J+uU!tRGLen&LK>rQ9IfG0SL+noT`y zAr5^WOYy$K1NK+k4?kYp5j06L_UC%8zf#g};PHUl1+fyeB>^!+sOI^WeM1INc-S}l^-`9hg))6_2^~_rw1w9c1+L&7$gL3 zmWv&0i(S@MH0=1X# zwHZQ%;xk@`)C_=-es}_n=$MU2d?t8(wn_xs_fLyrV}pXI_H_k=C)@D*Nb3 z(Yw(pA_)Wmt%xxyt1s-fRWOfL!xE}NLd6ETB4qx-d-wGf((rJ;!PxWG?&8K{ z_4K8shUza{CDq}~)^{}Ote$*{J<0fMiMVjFiOb8hgnn-OQSnU4xN>8l{RLD2PfXT;G5GOA(49> z(iXXz-F`4uce4BU$K9VBs=lYpyYY>;Af-g=L$Ca?|}Go^oI zcf)I15d@bICZ(;8gP**0KlSuioXCGDI|8T(CqO*qreEzi@!R8&A*Hn8?F?;E#ppKtBO7CQ1aE^{RRI-{w) zoa)?vpB)7Ypk%LQ>BF2)5DBo%7g5E|pdhsH{#au)pNFGSWMFG!Ze88Ol@-ZdAuHjK z*sSkDK-Z;>vUc~N)Ap6CE42Ak&>q}~wrDgB%)GA1K+!7PfacnPS~--Q}gCukHSEqpezpmX_8o3=)tqG-WY+BJ7R< zmo70NzfgSaPar0v$*Xg1bLJ^S+|-iV3KvSEIL<{8guV{rBZt*RIsIci2~~2|?1L85 zNQtvZSZ8;4Z9@w2vSHom9r6=kw6MTrwW>N*{7l7Ncxjb*W4d_*JF_1o8t$C^{^!Lt zwX|1I_O!9dM4(eb|fvW`Ua9{wrEXMdPPu zpvdd6KO(ce$j?dPGegtH^v2=KtK)1>9kK$aO*ubbkMdthzOrH6Yfj1uuyrliIxpU;bYstCp zYy+8pUHWsbk$*&Dd>jOrSXpr;d@rVUo884uwjd(8;@BtsbGft2Nt4bv40Sg-LjH2~ zeJuU&|H@3M_c2ByPKkw894JC1Tr1X{N2@)>RLcML{S;!8)4Vm|4{nHJzsYWHfbOr{ z{K(TgjTXrv)A0X3f}UwKAbWs=;oleB>vgpN8IY%0_CLR%iR@h<^51Z+a-Sq-ZVdbP zRlH&568WDS(HD926jY7(%y(2QT*~qgZhWTdW?sIbQd4UK?yqMP*rKC|I$d3_o7^%s zDUS+m{I1#q%vY+U;Tuss=7%)TiN^`P!N4*yQ`wyMepC?DEHiVX;a2cZFb!uc@5|NM zPQ?@GiKkP}aklnh_p)8j0ex20hF1*Q$HnX+ZRU%~Qu}eFsjgv|i%QCG2f2?HFp;#88j%>(upTFn{G{0Dd68VKl8SxpmEN6`1d6vJ^ zipK5UP$`KuP&prKKN{}I^IE$|y4o!XF!LHl2}adyG$$j^xCTL@j}1Lg9^N4Pg;Kx0 zzMbJqHe%wqveZSfuT;I^rJRH*fXzk%gFzp213hXGO%3@S8|}=x|1jnAU?Ub6HRI1} zz}D8ZF^;81EksM#)V(uU{{YBLye`q|w~9W6H{zL&3i#83n3R;2ye>P8Hs zHA=UJ&B*^4g~H{gAb_9gkkZc7XW2x)l#-<7FvhG)gcBI+XimS{cM+MPX$w1V<82Qe zKPokSpW3{deymf;*qr@^U@t!tg2y>u*ceJ-Ey6U&7pU04(h{<1;BX5fDr1)q~F>zE|;ha~m7*k|YVx zZ0NXILV)36VTQo~e?tp3#H-Mu)@EQ&a*c3ecT~>K%H;Z?ClOK`gc4+sfN)w@+XP%Q z|M>2=e6k|M>UHR9@O-BpO1P23rt+4+Z({H z^$=LeQac{xFo@g|tyHuN|9t(J0jbVESh{4`VkDs?hv(z2&`*Qy_#2CXxeB{hQ{iCF zxxC>JCu!wm#oSo&Qa9-F;$dwN9cTt&d( zCZXd8c}`5+{50Uc$UqR~LrO)Sm9x5Ts5fPq+MbMjGre=Cu*(ISlJiHJP6%GgkV&=s z>%iWpn=iCh?X<10ab|+rx}LsB(rR(bNSbbV01MzH>fVr^+IcxW!xl@La#Y58;a?n! z^Wf=VX%*6nv~AgOrBBcHkGnv=W!M>2jeZtPjsz_a{5^iQylAng&y17|25@CW^NC39 zk|c#Q?wBX-FNJZim`@wi(nzUPb4e}<;?K)A^v@_9Fz>AOQQ{nJX$SxL`o5^anFDV5 z)sh13G1wKB>T2H*ONF?ByK@XSN}!r_)=R82R`>Nl%k}_4@yCxfHl~gB1xQI^jPUzI zHot{EY3l&NY-7qg{;{E4^KNEvsXCGV2*%ejC;x@^$#Jxw-(l4I4yFa&OBwbQ=WL!XrO73cjV9DU*jI=U!2 ze>b5S+C#0@*dPaM;UAPb*XTSN>FNI2Bh2$g{FU#4md{V-AatEEu#P8mQ1!N!UE(H+ zGUvsUtScMn2mGjyy-kwWKe88bxj5P$%kwh0_d2q;iuoTWb0I1M#3S>_jC?hso2m@O z`Sz(^dnl@Punbnif4^zF>8&7;Oc+C!t9wL4HfWN-Pfp+V#wNK6wRpz6NWA=6#s3Z^ z`LvG<)A$$bJbn6*5%FEq72nlbCioeR$2}I#o^^S;B_iPETR&7SY&}nzkEc+F*Dvwx zu1lV1E!aDU%{}+o=Lv0C^t<`+Q@0$iB7oc#Xx=FI+`R&uhKH zlACFbyhFgA)mRNaXxWNWx_I4rPC&4d0l0b90XS29h$by|x6!fbJ|@&j%&|JUiI_14 z>h}XmV9uelIWvgpC`ETKf9pe_WJ~G=Gkcrw$ z2m<=M02&IcSnv%r0=QnH_aly1h##LsdLPd^?8gxAPj47{6?9lpAy2Q# z^F4ka60d)BL*&X#z9k($jpwz3r^^OXR^ADk>LBbgdVxxvY@SQBTfF?n=iO9f`xjd7 z@#=eXIr1z7_wEB% zzD+8aZ(+uL5w(jttJlY{BF?)lBgHB=sMF0sg7*^yYv)8xdqnY9hRh+Np1!JQV9CS!_RTyOPklM+0ym4M$0;QIbg@lkP{)V9mf{> z<9=Ws*D4VaB=oL4J32+O^?^3|$p8^1!tq{nL(HB8)PAL1z(ZYd zvvkts?LMA$P1y`)UyC*q>WBTEFOP?%sWA@#p7_0iqVRF*ZLMeQ|7uniuc{Wi@xy z#lU`Upk3Ykt|x!dV5i{q>|3A&j0gg(BDbvVu3C+@RQm)EH(j1Y1i(NKNCIx(Mhr>_ z3@xXj%UC*8JqgtBIQ);GSMyjG;q|4Pwn%^H^3m4y$Ycej{AAwrhPUTog|2IpqrKS& z+v^47D5l*;%Iy<9ZCVq7T;QXOn0}kSqMaKXBf8OKE@I+wWY7QySrz#L$j#E)`{j-J z(p0XcPC~Ag?AA2gbx-1aY_o-yMtWWPWDTt;fMA-TZ3%N6+11Nfy1G717{pctxDg=a zEPe=y!EE&^5_`WM9B6A6BKg5=MW5eYG4!u;YjU@xk)3pmVG za@Wn$4cL87n@Jt0b&c!=r<^PBl2Z!K7*4w?9*8Fe$`>JjH~0)xoR;=QcQ=q%zNuC~ z1Yb3qFZ_Pv<(+El3$4FI@%xkqqvtZ7` z7Fx}$ltj^PqcZN%6gy}3A2X(wUNxnao+uWm*&SQE2?{;?oV4brA2Dd0m|x)M}A@v^Co6*r|Bw7h$=A z(zZ9hNwCjDEZHkg=W2eF4EC};)V=c3E+v2mlv5N*dh+SKCD?m4(r!Dg8lIa!VKi_2 zG6op-J7#iu`ZDD}vD^r@n1|28HJwz}D6f@wx#=p^@klut;<{xyd4qC4LQjZ-BxZB+ zHrSfue_CO07qGejc(~)I182JrM@2VLh)*EU)K861_jpekl3*XtUy~UC1CV`|fR2-| zOWIjL)>!~Z0Nb-@6q0n8}!KTK#`UT8F2RH55COC)wlzts8 zg`AxeOmldRvGCGL7U|1$Gkb0+k0F+!WMhK|=J(^$bYkihnW6zE#fx9mnkT9dQ*;pH ziB`BxB{k)n?sw3){es+btx|KO7A-}YT?*`r2{EBX=f%nnSW6@lAY1kN+)ZymA#kr{ z_Skx~ukpbQ19Uz19NtF|I(uemo~iScmT)fOlli?1t)7jc^?Sulr_+V?hB9wwwZ3GZ zo%Ix0kg{$aE}%wnJZlL^s#yqSG{-(~UH?x0Nk!@^MWax&Hp|7Y>j*8u)I;gW>&Y%v zbt4la$KekVEPQ5_{F#X%)@~u_g%u|?n8t-S+-%wMz&UepcV@L6J>e=%OcxiOD=})e zRw+d=lW=7Vw+Fm^L$~Ad%dH=l9O40erxz7_5+#-(sT;xL$0+ zo`Z3-5q?(;1}yMD$~mSe_HE`v5XE$ay)RHR4Dia%v83Qkxhma3Z3Z9Nlp|wRvxh`% zj|_#_$@-BRA7~UM$$*O|m8um1I%dU?k+S{twpl}zmg&HJ3X0x`jw7s% zu-*_XhAAAxS>+p1Y!efJZmRLV5g)DOR$E%=rHYcHF%Hq^cEbb0T?P=mlx=moyJ_d&|jL7qxS z@}*%pJ7GWEnCBhk0oDJ}0=zZ_(b^1q=p**sUva=nkjOb_cB->}ciVH&?U}jTVe~m= zNwx0Umhokzm2b}7cS^dTw1_xkjoDYbW-Uvr^^CDsj-9^22~Kr`f`Cbj9BG1N#dsTg zJx65D<5Hf1>(|*t#v#C+9m&>G;Ja*|i{fgoOckt-*n+h0d0cVCrRn!9HbtXxsBUoa2u~g{fmh1kVk_)tQy4 zvGe;WMax+q{39GdF>zKDx}xK|RQ>^8W{b6qP!t(GxXF~)yYKhw@{g2OVo;q?<@fDp zY|zh7l4``iPi^L2ww3mMA8+qobr5_D(ahlf{O(~)!SqOIVq$viy!5YU2OE{l z+6)icorZp@)DPVzU4H(hNmP5!U-X&{T9G<7d!gg$t=cq8Rl4m^BXQ|sdt-bHHR8ag zS(M8#iCmc7O4?E$~bgaev zF7^+@g@noa+66QNk|<(KC1OiS2#3asNAIN|hR+GY2HI;<+Vq2JVYeNf)2grUQ9SWxArR_8WOV`p6wtqb zu}Zfy=I~!-XS9>%4p#d)f1ZodzVU!%)KDx2Tr;#hYP}#dv#gcouDa%lI(Em&-hO)? z@u!b#hf}9=tL0b^d1bD$Vd$~Z>_(jg_WF!@KKwzrk`NGodf@`rtSqvzFrqjuu3wtJ zN|nwtWqbnYTs%$ zdTP;>aWQby8A-d^b+5N6I77n%Qw5#Cr?=`QGocHovC3+L*ovjPK~*-)!l97szxIJZ zD6+`iPk%N=8-?Axw!?@@^ypKU0?0@u&pdDTFi^xn6cTRe>oW*JA{!w`S28=R;!SBb zi81;})S^1W2MvIi|2fk>~8I^BSa57ixIJ0e{o#X2&O zR%I9UcB(kr_>t-?6%Ej3w^vML&A~6Pj>^4K@o`?~v_>h*?{DWVc(7BMUk90Y_8grc z+@$3kJ_ddS3;hw7+Gxow?2Ab9<-#VAcv?aRmI&vs28?jwmb4j^kpY!8%3ZgAUMyzC zg8VE2?z%az#XzD^K`FHAF+3FD9~Xt){B`4;DZF(SsomQIjwW3(4ZIpiMJLqQVmFLZ z@isWKOf)^QU?oznetWw0Ch72Y%aj&K&|nrW3o`ciRHqtzY~rOar-_r{8yw^l^_{vJ zn1tFNnX^XVO?tu5rIDQs*67*(zm zGI-uQV$vy%F(7sr4aU{B&<Z?ljZOfEyQVMY!BLxG#h;5V0vn zG!0T=1GTOgC8lycW^B~-{SHr_3#jBcnEC(w$y>u(JB9>;|}RoQWh9Y`NN*k4rHIdu8u4Z)U8{*KIAmiuJ2P(@_r)@UD> zr{=ZEhEf~q%AmO1qaU50>jiHQJ(-%SAg2v@a^x@_w(nLwel}<$#J(c-E~^Ko)+|<< z10DuOEQUCK0eqJ? zSFFsJjUzB7?+TYf{aW`L%1n*v9YHrzAeAsEZM(^mDnGX7MAnB2l zBJ?ez$3k2;D$D(Au14dHXR^aI&9oB$`yoUM6@IV1!*xtdz<_IjtWu9R{$5;=R%k$M z{L@&u9OoA~+5da~cK@XBPPaq!V+o*hPRXojwl+fYf>YsId}hVekYweEIVy^%7tNTm zAojw@BHlHv+!y^*N~dm8F;N}@Y+5^-kB>Id#KxI|xcbmUt?S6~vM zv!sBaq>t@t+Iuk{APmDa9)B_VX7xM>xVsRD4G-JZ-_35tx28us#>mJJXc>!!U=LP> zf-@2mgM>F&y?lK)%(P>=q3NQs?ihCsyzhbc<2F`qobvX=4My*21`|wRRtbKV_C;ut zA)hvr(q>IOkoE~F_Kat1fycP1LXRF136aQM;_4iqesJR$aMzsfiN?u{%Qgr(?5{Oy z8To&ty>(R7PxL>mf*?|YAPq_@4Fb|4CEXoMOD^5ZBBFFigTSJMbjOm5w1gnJz|!3- zv2^?vKOa9|pYJ)(IluEf^T(cz*_rpu+_`h(b?(YpHjFLfPz%HPmV zx_^9KuQB|9L_&ESe!x9d`#&DC(N#vXu}3M>e|%_J0xPsbc`IyInZqcakRFach@b&% z>1cinQCe~K?3{~}69~P0_}jIoP8AWg^TN?Gi%RBrw?VwiQ14%#ACY=U=klXJA3XGw zfPdcq-~TZ4?dw2lOi1RLe&2Yi7-5X)Or^)v$lF~89w9RV+E0i5{F8GjCYmnre7Vvd z*mt3lg6n^VG`g395V>V1vP%nDfAkQZI<4$4 z4jaV73#FM{=aU=U>27ET0OGyVhlZBm!=KKO3L{P}WDMQPwue{f^cLmY2ZU2k{+XpL zs)v5SnQuDmSLK~s?10gI^pkz5&X{m_U*Sj01-JLvXP%#8E>x8u=jqr0>VRwiPPP;8 zC5ickUH>18L-wFKim2JG*LzS|`^^@%yLUqtX9NM=MH1JgXJ=!XVqws$6XGWSiz$B2 z-~DA#;l~@&B($2oe65$$2eq#;Foyl03L8_?71vMZb1rynyd%WSK2EuuXu0%ick<|d z8Bx&K+wY%CLt_*is*4#q=3wDnaR2xYP@}ifjuCJPps#?D+)a}g55e*gK4v(l< zY~&%c>hjf$ndK{SdWA7$BR@rv-nhzGq2=oFM!|9ikm(5RS zRqc-%4vbJyw0J@La}@{J<*12ISn|wrFo|;}luJOb0AmIsNRC;e2nKdL?Q2+!->0Az zyzQTb-R8h;F_*eigP4u4tncwxaN=#O`wktn-Rb#F^D2Z+9Q}2*14! z41G-h_`dAQNmT@|x`}paf-bB0#IJx)dxKQx^;(H?bLz2E} zXa-RPAq!`^w!a+Hvp*(gI|2n8V$IrW78HSKPRBB5fu5625WiP$ z{vsu364v`lcxXi(2;6-=)q;z@k%>Bq4W~u?GQ_OyP-s)2S0Q3-%VKS{W|KEHjgy-d z)9D%oP2syX>*zXG7uS4;VoQE(i}Z9bX)NyX_B7T9Tr8rXqg%k9w(B+x;~){_wa(7o z%=!9A=sI!KAUch(7pFJ1i8$jTNqcf{@o{TwuV(aGYeGPOlsv)Ubn~7QK2`RUpr0@UaM<-BL!C%ax z)Pm1kB_i+)ALvtN7-JHuPPxDmO|6z319^_IcZpTlQ%*yr%Z7glUY`;pNYk+&tk=>} z4{uteKHTNKWtEtlUomcq`ofjSgk?!;nV%Uelp&1m)n0fR;WFRv>5dyCWvND%KB%mn zJVY>AqmBo$!iid=4Br~TUm5qIjev;3)% zKf@x6`Eh}Al(}ePY~(JHScSu2UVc7j$fQlzc(%QohI&35OtK<7@$y(>91t4x#`Cf8 z^G6x)vZ;28>M!SnLAS@L^}>J1={`Ak#rk@f8PuEy-Q;W$krR*1-oUQd{i#9ydgjTg z#9`=mP>jH(@s3p%uEp2V{@89?G zi}SyQGhMfW27a)9?+YB7_*D&5r$q5m7d91>q`~yVQ|e}G z`p~I?ViFZ4WPnFZ2}vXtJC!mG79TC;6js$yK4!MCDTac=24eK0mRu@b1Ene!zVnhK ztzi#X?}ln2EG(kUC9xo*=Aay>-IfGO_a7sAg@f_Mv^+lycQ9;2NtEmv8jFN@xJ% zbU!V}GYR?SNqMKd-d@*~NamFbL-$T3`^J-GKsr91szlAULc)Qzmd3as{SaWRm_6K!S$v~@Y`P`MS?f9^@>A$ag!n6%>&)viwhh#1-u1_+6(`t{nS`k(fnei4cJwvc-EdByYUi>2?2x2fpfp>-(I%aPX-pA3U z{GM!|OiD&tfWO>CZMY~CtXHogZ$b}my}_$E0}Ef};Id@8q}{7JnY~1v#BcBs0Q!9HNBL@O z@CdmO2rzPV*QbwcZgo656n^-j7pyGH_Xy}?xI^K=UviSRxUw5m*-Jc=Iryw8^odwk z+st+#O*gzJzsLH+NpJy=(8J6kp~CC^ieW=!=f_W$5PnU1e}r%=J&LxXFpX4}HsNcSmk_oJB0a@?N^}emw?xCig?I z$!)thTcbHc=aX$1*15BwpMZDMCq`FZTwXOTozPE3zWBDC$*v2mT}K(EU5xTyh{POw zqEdc&8(TeY?k`OAS8xzxIB&J9L1zTs;*fCRUAnhRaqU=B{FQk&_(_Gu{LXF>T0h(m z*Ko%PQ(q#d<|}OF72|mwBUCjsx-5Mq$<%68asoNZ6kX9xHPX1P zisjGxj9T)3(S+}&_^e&l^kLiy8f~QZeYSN>!)>G-H(5r6wx;=wqqM3d%H|q-o5Kc; zm3=>?_5+oVE+|E;k{Wlh&$p3S!wz|AJC1|*wR0yioT(hZB zM~Ij`Xrs@f6g}QU>8@e!qX;`X58djJdvCZM4jI!G6!OHAuN-v##>g>>B zOHL|*(|Tn#;Rz}ceu6gOdVCbd9$7ch#Kh+3k2MRa6%CMAZc|kU7a+Q+sf=b@Dk$(wVRG~NOk%PAq9dqPU zRlNv}PvP4i%&u!PBYct?dgVMtJ1wvXMj7?;?5a#^8MYjD!F8%PTc*W$Sf3jy|59mM zA$b1}(mbEF3KbXMGyMh~$`>37`D~&ZcZ=X2p5!o$W;2682Khd4qRKJo>>}(UFVDLUc+R&NJ}sTRbpDWyc6HXlSWe3B-^; zwxawDyK3!!bVyNc91Hb_6zz>nXmG~wqTX$R6Rvgj#>};k^aW$=KMjViPgOMdwJomX ziSlv(1p`&ozEC5#vopM!N*5e5p!g7k6lI+IhUUB^`e&IKbsy=X?O4%f&PGY)zwEGBpitnO@4wwD) zFaN8Vh+n1up>g4m`euyvb?;>9e@0E8W#4DM6LObpHh2~bBi?Wzd}9(jmx<}`QMcQ? z?rPJGcN|0rB@sBy2FBde>2R;otA_)9%CjK@qyg2fKzF_~e{Gq}m ze&$8G1D<~^kVS$M0dRq)eaNZ}NMfGd%|DlIL(-~ZF;=$DDL=}kxOzX>S9aiGK! zao`#K;m_>mkNssdA&6)vMnge=m;CmyloLz{HC5MtKxygGitq3DA9mj|yt;fA{|7!T zJxa9li|7Tb>FVySSpH*;QdLhm;!i3m>j5kkO$x87G0I8yo z{Tbi?+LNNm0iT}NMS$V%)yd!gxataFkiwN{A2hg!n z%m@h7ja@K(e%@3GB3eJz_h%trOQ4b5>;eLh^!4>iOlCD)TwKU`E$>+mq)!&ENNch1 z@DRl_E887{HPM$ltgVFwlOi-OzQ;N+kQmjP9k&ZT=T z^^~9g@9lwZ`a4?Ea9bOA;kK$&lqAAyH_D0vXxiD?&2McXwi^uk!oGLS%+P%K@+E3^ zaA3f*4#N0RQ&Y3TVUpKhY&4RNU#3?T`KFAFLkMsb6_DG&F?P&*W@vZHtlwyKSClH8dDFj*{aAWA$mEZ^!vH-)apXGXQ7T z=`>sAdkFWQPBwZu#Uts2Tsszg(Fz?pf2L;Hh<1@qy=dvzUZizhsbOLL0XzW%o1of^ z(J`B;TNi!t@o3?kLG?Ji;VNTB;)bovq+7l^^)vCN$Go_$-aQ#9o#Lmc9MX(LY64VKd2>B&lEh3(>d70UQEJy9FyWts1x9D zd-CCj4<9DV&4Nl#WZV8_isq1!_RF=K7RRC~R#-n_G53T=i*4KefD}C|yVTatq z;ef4+jVE(`?IDD^gBCy_=h60L(Eh%w@d`Xwk<8dmt8v#k0pIO&Sw4X+R+ z(9FvpXaU+uI;)w6q+(0O5$`KH`o#sOJ)dF}8ve8r{n}MJ?n#_;Y;YtVf77Suj7+!3 z(^r!evtO^?MpRnis$_~sot${r#9GpcKRr(nYRhTW*V4)naL6U{x;Sx3NK6!pG#pRF z*|9RFxWkAqF`4|_b9-gp=K2*ScO@4^G($HBQqkgcu`^=R)pq;4OV6HscEJ^of`!7Y z(`F_}g-u*YMQ9Z`(@-#&+sZ0`-z-Lz4ZKnDxaWzjvqIKm1_lfUx#(iYTYYOxPb=)< zoHYy2dT!Nce-#TX@c6UF)wN}vL#IQU;2*L3vGxj-2g4~eqTb~OwHgC)>_VQ~DWyAo z_WGPXltR}F3k#d4<=s!w_BX)M*eHqt;qDIFHy{=aA*7R)lnk6APxhD3aFaRhIe%5E zPVto$Ud;G)TmC`G*^0xd@DvPk#&6b!SreHHmKW-KvkZFu${2$7b9!7=zdn`s|7elm zVQD-WOkD)okH@TMY|q(VNnz|^g-3kEOa--kr@ON(+WTf%Oh|&bh}NJxj}*-m+_hRz z9c3Q=He-Mi6pe99DJuYNib#r^+o}euGSS21o(fnpzCv4zHZoqY58YiZ`yTf;4gfQ( znkL#HdW0?Vez>vlxf60L zHn`crkoe>9i=^2%zDHa+>g-}{IbPw6n69p_ql4>Dq6${8Ho{cnVvlHbcp0^bHI6JZ zXHS?Yo+5i-mU&0?pZ#W zIIhZ4B?3--qsidso+u!o7eJimdU0ez_hYAsf4L#nHR+4)zLB}jM!KItjye}SyVG2K zFz@hP#YiFG$B-c`y0$D2+~c{!2%Zdf06@0F0E4F^^zx)(+O=F;is z-qq5VT@i;zaS%`R%vqkq;q}DQ5)E(3Q1%Vm=UkP`z7Yx^R9O|Z57)Wazu2Vxh}sII z9w~v&PMP{#*1J?kqo+v+WY7&CUnvuW)lR_}cPv?r4C8p?x8xQ-E`Kf>qigf=$a+}> z7E(kWr4<3<)-wbgKM5bIzyOSa>H)*>u-dmi4;PDbhGqdI`1^l5Y0cKa=>lyo**8h~NuTFZnyv znJF7_0nvKJm(GK@gG;$&0k?lUv(takbJjNQ%KISFF3h>y;;KX5zsK|-S9CjgV9Vjv z0rq;DsstBr37vNQ0XFnV6|qB~Xq#MDp8L8xD}Bju*th{_l%uU^Px({%9Qk(1;EXZ4 z%_mV98#Isc4Q!1jSU!yV;kmvMlc(%~F}g5%xmB@jqX+WvQy+LIN^oP3(XH4>>`CqP z2W3hyZ=}ZJNZMOBlDRsUCCcYSpY- zqS;WUms*sKqRbswV2JltoPo~mD1SfSf|r%~bM$;Xi}IN48qQUu>SQ}lo)s*iNt)0) zoou1o%!HnKb;l#IOU}m9lMF%akg{A66>D@~^*pB{E7{n&djcPG$MPB?oyj z#F83G`>f}2meq%)Mc0?hHrK>?N=cj^imSnK2aJ|=xscy$SG_n=n2Ant06D2CC2U+R z4fuUl_%6mTCw+tjqPIZl;{)T(Qz>>LNj{!jIEO96m}grjI+gHKv_{R?lHT`zU^w6A z$39i+1*!k;biJKLVKdTtGGR+heDfry8*=DrZ>w=)>k}x<)r&36m54nXxVhJAqNk zveFYRHD+z$pj8++l_ni%8pvxMDXbI06))YmiKF7@r_@$cc81rv$^5*uyU!JoZ6$}Sz111hX zQL&k#vG&c(=X>hW^>51MeRO6PJ=XgD9yCIWrSxsXN(USLyt53Ij3SN}Hg=-ccR396 znni_ILVlqRbu$f19wlgzFz_E>*3tkX3P1IFMi12Rx(+sg(qfc+9)TgZ^NXK#x9D8Y zt{}Yl>Yvb;yH)k&(kl8x{NWfU`%6&cN>wL1x}02Uub$d}W^^j<-_T*yPSke&SggNu z&evwCeAMKg{lh*#c@9;(uoQ^DsX+aL(dN^ctzx|kvxws=ka{1y{!!O)#?X3mj9_!F zIPCHV-LDw!GV`7R!ug$z5S&YEldWG<(?<`tj9@>m9V=1JzE1uKyd{K-YxC-x9P!4~ znIW-KXy1{2jY*m`|8G)=Ekcu#3J+Duz5QzQS8#jH#9}O|qH!u-yE_DQ6UOILpB-2j z*@v~w#u{dcF|dkm$4VL#(IrmU=v#TzpXr$xW1+K*Uc?zWh&EC4EbPIB`voj`Kg};~ zgoqnsHGmLD`&AOPWCd_3IaOC*kzgH@e@zrSt!VqqQ2ZBiktc!e#2I5E6K@;OKMi%N z5>ved-*qmS2yfY~KymxNNfPO2#<+4Tzt7MA%`13f^}8?HrR)JIRO7+`*Vj|V;B$Wg zG0xBt8uduIf<=wN@WbPxUj=`k69^(|4H-rcXPm^t=mioddi^!ZJ#foDZR4lONlMj+ltA$*cm7;lCf7pB*aJRbdE>yRu z;jfOuV%uG}?eb<4kFNw-DQx+M%6LSzezJvtqzMjJs+cXsuHXmXjo#oV_0PsGT3eeq#hCDQh;jux$XDmj1Ib7H?!UTd zOT2%NM3Q2|8W?1nc&qAy=wX_7f;*xlKYMX2B%IXJ7>0}_M^E;u3Jq4We?dG*iQ0YP z^8^R&Pz~&~8$u&P`<&>m-d3`sP4y-(lECGy6$4Z#){7>Ly$y7NBG+p}A{yeL{Y}?x zwM7v~tfj~?%#0k4d?bx2Em`_;J4-1+H<1m2*NIJar3&}){0iDM4W?HS;MGb;3lkH4-Zy8@GlaJ(b zrXHN^-@kBvPgR=^mxcs4&9RJzCPTH_@8d$Kx1$Sqn2Y7B*29rCJKDW2hI_lzgUo&1 z?U+rlX5wx)cDuIiRxon{oJ#+N*mxx536_<}7;8!OJVe}jdaTb#q<=4oobODIeD5sU zE`hZ%eJ0yOtOIm$p=RV=e}tN{iWpti(YJkib(uW3*t2HRR+x*sHz?5(iM+lT!`h1e zL8%iPM#mY%<>2lUbk>3SJ|_8S_#?Gsd0p>wnXP_2 zwWGEgv-0-31Prki0?!ThP~i$4>*AUfd%y0d4~k*X5lT!8Z7xhLD_>6#*$q~5d4fI< z81pwAlkgW<)5+%FP+iN!sdyw71LPB`Pqw=Wc_`3NQG2U>smttoV@IzhfXG++uJ3YkL}csjdyVT#zI&=JnnCAk#shj8|CDtmsQ27dy7aM3)6>EUBmHP zm?-XSi6B=3qdVuL$>3diuAFzSkMsJ+?U!CAaY&+uhU~1w*b3RPw(Ha|Bw`wtN4C8m z&MFqR!r0k*?eXfg>^hNN0_k3x?F?ftQk`UKDz8c-_vLmhgzuo z;c2}-8mZA8n31ObF**Clq|mAFlht=vLg0R-hQpclQ}fLqPS3qhyo-&_p1M|XeW}jT zQ~tE!u{w-{QulpEnn?P&xR3;)QY;1i4yno9nDb8&)++z}obZFy>4djs?wQGsi#7?v zPeDvDJFFl*z%$Z$Cpbg*iyLo7x&Q+qdK^U@C!8N z;O|T7K)5>abFOAeMdcbOulx9T!@*sag^g4N4tbT8Ml_qO?JrQywV?NhK&l!0aN!FV zxVbuV=C(l**2ZlhPf0%7hSwu!W^G9P@=!0kf}! zldOrAkQV}z-@YyRhs)=ekmKv? zoe!3wgy{-dD5df%xf~Ew8DDAO?iau}#r%lXAV_ZmmylQ@;+#v)G{P z?Zzxv@&l>atZWTglCiFYR1kdNyJjuj7YB(;g*J8#9|&M~N`45rWAO?-dlmd;$v6?E zqJz3e*Nq;e-^&~tlY+&g++DAxDBvB0BZXRaOxBP6CXi~-xAsq}EU@^}>IK8~Ea zBNjs!GXf0JQpp+ zBJ=gM((XE$nDkCyjq?`b$8LMy47ODwlS*fSAS|xe+@t>RPLW90uPL}|afHAHS#Iyz zrz{UpiO^LNEBlY29-FQ<4yPiqtwVBhzWdmkUK7!SJ^MtBngUgdEoQ1%J) z3gn_1C36D}v%uh&Hx>fvQIgcx;DsW5gba1kdQN5xF9YZITY}l7V>-C|eQ#gJbcKDw zmC;$@!}k;SNpp;nFZ0Er;;M42&rI8K(QUX(h!V_>D08I4Xp1BdSQ&UPE<6rxIkIDZ zT76o4_n2kEH{%2A^{ytwNz^b~1a^j;lmN_$H7n=W$4$iHEQCmt6VYkt?$knxPSLsg zaNSAZsa$6PHH?_AIbOat#j$|IaR+x)Jiuh6a2AcuG)*^iP5;>a(ULmTZIzMF4ZgqE z(a~KIUo2$*LwF$Fqf9E@c}+5ItEU}H54Ds6AVg{l?Oce6>3}+UZ3bw{) zwa1K&jc1H6)u5DD5?mA>VxBwbFN{$eh{j)Is*k=DN=tspGFM4`$Hn#R-Vd^+U@?$l z;P$w_fJ&=Wjj!mD=181~dkmE3L$~JJO?|hOtt^+NSJz!<#^jU@&$@>w1;KZk;=j%h zoL`f0AcGrMYG7Wk2~?0AY474RxODtIOVT;9)*ivGN?6MGxaeXGp-cy#EKRKyj&Lz4}v0nmnkLgTPMd&u1V{-G3RIeC+%0Lf^HTmKOa()#y4t=IF0de)~hi@;9~E z&o43;HBTf?P`KF6ChD%n=s-Gp`rcR`vT5_x8^i!pR-xp20D?%k$?vX+j(gYY6B>&8{c1)=CM5{=ilx-kc+^RK=$ z?7#8NW_6sEUngG^9;I>dxnF)(;pisGZmRHAUK9Znd;LfY>4~oqKKhUsacjJ({%ux* z+#uhS$HJ@Y6i2cfExwTaw||#6zbod#Khh*VAGY+u1#Z-z0l=uqW)N+*7GGUtR7nqo z=<);*eEm!p5_4>~V@{@m?zo{gvVQ*2Z^(l>eW5`hDHUxOF?AakbXO`f>+|YtOUKNC z%KTWs`pX{yjZ_CwrQw@;F=H<`F^~B zH4`u0n+ls#scX7E_JCQL6Z?#?)k_80_H;{F2I1wT+Df*YN>|~pyF;>dCGu-B#lyYD zXz_?1=zrr)?J{zAak4pgK@#3a7gqV1XCt!KnFLX-~k%gf?Y*(OmvtZofFetq0lo83<)+ z*LZ+)R5e#zy+V3F^zDSe9beYxx9b3Gros(Ko5d}z+7&Hnz?KCEfLYv&AoaDYD{!cI z=mFbN7F3lm=|`qv^wq=5^^F&SS4;=&2X^Xws)ifVbiSyJH=~}M;*E!x;H&Mbh0g{* zns=v!YHkxsfQ)KKSf*^*-;`t{R;H^3b^Q6pXcE!m+ouY;QJxdLis87{&Wcz0Yc9Xm zxUy-&#eq5qa8t88E#>N%>EKGHBt3rSNE?v8!l<- zR1O8-_mZ|g(nZKIQ6hmaeXb=hF04ujtUrGBqB}xuss`fyfG5G%pi3)r@Oi{Bd*^OZ+KU&1%O`)H6HovL-qfa9PQS$Xzni46+&P$x2tpslj7A4~;g-EE2@i z&Fk}^gI}G&l%tr4!jd6FJQ6}F?@QZWQ>rSCw$qUP z^cy%k?4Ug~`FWM2ne^}wT*$!Zit&yhCUmi%O zsb)fu9?(c5mUX-Kag>36P(8uH*uk0$?SY!O3|qDwV!YmyT4L^PZcWX-+8QZRW0D$2 zB)qodnWK$_3*j#Rs`hyQ*lNbNt8wS%^sP_QB7<~tjgB*JzEV6juh92!xeC=eltrAO z@j*kV8z%CHW7u(za`4z#15;Z$6$NGVzDBHku3pFufP|NUeJFO%(^^`a?dS+D4kXN- zGKmgxDDA`dOD4@c?0*H!04x&VfpeFabJ>nNbMvsLJ&u5q^zfdkBHZRRYHUwID4=3n z@np+tXb1M-{w9TF)oD#We(jx_gSSg9QfU>fFxbI2UJH{`Eegxcs!_!x7Z{hhLFEpf zY>noJEUk443o*`Q5oBp|#paDGlac#38}wlzuf~MDlgy`$@vvUDKX+~R`xO(=g54U< z>~PV`%YMGE8yGP4PRyV7eFVOjA|4i*>5Tuu5cHaEFUGHJNrmIJ*}3(p=Cfy?Yf&;B z76VA{l>l=?Lw5@6nfFOYOLb0HBwAYR-$qaAYsa$2^Z{!|2$yt#03c2G_7Kb7#hw7d z+i=K3wKn4jE~yWq8#ulzg?e3`o=Szz52Ipra}3~EaQ;UX{x45Mx3If8KM?exnm%M+ zW`~#gqefByx?xaX-}V5@D)u7EC3oX>kvwHS-lowH`DtaBuHyAOMQa8_E?^3Au@(YN zuMDZOX2Tqz7T}Y292|SctrecsElBZxr{agCl5%Ca1F}N=QBmKt9B2C$8oH-g&3f@e`w{!EIyPl~hgSWzHMn1BM=-c?;plYMKR<8mLJ4!R z8?Sx_qOVQv)`g=M0$};cd3GoR{d!!dnv?@%ch@TIMSpRg!1b2>+Z~A+E1XaoDZ_4m z@6WYZc5`&)#+VVW_KIi^Z4*s6R|~{1o|v0hX1p>cjkn2L*E!k12Feww(|IfiPXn^Q z9q)5G_9@snU%l^ZHTKK+O&6Bt&NmTU`_W=fSB4`N-rGEUdiid#ANMeM-pu$ zsE!G~Fk$G=6rtk48ENOUzdS=t)Y$9lKz{>dcW3tNyDPqe=)gzu8S7yO%den)H>8#u zk^0*fxol93SEH4D6RxB{_M5{>Con>dF((s0qNhf7E(I63hw}oxiKH!bf0Dld7**X} zau;-Oq(--)-he)T{%yws9!mxbVOWiL0e1xcKbpJwZvynD=FERkuJ0vip<;7mqsN03 z-OKO7s)|07b;hCuR~qi${N<)3u!z=|{*T@M-xDAGsPtJ)o%8>J7*{y3{!2m0>h!nF z6Vdt~fT`CI?|-7@X8&3F-yQEi`e)d`JA{%?_m*e1z4BI6{LHGL17)jasb#DE7e^`W z-u%69KIz_a=tS&@Dkmuk$>%H(?^mT~eZJ0$4-ljXE_46}^yaX-DXg|WsjGZe`;6Yy z@8nud9|VzcE%c5R>6dBl)zK%YLL#%WUXiRm_EW$d>EBT)%l~$YOICf!oq+QFBjH(T zntVOUFWfxIMoUAXE;2IuB{BCLv{g8g136;4ylWzKYbJ>}ulO}84wv(!ygB9GaB8ZTAmH+XDe(5W>kR%yA2d0IB}^Cx#H zLGG-v8XmdCz!L^V%<7J#j+Qmw!M+Npw4h9E>sY`71D;7k`o6#)=vP;vJ#SqiKD{@8 zeLq_O+3nn2w`Ou$ir6xlqXejBmW4ALw>MA8ypGG>iv&AFEniiaG`yovw{*T8BCe%e zmf(>hTA;+)e(Od8yeY=^rK$5t->r#N*{CTfT7UlhxD8p~V-1~@;*Kf}njI#lXyWZ2 z-#jbFmTGV3{q`I<{X##49#IF-Ej1eI?oiikgelC@cz(H8}@qUcZT$71>e0jOwA+%@m7tReMy_wxGX`24_P9UDGcfB z81LxOx%;zX7{2=+XD0z3c4ufa|W_uKs zz&oepY7g>>e|kgXNabg-q3IA68-I?*JCv$~{Uk*FpM zfAE_}Hd~bh3DN3&h2*gIK4pEdO7}I=_iKF{VuYY_PQ*3v2QDc@9)^E+=eP))=E=YCw;;**N2?h zVC{G0^jKN3J{z7h!TQ%}gpM;#JZ|M6nxdej?E3y%4a-CN;x%SKv1H~DJ#SraQ!XnT zM=XLZb2$<5Xj1b{qjt$$6{B>%(d-rN{*+Mk)S>l{Dyj@z|T z5RU>&Vz4fvDNKGdEc6RJuCBF2o&wYcU^a$vSYQ+5RC0 z`$X#xg0z8i*=lt>m+>8N{Pu(#qEj(>h1_&@csSkC37;^=^znm_sQ&=Tw98h`Y!q32 zpHF&{TG16%Yr{;ZLYn>c=Q#h_4n*plKCZ^M{~a5Bme&7YX82!A|L^>kbhY7*C)p+4 z+TVN|&F&TR?WPj8p8a8F>a?cNKVzo;)7tS+AJj+W*0Esj#4nC)42? zprcyiX>gykX!UfOt5D%)Yj`5l$#^flR=ypU{cGuElO1A6NU7Z9838Z!UE$KL1yM8=NKPt^ekzZjozsMOU$ocl5aVZD^|LI^3K7(_+Do->7F-m+Z*=sX)544 z9~5g`l#vZe4qf?eOZ@1-ZNzppF1c4|5Q)mIF5;Ex7Rt;ZbiwS$|66VuqGX>rZ$Ja}OK zX^VASu05jBU!TQ#Xf$#)PF+_T^GjZU*0c{PtU_%Av;oUaO~TX_gxh_PW8=sd(9Xh4 zAEUJH=Cq~h>2a4iQl$b4?8t=!8(6-5%3CZX_m$(h)k%k6PGp8fnrp>(8J`4YyN*Ah4Qy3!?s%mT3}vOgJAU;owGnJsuMGbPj*84%gp z_bj~TV6D{4Pm@zo{oMrA{=xYn8ATC8)BUfOrPb;~v;2{MMd4~DUz_i}&x;6ZIl`(C zxu3n7y0dwFAUlFjMB!9Sh+W$@!hnIjznV20aUPqNhC_>Mkt`al6ZY+WT`KN8fEsuR zyZm;NBAB(BJPF#lVCH;YlEArxTe=nQ=wsm*)UF=L;YQ{A*!~U-^E~ zq%G9evmr`>4b(k7vD+=F=YH zbK4)h%x{Bhx?^In<%Ub!`Lo?HyPeoNnl|Y__wDPd?969|m{B96A-V-W*x*1@LQj)M z!L-yB$$GLELp<-j&x@eSh&ledDT^FGO;+aH(!1MINC=)Ax5jve`O`IL`iEc*aRw>p zPDR-~UX<0kj*zI1=)VQR&#lYr=#+g!vJqI_e#XPLrKZWs*U?{@`0W7!=mo*?s0|>? zvFolws%NqNfl9~I23--Ivzn!*SLaG6cU&GZW~DEBp#@BJTAmg``>rope8Lu$r44FV zv3>z8u1BO4f_139lfB78IinDjr{3N^7xPK$y{BhGhsRm#@4Vq9OcQfp94Ur{g1v@t z@MWp|i4Aw?Y)nW6tb#=wO zkl11hdDP29K<9^_5k!Xw-wecH^E)v&j@do(na+J)m1#BVJuy?VEf8G=2ei8^SH;i^ zFB^#JNPq<`S7SPEWblZKwm68wE??HAS4&hq1v4*KzsOY08}+Tq7{8 z2WKK07i9OM+mnYyS#VMt#6!KB8rqPIU>5zYUFQ<&DiwJ!u)Fs>Vc_y@O$oE$9NWTW z+DQ{B@tV=YEq~X8`X~v3)Nn(JGnFroL=ij32a^{XH?OV*S4 zF9W(mU8tD@N?)%{^(UaEo8;=P)&cN*SAn^lj9jYplwqD{va1j43`aqV!Izok1khWI zo!rv#x{9pV(SxXK*cH!x(Qg6GbN=+7vq%;o*oToJx~~MKmiBUmFMmX=L+zSeNIhio zwdL4TNro&sLtS@=2y))kU`WA|`bh0puo#jQt1o{w_$EW&c;Sb9O|@>!FPilkLwU!Dg8$aKE7VJK>1TD5AN3GSz{VP&rut){>C*` z#pD1ZboT3{_rO_(t#wZ!!JR1WIivd?#-p6Q0Zw6G8*NpYV_0Z$_hRnW6K>UTi8?km zb8}{GHcx>^Tb3a^8pA-tWf%2ORr~Xc4w2+TF8XX`vRRyYKtunr+O+!?f++P7i(R;S zk^dFVNbF3CI%CUpj3I`;740dLS1WA$<%3IdvQ0`xC*hg{_e?t5Ynj&|$(H@_3V=yi zzg`tMR@@$fyYie1wp;^X6sC(g;xhMXRcCH+6o#|xp3dSiHh^OowsM})jtcE!kj>rZ zoT9&zeqH3oy81!ZAajyL;$fJ0rb?jZH@f66LCbu=!|I7)JbaGa4$6It@jI^}`9-Tuc%4*_Eo~UT}YpOzA zNze11jG+HV=M3zmr1?&X6CPp`sL}meI%hhXvF^L#(zSw@ZJajK-;SA{-V zY}7Sd_H+u~uEc_rMA%iHd!DZvDew}vT+hcNR8z;ylIY0WV4O_*i`B}iZVv?`xmvRQ zot;=a!ZrL2_oY5(7%k%$KCXIREgTjEuvXPulY#1ImMV)-QxK`vWMo~nAh|hh;`Ig` z{Vc}dVJB*H0WDYVJb9V!kQdBdxcUuKY<;Ii{12mmrnN0sbvCMBqgevGUx8d3yDH6% z-Zs;8C4bIsG-+^*Fm-R)^VsCtdbAFJefdAcy;WFSd-pC{q(G6jxI+uYU5ZO7R@|N7 z?(R@1EiT2~i@OGwBEh9N!6_Po6oSi6SJztqZ$Hm>&U4Pb+4Cm3m`P@SHs0}$cZ^|A zd~B?(+(!I)Dw_T+Hp56$6S%%OGmP!Rciu}pC+@bK>lT^7mT)Kx1070q3v_^b5v;tK zT{w2EfPr5a^qhL-m=o^$&L7u8&SE2v1J##sW}CQ0>tzCH_5DQ}UB{n6{is>T&!Kx_ z(Pv1#aktaIh-EGpYH&YZd*CjhLqjn$6F5CYls0ZYugTmgMqFl@#e6v{0EpK@lE3fr z7_`;ji}bHd6u7Y}UbH9KkuH<@h9A-W*ggoLS@i$9=}ZX#js`f=C2n>U7|f4m2b(rB z;I6S&KO1Z3=*a7^ra8rU~fjUE1?ZGMZR?!4}$j8a$82LURTIJaT7 zs`!}_(khZjXk~cdyVerffc&D`VE**DRo!YX&kC6?^UjavRa`(0UPaj{5I-A-+Pljc z{`+sd+!dQ%o}BxpQYi0BSj5h;bS+3%EOx>j-ZAhf$A*PWze-r@#Kwm{I`v(DGjgMe zNN1~OVJ7@M5c)0#@OseM_1qq^g82RHyaZmXkVI$x+tU7t7z7r1Un(5}VB2l#U_G#f z>lsnZhfAg>Vhvj2uP|f+y0cm}u(qJ&4^H04CBFtX<=h8ABBd9p=0&bT@Ckq4WWJrd zYtu*Az7?QQWKZy``gMTHu9N2bnP}2c2XW^ns4BfV{~SLJ0*6sM?5uW{H|iReY^uxd z@L`N?;9J^pWpCgV6yOu0_4A>j!;)iu9x0fkg@3IrAa;eq^_fV0X%kJ4NB$12vw<@# z%?Wlr1I~S^%{d=3MsAbTCsu~wo16G?Rk5Li`-oin znvBfWM|O?P+f|sm6=cymzg_wgd~OZJcCUU5As{h$qxi}hKD~Co^7Zof7f{g;EK#XB zOM-h|#bhf8M|P`Ug;Ue-Wgwe>GQ7=I3@p~}{~(8jZkZ)^`rRW6k{Q17P)gJy^n6Qn z>QkO*#k;NV&%EweA~{cZNX)ohi>anBC5pZaH_>7BWmlR+g&OnD?oHcT zdT^lopP2P&+?tfkfxsNWJau~SqB$mrCa4aK-1!2h?Tfb(zHYMcuK%W$1xez){eX8& zflbF_2(94g{qUuP+O20o1TH=HV7H4`r4NO6=)%}+{TS?LJIW9Jv`B=_9rjwMO&-i| z!@4LMqlrG6&yHuXi5u8Sids)~XzzBE+!JrzE4ZyjvGO*a`E$CbE4#I?QuCK{E}g8T~c7zWPZ1j2&eJ&QSI)p04j6V5hYJbvmaLej+UFtnYFG? z5%#S`RiVF57TkJQ-%ho6imq>_Tfk>T-Wz`z2k;p1*ok_%QZ@|dcjo50I?7*B*B0i# zj=}^;ywqKMx+E#z!|v3AwnY+?zy5=-Bs;RZ8JoW66zxLceScXn8s=(r(~C^hura*2 zrYp8;%r7@3JQe9r`mO^<&~EI%#08@=9-;We&`c#nnLKXu3$ZMRHlb}(3I5D-qFg+g z9&3OmHs6jY(k|^cktX`Xjjg+3=pF(x^{yU;`(cA5bZ1=$Zwve^1|vbFGmPSz$MMZ( zqa}9?-2N`&SKI%p*5}nO#*+vLC(#K)6^CSe6q9*Ce4AN!=;Ufes>dW@p<)G&RCzp! zE`7l37x^rzruKu(_SKyC1hh6j!ffJlv1HncDEcfSK_W*9lJHhix!_Tp<04a&(%HC> zygbRiZ0j`psP^>)WWcE3&`w#6;^Uxo#-dP8u}`}$e8XrG&+mH1lftcH0VJ;Nl7aAt zsAIn&>rt&1N!RnV_>wz)ziJRCK{bv1q6n&B%N%?f_7~i!&m~;1LFU2>X7|0yLIv*j z7Q-11;YBY*e;h@#?oU-9K-XN6(yTv`5QV<(kBy5%z%+d#X8xoM_~Ib!!U8}pHpzw7 z`0nmX1y9|%u!6F>!>*Aj@z{P=CJ&ATuh3GxufV|ilwKimKLp*sJ5BYsBE++T z)tiS7y7aZ@pJ)??znNCFUHT>#b&H$yBi*XSYzd+&)k;HhJI4T6P!!o8lDBrB&X%W8 zYP$KQJ;)BUug4LiF%|YDB=bg4L%P3bALn<+G6|g6_~u|x33HW~CNMdikbu3gjMsVK zq>DvO0ma~+weLnhIK;tZ5;q-+ropjT1@{hpLTkmpD2l0(?47wucJY~jIZ9`KTm>Hl zW4?o;+G~ESKDunNh2;5X9MxjiLd&mqJwx);qd~yr<|{!{+HskJhBbg;4&S;bPFF&F z^5HIz#l6dkNFigEt8?8hJnMLUXTg!!Zsy5Lz-^BlpSG$U=A1#;LvKp$V=uPw7wrs>7n#|g zcjNEx@Kr8P9=K7%ctN{$b6p-oS7AYM5R!9eip?et8ICnQ*N>gJf(fdIhC;O7Z|YbE zUZtzCK*Ft=G?Ul$22SHo{9^Iewz!+^<$g$Qw41>DG*}mPrK~BJ05WyQdFukcXloYC zTC(4nwY$Yem-s{!%TrK9pgAqZMmlA1Iw=mX2gG`|57>yS6W=Lrdd7bNZ_zGJ*vs>K z<)|i&|6_Gr4{2I+zGfa->mTRf9c!ryc?!zFmdRt$D8d{LM+iQn&MTg07rQ!)&+_x7 z@qC5|@KlE$-ty6bETSgjz3K{JV&*PZq$9y;qoJ8CH^CW3cg9xM_HkRm`G-<)pvhX@ zN|Ww`8n{N@`t2=GFy*&yGkt*oF7@L!Gy}}sn)f~1Kus}X-p~2`BA8h%B`n;??pNsO z#dzywY)PmMw9*pg{syOSggdgzDko|mJ_jLQqfI)BKB1PJIV@&=zHsWo&vC!T{<`s$ zzOVoC9eciz^OHwEIy2hb%pJGgIjcI-UIF5?zV#1vJ>kQJ`xDu} z{RtJwiD3Ae46%SA&25W&eEB7V#(rjG0>5LS8_UM#f}EG=hL_S-Cq_Z}Z4zd7+luUN zD%wZU&zH8eRWvyET!g#pX5g<%^WuvlJkT7PDO@Y=)ZOK4jU!3|4&8YRZ19!3fACh0 z^v*<9baHa?Pu;X47-Zh`_5%8www#5AShwZB!*r|2lGk{_o)3CJcND=?zj7*defg!Z zpGdTnM9bqNt+e|$voLy?FpU5E*ik3*|3kVT^J_?sU`@>;QeW+dqQwc*E9oXr>+ zx%sMEw*X>{9Mp(Jcuc22`q|TliV!`>Mrn4$vjkQ|LgD7SfH5MH^n?!|?GD;iC`uBl z0C_=z{kTqZUe49#275Am-Yy8GqP3F!K}5tR{J1{yE?zYU?d~j%U&81Ow}0wah)T9R ziW@lMocdTD8as^?8qM25r603GS)*w-s?2duSlAw2-jyaOtsS}$$+0UT>fyU@)#f!R z7ZvSt645=BHIGsT=oX9y;HEi0lwWm3g5Jc^%&Y3bqpGv1{Dc`wDo64Ur9)|N2J%}y z6|j$p3&evb8!bouP#9R@LAxphiyf>fSOpumh_*vDyI&|u5Y5IZ6>{Tk9fj9;J;sS` zDGOZt#F(;cQV&V;3Y4oe<%X z>QQ!GzG$gJ{F^Dq-bS$akI();1_Xb9avoO_A$d%twnkS{C5WmRE4svLU)5TnDwl)yPUg52JcR83#Zk$w%M?&*(YydkD`X z{Vcnu%WP-*)AE|aaZ-L2Sn)YUbcpS}Kiyw}fqeL1u9J6@#7omtlp#3IMq7U;_pXgY z%X#|TWVy{PLSOMN%w5w4(z!Zp*7hyYn}ciKok-z1^o%~hF5nE`j({yu1(UlJ;N=5; z-ELtgZl+|f+d)Evfl&27Kk-sZw(djU6NhMLkT5e!oTxwcnMD*RXHA%#i7-X-X}1W! ztD7ml#J(2{>RE$YXqBy!3@Q5)beMAgoTjJqCOd*Cii0_3FP@LPBHv=bOP=|{=o|fw zOt=X^W#A#9mRjGWy--@T9*4AjfHQ!Sr*kUgIW;4}Y*qz?J^h6TjYfzAN=4XuHf3yJkBOCDtlMvxhk4?AHxi3S^d1Vel9hIcz^8)kYtZMf1 z)p}o6+`H2*vg$I@Gk2lg0~e}x*kEA8)ZvdgGwb7Qaqy{^h0&jhtvO-oUl3>0W>*4P&j{&TgZDmQ}F$0ii9lMI==5`SDjn0{941AZo?bti_^kEV!AfNM1AxXv@qLQO8acrc~ zS4`zu!DOU0R&Kpd=xwAg(LbaHRql0vHHnVyOU|XJCii<W7E0 z6Aq(zwOaim0lz&~laD<@{E?GWp@kUvkt+B-;C#KZKY12V=U|fFQcb;dY(d%YEy@G3 z%dux>26x8HvI1}4(iSkS6Mu9wV$vktf{tk6c06+Q`K$pt91A2=4r-2`t@m371QPa% z0M7Y^VC%Xrh~OvhX{WGUrWC<*fxTJo&lD@Y?$^!M8B zRHF7dGYa!i>JiBot~@NQT0v_uV^S6|#b-`tPA0h+ZAje}2R7G<{JiELT-HxcwB@e4 zLn{MjYcq>=QO`LOS%o~BNlVK5sSQliS{c*&O)C=)mv$~n9iJVFJe=()>W%Jlsb=E{JKm7<>|5>0m-BvOVqLp^?Pg3lniU3wX2M3g9?6vgi_M z1SyaLpd<1!#(H8f0>1}Acui5dhq=?;wzX?Af;PT6^+rP9?8mn;sbGOR(l%cW^|_VN zVzNJLp)fp6&$Js$Ekc>U^yP6DS>LF2f2yl^?N;E~sW(R(9^V$E&YjYYU`m(?@7PH% zgtAzo;=8s4rcuCftkZX8oww;(!^CLom}TsG&xg#Ir_Cpje{H!vv65Y0?}L4CxmWHe zI6!V+nvGV_Fc`&lr##uJxKL8N$61E;yxv{^kW1>QJ2KaB3mYD*Z4zA-A^C7596e;; z_P!o)q!qUTTPLyOG>Bl08OxIOGUDR}^`Np|m=`sBuh|I=bF`n_Bd;I;W?Lvbc8wN` zh4-NI0SunCjDJr4{{D4M0{9XBt2ESuD&}o|h+!XwUAS`#8Ld?^*bvowjZT2RMtwYrt$=O6q_Z>d`u^Bob4q)A0H^b9x?xUdo`+EA`IQzQ_dTgC{ z0@x?IfFucG2jXpRjft@Os42Fov!mA=D8a+pX&U4yZm`&Q8!B#B2O>E*TujS-8 zK&?h7F>$HK8UFl>ET^Gf2Wgai4}QnDT|*y?m}V4e^AV>jxQf=IS|b`F|CpfGB97)H zNh*=kqeX45AS31De4>$COH)ss1{A_3W-L@(iI8DxE_IO6j}^IS4&ZX~hH6Qs&FSY3 zr+1Qx^{^NL;u35?UsD*uT%&n_RU$b_piqJiybn+oqF@z7xPT&~4F8bdkN*5;FQx8I zK?Pp@%kCpZxz8U?hnZ=)=D9oJN zXy=B=d4a8J6-ee&JxiBUw$R|y>PN0#yfN<1#2&3<{AcW)YxPW$JGRe^9vWT^5K5wy zp`!;%y3(4s$cW7dY_4AXdRa398uI;2g0R21 zO)~_vEUPTV*();S((v(;wKfX)X5^Wt4#Wx^9AN-{fi>bEfzG!n^ zTqLVnwp_ZyPDuhdstrqq8kWw2t!hf*dzkqoQKdWt5PyBVfpknQCg*d#l6eL5CQh=H~fd07j( zgpWkd0c(JENB*DuH>7vXo1|A3)AOg_P9?rHr36H*L>szZ2R{7+DhGuf>kM_U6Cr=B2^?Dxwb59l?M2XY0yA;KR)w*< zgOZ8c+fDS(KZk|&R5IfzNn#G5$%nIsi}y0xz`$M*-RD%IA_XBmd#xEID}v7VdyC7lE3570dGzaM<>rW-_^jR5j z-B_+EDXXk$3l5v2sh@Fn{RJX`%${bv9=vn;rAHR>YtGMCoag_li~PI#19tF#0}{?l zTQ*N;ZSGc{wfB?DZ`2l)tv^>puD`n5OILBiK98cm4Y^% zQhcYChIT1tN};w1ak}B-c-miv3_Z*s`fq2@Ez4OEDPQGvD`}@M&z$@#A~zBTk;D6X z=T_$DSFa-+%CfQ3-7Zy4M_GcUPq$hw9J=))S>$?0!i!&vaEdGNePs6fe=#r;^E7ae za8Xa>#f}n&iJyvDZdvXVZEi~{+7vvAO6pCXl+Zvx=R)m=*dM=9&FSxDc)8@mui&QQ z*J^9-HOjK5q;5xsCc%u_^@4OQQ2t7mTXbGX`eQJqmLJlZ-HkxD-H+nNj&rp`hdYvV z7rnRtEJcLBQkxj~&vwV9RMOqaDytVE6@a8>O-S>EGi4&ol201a(h;)ruLJTDDC8+e@@nXEBIa1;?&)cN{aR= z6y}Tq6Jw2+l3#qfy7G)QMDSHGDJWf|{<)jV#EEHM;>6}rM)EeC!uB8CY}lsh|A9X3 zzaQ2An;!YMK5ky{{}zFe5bvqgd%xfhrwpPJ1#cl!IO-i<5*{6XRq)T_!NgDM= z_)Rn3)J0j=YiS-WX?Pmav$21ugdsqo$>2}l1k9FLoBO{U{30{YF0-~VF?W)qyPf$- zePRd8iR_%;=hpZL+YQ-+v?(ReqZi$H{{pW?ngYK6!r7hDiA5~cyzfDe0BBpIk+(rV z-=zXplRSU%(wXPY3=lnaz~>1{62o)rsD5)52SeH z_PR{7ai%x14mvmu$W#a%^d!_EKm;t;BGeK05jOt1*7VCufNn}n^+Iw&I*IsOw zN#5UPBE5UQjb<@9jH&swxU%o#^}yQZ*_9Z*7tPY?%chM|OP}`;p}Gq;Cut?K8W}}L zWRJ(6x8cFcX*Pe9&?*tX-PAt+n@WzO$RrbGUk=WM`f0& zXgK-ae3Du@&b=PH21$2pC3bcL zCR@P_^^MuufytHuuXg*Xkp!a~k9azpbtXP7xpUiSR=D(?>m4xWUL5t0Q%hy}dKkyP zC~5Onkr1rtX*nXG^ic_F{W9HauAmnlO0vP&#;6AUvu|Wkxqx*agz!0twkWjSWXMP~ zRk%!rXbF7TRq?XYUjJpTiEl%=%6tLy#@v*LoO73(Qxg?^C~ihur1r_oG^VYOqweV^Ndwz4+nJ=tb=3P_c@R`waG=z#mP2eSqdEOKQC zU2N(g32*{L(_Pvv1!KGfWKfwo=p)_4wJ6YP4J6I82oZ&csEDQk}vkD_=Ck z4n=j=wL8)F{(=)0$gXBDw|VRU>q?9-U)7ZvyhUWMiFP)_B6*u3M*SC`0t*aAE2*eL z9KZ6Du@KSN7;1H}^RsTF$ixm}Aq4w2mXl_bwWq2Tjd7Rh?#?3l)&K0WxbH{>pdVTv z&m8cH&tb2uR2}RUQ8*y8+%_&QXi;4?v>|M)#}MDe6Ps`R=7sEHu2;PZfJyRMNj7%6 z7(yLTb0LbQW0(x3po&BbmWbWVuze`@6vd}8AUh7Og2~y$XLlHyw+N zBYjKcx|qGlFo$G}Mt7gfrU5cR=IMWy9X!zmUWxLR!$H0pko7-Vou5At@dyRho)Gk> zvU&-;Fb#J9{*KTC)utw|mE>)uy_Hh+jgOQ9AZfI&7KNzKBL`mcqi9KYdDaK5nq-SQ z3-;nwDe0oB(dBbJsk98J|75f#MZ z+J17AJWqL5qoKDZ^Pw<3K2` zIAsTdNl$*0MCj($;h2?AJdRH`4iA=;rBX(B(A~CXtQrNU0(eGF-6c^XQ4slp8Ap@t zr|L)YlZjyh(nr1=CASRzT17(_*%3`PsF#aX08@_|d|Lni@c5TcT60 zwk0Q6JA15L{jQtiB+<&3itm?&)|0O~x@FmU_FKT&?dH^#M|ogC(Y%I8ER} z9g}7HE&urAS@On>Qy^8{>W`FC0mE1cr@gbaDI`5%-vAQqS1yeY`4h$fd&&!;V^+Be z8)Fv6joxhX-FQ~elH}y*431c*p~D$MBa;(|d-tr{_wk17@JK^tz8QU*g)V!w1I)aA zz78Y2%p+{nZsv3SdovB=!C|F}T*{~IvrN#6OF?%*(iD^|Ht`R6WgjWlp;loloZC@PYH3q$#`9xkb_w3KsL)@1 zTA;Nwl(ZH#PwV}n90xGzoBS+)ju~7Wq$5RsQ*%ofoa~!ei1>_Ibjyd zEwAqXnL-@+;o!EO_-WvpQA$h)mAx#gdr@p9ksAXn>oBKe;(YbRPOZLhgjmIR8^wx=Em$q=CF-m zjijQyLPCOjl)f11SFV}U)Byg2s}p75cv&)kexj}R=DYRTC$Zva)!$UdM^s6uFC9<0s+J zUZnU))-Y1=y$@k~h|M>uQYbM1*HU9Xzh#DKmtiJ`(XT~OZ|yi1jiA5001flONulF# zCskfp)g~7BT<^FC%|O=C=pSQAx$$# z_B^kHrm@O5I~%aDg==bl&p<#5*Est(@d$lwLo-`B9o&6?_S7}^?xJHO=+_#!@kK|Y z?a8&|__kU7-?r3&-IZx%^_MsMN8OiOkyJ<;PoH+@^W$=~e0ya>?mXe`jkd5INgkP~ zv;yAfXM^|UT(O00b5BX0?pGx(n1!Pb2FA=svQXu!6)S;Vt>~KODx25h~12ZjSn|B-}?)ny78cUMePmX+NsY7;L659e*FUz7(;ZHLF{PjSb$7Vg)~ zV%4mNd!1MrWgQFC6cl|z#^kfCLLDre+Ph5@&%g!uZJsh-kKjv5FTG@eA#)?MEXgij zLn{TxwU#1v)9GN_njry&a&S)9YMQP$Yrg=6^mIc}_0~|)-u^|;JXc=Xdy#^d9aJcZ zCQ~N4SJ@hC-Mqa1s4s}8`(9nSRIpz+3{$i}Z1M09-igazF@$yb-_T);31QRUcI8O# zl}28;)UEv8El=XFRMQ>AvEQktEG#;eqc<=}t^ciu{JG-rfk(Xpa#Lp=RhUUiUO!WB zw%@ZU5&>@RS7^Lf~-*<@jg1~&xBr#J6TJxp|s5q@%-==_`G6_yXbD+V+ANj1>t zM2fV=E+ztwY4Gq5?mhnH;zl|C$p{OBb3OXFJ>~aw_)t2Zihtd^h}i$hGyVUV4cf|z znz-h?t@@`n23}pO*ZV(j6M0Op4!y=MdpQ0)mnLG z&98;$3wzuN+E4Fm?BXDnFQ{r_v>3kHoMI z2MC`@D#JG81dl*Rf(Ob8Qe|KOR`|%^41A0R^8e-Q2Cl~*(*Jq}W|RN)^Ey8LH$RWU z!ik2dM04wSZZ(8f@|lwQ{X(lLD$i}w0+U6W&O}-#U}17+Vw^|L!qmH0fgWnxPb%$; zo!Ru#b48W7G4t{KH5uRA)Fgpu+WHOynqU4}zItZ2xK-8A9MLp)Y}8eeFM&AzhYOcE z9s0L-*`|W00ZL~4g{}vu`-_D!BdKSZbCG2u`4bzZsF2AfOSWNBttY-8Lv}qbBu48Y zi)Yi5oY%B`_B0P8yqdW`faLJ7X05)KrFyv0bn7qwg}bdRzFj9W0|=Os?ha|LGJj(ol?!%N6BSiXY{S))r+#N_ozG+G&f28(U#yW(f8zM>fqJg` z(?nYxCnr$lHGVi*3U%OjMTho?m#vZT#F$MPpD!0qzoK=FQGhX z5W0^~!^!UPD^o-PE}~evciL{S&f|pRs30!;JkIwcqv^q_TW0K&t`rFJ@2st7EPib6 zFMe4&n&r`KL-dp%0baJ?BrSE?Itr&lBFrR}9M{}C?&TADrUrCNpy2m9I-6%Tpki{J z=rL_Ozl+xTP~^COv;ca3dy@Q&#k+M)zjrVm1{cr{PqL@)8Scsa+KpT$pEr8f?R|N( z56nhtnBX^6-Ry`5zzGe}m>DIC4ezIj!jlwbP^n-VUiip)gQ6Qn*jQRds^lp6c|Hm) z7475@ph}Ltj%_L>e3O>6u>KKs47KeX)=s{#0QYN`>P~KJPNR9;tjtr>lwJcuw*|1l zcn}KYY<)nmj>S)w{%y1ScK0jEeDf%evmGH;yRq}ht} zlHCssw0S%cEX2z}aTMNU+7Ony6rWp0Lp+16UL7oxQ&7*Vi807dWt3-;Ml-xM|-kIENpBGVyX zlFgy+PVu9y7Aaf_rlgWO6PI~Ib!-y;AHB^4{${Y+?j&y6Y3}{=OlK7I%%4b?TjEl+ z;f54l(xt&H7CZIAFX}6l)aSeHt*Z5K0mt%3)BC&yipbKJ5$jgX3dfB%4fi(4^(OuS zs(*GBJZ9xI5>!@31kYv9T&zFIp}a=%=x8K8?syCs?M~FgDAxe>Y*jyh>U?-Esq>K6 z^kh{~By6DHJXMwC`XbDoQ1fZ+qnVgGakYoLsag`D>u>|1l>E2xa?~P=p^szl!U;`2 z@_zA2fD)ftIj|6Qj`ZLe4HXU3vZDW* zxP?uYoXG-LtP3Wa-&*rx$|LP_33ZLIZcS02=xhy(Ct^|5=QHEk%I^-^AjTMPW;XMr zC*$xslPzwdz7IY=(O+6WH~uF ziK>NjfK`6`k5w!P?y2OH_$p`SQaR@^>fq?`z3UMKv9i4^)HhHGYCegM`3gXb%6*4P zTRm2ls{eVY@F_j3TjvMX2o7>eH&Z2l{B+Ai<9f^*FK20YhViTWR1J+UZ8M6(1&{$o zZfl^W(#OCP_hyf+c3)|;i}>O*b{_2!%DwML@345(wF-)6>ng}Hg)>=pPJvqthH!FO zw`t#`MN1__n$(7!X)-8Uswqi&|GQ~uc@40WAl6IpbopIccHFExAJvod1Msm?BN6v% zrcsok`P>y^@(fsi2Rg1yn?^5~BnHi@GpJB+1hfq`MqwnNU_Zez zmAqC0?gwGGR#f$fZgvj^POTcWgH^*tb?94JFFv>JBt7v*WeKiMNgljo>tOmO!s2w$ zK;eb6Jzn;8QETp1@?fR_C)9&E{Vm3{5}dL;ukB&pQp^$zR$IEMXJS+-o0W5L^`T*$ z3N4VTk+RT+H4b+tyJtmA&as*(pLaLF^Lsg$++_6p40@rdYBqD#gwmc87J(f+C9!$# zyDSkZkANoDFkZ<9wc{i0%}!S9mqAbCG^jbv&7KUCfyx{yd5-xk+b2LLBlZ|4qH_^d zk<#K@?&0JM5AEhor~CMvk8;PfB}#%o*A(Zw&uxJ^!K~Q@T|JJD0b~#f-Wu`^Q!Pr; zQ5R;)#pso#8wGb>(^k!DuSIc(Ief7HcTMOy@d*;ieUgy)*E{BvwD+|^X@D}HyKVv;#n)`1LG;yA2 z*+mSwrH@EINAL30#lyyng%(>+sgW*YS!_l+{LPMp;8gxfB3B1`4>Bha5m80dz#`@3 z;IJHJOUR8zl)X9uTE0?s`4w4;#iyGmznJZlSfeE4jZiNQ;-(rguNQ~r>j43W^ zA|Ygo;aljX?AK|1xAOfY{8KjH=lMc1o2$xkP+ywaP}m?r7|oQ2*}CP+VtZ#?NrwK+ zLO3On@#+&hcJQ|p&HVhn*J{=$REQ;Cx4gcXa%|YKF|eae_0;~be&<%d+!?8&kpwtn zq+O^>p&B7rR6)=?mPvzgdl_hgMr-OUWryOUssb&D@jn=Be}76O)QnO6f-%pzlc2Km zDLbP6PT<*2;Dt{USk`ZVGq;QA79-LDv?-`*%n|iOCvq>@$~tj5lsC^rmqGE{DY9JL z_1qodnppj*uAS|rQYYneZDK$poZOV^REk+-hCf=zYky9RqH&R{rpD!qy--{}Pozj@ zaKU-*{Hm|ZDdJ4t3*Y=txU6%HH7F7@B?pU3^r$%1l3g@`gc_YA{;6>juJQI`G@yI3 zv*wq8P;7JubI+Wm!7ZPs2Ly`qB6Lxoe?!0Mx0ntsuj=3>UiwoE0*FB|jYaz7lVOZG zK2~&_+SE2zlI`8eL@6UO%^6v7#&0+q5LXsB*Foe#s%cZOOilN+u~~DBI%LEqqZE66 zCXM4Fpm-G4_7}kjtrv%H4vZ~XEs>)wh)oq2vl<_=>8a&x>$L-l<`tf9qF$KHPP006 zBn-bH^>_Jt{sor|^&L=@MTHPxc??fFbM!*)kpq|#eDe-e@vlg1(hXx72c|gwGxx3K*%eOIm-)H9ur)=dc zeh3-9Zi^9a*ca5^t*Lw5v3#NSjD?Kf2f0@f$$}=Y zP_E~f_xP4Wi^}@c@LtS49_V7+A+xkHo>*f*MHlNEk&Skj% zNFgzV!*xZ)YEgqM5rXhW(jZUHt{ZJpr4UD&P;fQ#+rk^BN>f{)s$L_dqO9#mj9)kt zoUnA6lh$mPcCV98Qje)``m$YbAkAs?u9kVoTn~r+W$;&IX7>0?cCL8)zVm%x+wKox zVO}DK&ByZir~clz&}^}Op@8gNmbu-Rhu#)P{P^&iDi3&Dd^Xg6;v|~M9PbE{I%q!u z0=xuN_b{t13s}Ny_1ba@ZIEsuJ6Xw#4pL9Ohq12MLOf7!Gg$U>{EV3JcW94|pBe1N z5s-Q1(acbm?$lBuRo{_-&hI^cYJ2W0HVVlnw%udKu3O$*l_EFK72P`g!Aq}+G zBXl%VT$w|hTZ`=E6a1AE+?tM+?PQG=i^4c?-FB*H16R%O!;qVhquE>xxlw}H#L^PZ&W8d4_wC~$xe;EriGMPw&hqV|p%bvOP5Wqt?1LIUQL)VNXJW$IY zAwR{gp3q3ngV2Y{gommI#W1$Eoo&h)?c!W@N5p8QSvWOL!&F3y4GVKz!K{|t=|!Hg zKe5Nk?3WHC0@D?Z5R|qTp-PfGb4nK3JNz_U$3*wTv<;)}FSJQGDmY@uP@5Il*^+!UiSOb~YMiL8B4a=Rdy4 zF^u_-+?_;yGlq8!_#_<1sEM>o+f|o?=F)MFKJz4nepg`bTWkiC<`@?W+MH&X#%^o$ z_QxSU@YBl+dj@mA((_fLxW)HWfhr6|8#2b3+VOrN)2i6}FP>|r88PM+UxP<~fH%};wNh-HNke{See zZTLvm<+K09K=4OuQ+M(!k+lFfhB?J;!iPYOw(A-t)_yh}%w$>u{t;!{`4K4cTYB|C z%4V{_`3$~h9Ab$d{-y=1t|Rg;xyIuBvas-QmjQppXZ8+iFX?)mdjjz?HTd)?6sK^Q z&?#0oRVQ$xmtMHv&X^i7&w!rsxbcoDaQCfkU*ucd^YnVXx4yQp@9#h2n!;L1=*U@j zk52~%L}`aRo91n#f?&63B42K$!Iya0P56=9~Gq|S=;NJXZ67tJPbg;S6(5mA%CyyTs>j3~$Fq6+Z}FK(MDF*>7Es@uW=gV`wX76~ zlpj|;f54QOa1_Y4{+XI*%d|C{h;VeVGxNCeyL3>#PS0p1+Jo)L_d7+PbU*VUWqz4%ro2S-c$5ipZmuZRh|ikUZ4G4#U2Vc}i}R5BqDG=7WPF zj zvpYieOm|U=iWgPN7KbhP1}ZhO#Jqk{d3pYfXPB_gvhJdITN~oF;^Nib;ymg^j@$9| zRCu$MviWD`dDcv?%g!jElZfW3%_+%U-_Q-gb^Piv<{}mqK+0>xQhPU$qZ-CM1{s>!y3auSxs;w7iknWbxG!U?R5k1U`Pq9+v`Z9l(WrY{t3u*< zN63mbq~-0RB_Da8zQMRRrjo>Y`GLF?37f~t(4t`rUdPuaxN z)?(;RM`ISwGGZ)Ae0V}^L5%*tOQz+we7K1$!%BWEKRc?%D<~*1m7+V_D~Qdnt;Loj z2P#6`(>t4EZu)Cmf69wuFWhYSBaH0)((G(TxZC-xfaNqsqsJ@s**}It{G}x$Xbjb+ zXaULH>Leg+NsVLp)5kq2HdfPIX#jL`GX52Id%oCvRtSU(07mP%cEtot8W{{d=;Zm zj(8K4ac|pY?N;g*CkJ)SFtcoJ(s&D{7rjS}K<@56$W8apNcu}qo%*d*m8L%=X8N?A zF1a=4{qS{Y0h?Nej3s^==KQ(IxU}$B&m${E6DQl`Fr(R8Mba2ggbZ0TbpqtCEgx>9 zz3)OQsv_vqK@(1T1hPM?5NEnWd!K1$Wj;DBd@d8o{3 z+kpnJr_X4KcyVX4WvX)mA+;-B0-hIKegrrwX9AUYh3~jJm z;+@?rl}==m*7j-=CmbT2PSLEx53m6`3-^CB%3N_qa4dt+44`GtjFNC|CS@_~h{Nqo za`>dkeC2jVCtQn=%}^=Ue!bKMHY*DRm)hv@($6nzeyNm?{ksHYI=sH?+g^!*x!AHs zqa^+!lX{u2oDJ19=4;WUO9-0_l&gf@c}*>GJ@{Xlf6ZLm^oz z;Mk96xG2w2oX`1b05J zgKv4}bFe`rp-%V4cSi_h^5E)aV=+nsrDf4h2ICr*ehTRH`lI|4rp99ghSPt4Hw`H+ zzJ;2}mLXvB#9!!it1DY9BI1W9lY4#C~slff;x zTks&kT?Pqm3GNdh=n!0k2N+;*cMp(Y1HlP$hCF%Cd8=-nd#i4p`{DN2nX1`q_TIg^ z|G(~D(;cBN#J#Pao-fViGm<%^C7S58le)z?fB4jLY>d_Mxpf+#AX4eMd{k zSfJw3-`iV&i`v9KP#YH={Vav>`Gzw!5R(Jeu(|bGGMY3)Nw-L=(UIz5+XrEn%UG*l zYGu2pA9zvdrz-faiQJ6J^_}%g1lXlbZ%5Sk-j2gAclp&`Q^m~upzZInc z+GtJ#_Ixt^NsYN$fROWnjl=s5csbl#jk0eEZ&w~Q8b2OPRfyI|`$WYa0r~<_vA)Mm zLpB=&r0r@16KEL4!+lgc5;=ID8Tu!2} zo3G`dXu}UF^(F^k?Tla+r6@9)F!-4A%zr+;y2IGrqVDbb+o?2B4}V#o(fTW=uyma4 zWD5g3+$XoNMn9j&4{VvtSAa=bGlm-4Lv)e>9NSAxmgE_MBoTs2IWvFe;%3AALaJO~s zDSxAjE{e*q+&cLcrpwFg2qgjhH0Y~2^q{-I)&E}o#u~};bq|kW-nhKus ziog8o)GWpoY{VNMQXYqC?m4KroR*5`nGiJ-AcG zBPXw!c6Bi9&vk$g%8k54Vb2~iy52-R&L$8P__u;^tpv3%`Zctar~2wLANJIkXJCE7SgV%E`!_{@c`O{(ql2 z{eSVnY{5ca*DEH)u3~)BR5j8}(xk6W0k7oxKfQ-50am_gO#k{-{zz4kX3vw&K96C5 zj*d=hW6jRjVa)aWT7)A5Y-B5QTAD`tj}?7Tup3N?6#hhC{lGsqZNl0js1r5$dkYFg z-cE4DJ~ujQ7UzC{VB`$i_{ok*>vLYX7kuMg@hSDGSF{N@r)$OcF-FD$C64{zx9y$9 z!g&KKL~Bj(&X-SOPkc6jec<~E8!HM(fj1FQzcbN3@7w>3BA|t|2iobp1N-C2m^)-a zz>_}5u{SUA;FFQ7J(U>?l(3xypJ_&1G<-g2bp?n?Q~d7vjU+rRD8$>0R7=n~-+?{U zYBWB+9pBQ)_zRGE(6>>{NO3lri(?;sWNBELsT1cfR1v%~6}`19hc^K3oz-d4==bHy zfecDM#0|d{MS;z|xe4Y>^eVjs9S3Y*2ekhnQwthL1NB7)oSyO}I;={$b&!JMNcwBi zwKp94yoM}8e^-pgW)1DhR|6w4Oq>pz3vVPp-2peHPov&|78I7GA`>#5k$gR`TKkUx z@4V^q0?%(9U)vgvcvZh`tdcSrmU{kC3gbxAC$GCXM*~$NgLA?sp)TfZ3Tc7OE_?iv=MI;}DDTUUrFCsJ z5kIvkw9m!sFpvIXyPOS84%*sJ>%0jP*Eb{Ovm^ZA?)o|q$R zizU<BTe5s+XozCFXyC51{6kVH8>F>wxMLkAG=y`c^=Kz&?1@-~NEfO}S~!iiw)JoJ~Zun-p)znm-f zerU%p1O$pFiZU;?*Y{!Q@pz)erN~})XfBT5(F636S|#>)wJgZrb~_wG`=CcXX>HdR zqPw(uzFtS8?sXC$NqKnp494eP3ke7tnxHNO(x;>{1W_%1P4(9G-IVbv!XwPiBackUf4{ zwc^gU?y}LuGx}^TF{lzCB?n|=An$bYrRLMg%NWRb`1)&&A;M_~U&{SiURHShcUrXz zuD&_l?eY*xjZvY9Hg)0@b57s5;UsikTkW@`YE(H6WU@iMHM-m33uY|xJSo08lp1Sj zA5V!Flne7HzQ3|6il$kuEv;Z)isCJfdSF@Wzfmz#uSN2Dkj=S#163rSyMw%pkQ3K8 zX(2R#&UI*`l3lE`LeHGVNmL6o?FZa-u3?lBPTg*u<9uG!JXZ4IO4Ez($GzC;zsTyr z+x7tcc$h>3*7l9>PEvnx8?@StJ3XMxGTn3Qe79Ad)V0DFTUS#=NZ*av$~V!XLQlLj z+K1Spqf;z95e+mSzqmZV#pD-}>^4K-m&oW|Wse}AX^R!N{XYLtPixpOwmGO4U&7W? zQlltDe%;F{HqToW^fm~^m{xd^GqiBS|E9Ul$hXpun{9S%j6P`epJ1tfJq^VGE)?^G zByG~(9&RP(Z@23P+zvAFJkc5~_kiA%N6DEbpt;u0TZs1&f$8sPn4pB$hhSHN#Y_jUpg%bQh2?8A_|}2H(FNcV}!%nJr0IG zn`kWU^yjwe@zyZCI{JizW$l&1ympD~Eev%j4Z4bD<7iH9jVG?CBUHchS$CHgtkYaXAT$LoZny*yC zbJL-(U+wBzXenL^^Hfz4TED5^s`m;ET%8j$baA8iN%(9G%ksO`hsnkf>(H28bBpDC zkJNUJ4-nY0pRUD8H&4F(@$>SNl@4A<(puzexo??U<3m zT6X?6$)j7BTtBEUW;zMbXwlu^Aq%VAIkemy;pG|L;+i-5DqBEdFVDM4`O|tBCp6 zxp{gXgH1B($rK-oT@`E3Rstdg$q+X6X}2_UvPzspX7Pot0oO;Xg)adE@jo#5P-qe8 z{bYT)Jl=-Hnpbhc-~NO1pO<1WiK1>N=Smu1h4DE@hLFTdXtS!8>ZWhGz7T3I?d-RH zLdolGmKCwT(6Pc*wo=O-X{83o#(Y>KA1$4P$N6WuWJmHKw;)$F&I4%Mw8PFW?Q^P} zsW1Wih}04-EJxYAWP-1Y0#~vq#VlQf=|QjOQhW5?HB&QOtl!GHRt{z$UL=_9=bx{$ zDuRHqWyr4K8H+A{Aw0$$C(Ez+yTC|4qa^A*de~VBj7}g#r!%yddFr8o{!Bfz^q`oU7dknZd>|T zV}XuHCqySCz}obrHZn;>&-haMyJAnSi~mt9nHlB2=OL97Nq5b~yXhE}hA2(J(-wPN z_GsIT1kkR`r6}R)aOTG!BH%ITX5h)m!&~jTiO?3~!4591z+!u1rn<^U2gIyOvaA&P z)GeCIIPqXPL z9dfpe?GnQ815x}wJyWC-qI{;-@uJNkCc344^VN+&ze+zEY%qsGa0eiTu3nM1rI4YR zh7M?yW{<8cL=C!aHjl|xNTOsQ7XmLhhCcm9lJ$AX{bREA$FlF8sMK!LlBOH_D#A<3 z+ou3R;T=N(8JvXu7GeRN27WHvXcqrL;l_c4Uzz1hGZjn^M4qDEm~8IFDWXZH=p+<$ zXk|lR*drgbF%qte)In7<=U@bhE+R)^YDc>&>(-f#kf@0Jg3IT+Yl#9zf|gik2nLbN z%5lvs=cJX=YI&3(wKphmPOtlWi%A0vEVFu%0w)IetHOLf1@HDiGbegN|s0rs(M)zrX*pZS60$830ZkRsb=Iht((d4 zx?;(s25mFaK)Zx6PeB98-3%CphG?9+i-QfQEc&LS1E&%iu)X{KBllypAL9fGGa?T< zL+VJLN&wz$8#P;HQ*R^xpHukFU)STdH6k{0so%%LUMf;OXKNPN>0{Wg+D@>dH7`am zW-o5ZB>LH2JKQU-IYgfwWS@KnWk|ys9|1Gi7wjG|ng7WQ{gUB^FUz1US4ITlSV zN<)o77`2ae$n;kWx1m{34XGPE24@<)G1R)F!Aq&-%3Kz}j9-@}wdj}q&V0$DL=kyw zh&pR0FH@`==O~1?PL@ET*QN`mL-O78RqcZJRn5QWi(qfk&d^hymXW$_%j)dr6PVZ~ zS85ig0?edkDV{1N7>ZsTcQDmVZ5rxXR(g5b zO5kRI<5Js)=nsmgWqXVBj^klgYMrS;C}xgiXItp!I=1+#EFUS+ieYOiUTWE zIc0LWX&7frfh^4?j%l8t%tFBB-7mJ^(KK_)Rnk~4(QcKNsyEFo7Bk|O!RAik`ks|b z`uFK^btW#(YiXL0bR`%TaV7^n5=p8BSso!InqkmZn1jJXV{UwiaLA2@N{d-co$EAv zHl@TW&%HWj=C&gA6oXO-Ym6U~vG;qz9cedgN*C7i#9O}HS^d#T7}_zWqY@59pt%4O zkQ3#vzxWu4%vLJw|Cmyn1fFyR-MQcH6+Q7eRIpq`G77z_xO)_^QgNse!Ct3tK*lj< zwRQ|79-(#UkwcXEhZaP=k3`$HUhZg+s$^0bHs{wV?Jbfvatmdmli>uiqw`PF+ z;noajWP&M$+MO-q0xPpG%QD%pvRDC%g4Q-*03|evEE- z3*b3$T_xPisFKT}3l;N{P$zI-Zd0llOyyp5m3(*VqHIsYiP6X4yVnG;9b5mFgbvSh zBdg}Bg3UE@MLYk1k3&CU+Xr7IsS>>gC`yKyJ@P28f1E`PmRl4YFD>)(HM`9_xFbS29D6)87m zPfb4&_-6}!bK-qcslE|@W;*6tg8~h4uqiFr#?&|-G$YW~Ww@NjnDu{zUdvYSlW6dk zCWz5OiM-jiA`*G{>p_SctL957E${T2q9Pfnnizj$mV{*t4T&UfL`Mbbm^k0^ z8G^lg3IcUBLrL|I=r$lX8gr_@L~tIpjr?Kf{$w8;`GafKem*P-@}36ERLMUKv5)Ca zb|#|!w#rdNJ$$9pheX8b0dUw*B$(jcauNx;M=haMBIvu2AClz)SB^_wS2}N&0QImg zqY3OB9eXwVzx>RY%wa$>l4|2JUoc*UJ{JmJ%c(9ytPEE;+gm)9rX*{lF1XN+n{Uwctx%yk7d^$bNEjZU%6^$H>Loq- z4HJc#m9s<*xqu$|$pJW-D^YdGxcJ)iQQ!Nq^RZ+23l?}ilpN@DT6?tyxmwp3+cTNb zuR|2}g!q)Q`;Xsf3jbg*x$nF(F%p?AYEp0;#eZ22a1xwOMXB~`x#A8fWjrnLZHq#C zgnl&wk_&PsLMZ>w!FLqCg0hP;f6{|jyYjWul>nfte9$BwR$+jX!z0^N>9MgD%k6Rd z^@^IR!oAp1@HFhHF6DmxhR^frG8s8I{mP83w-pKk=<3N5j%?XB%MLGl=pov#_iTg+ zQy%VyxD1*SQ4M4nSCw7MrAScK#RLu~ccq!62oNvvxZR(%J%fxOH`q?@Gp+kMJ_=)Z zn4oZ(lv4>XB)9lJh_JoYUap4?ubk93aV64t>{*)^aox?B)4h$xXl87sP>_VP-j_eM z51GknwY}yBZxZ^rJ{hLX0(&Ng79|^uc}gfB&W4&W*;t@DQeD`)sVEw03en+8c$7)A zm*6s%uXqx8c&gD)T_h+bs5QK(-&8*m_o$uRdaHL|^og-Q{hIu~j0H{VdOJ41=d0-ohA?&3 zp2y>I9?cF>Q5kUUv2cIrT$3;Uc)gFt;IwD`cqD4v5TZDqePvEtX3PR%PI2 z&E@6gt1rIUBH)Fyr<{Xinz76RjmHfWZUrro-CqonG7*=}h`S_)5Nqtd|BsV-sJ6h@ zXJ33hxblM9u&-}^FWtiL+oP#c@ip0Gzz4f(G!R$t0xKI9=oLs8=aOn+5UfK4*8?0F z#=82_^1wR!fZDCaZ&7yGyO)4;Z@)?n{qT$P(b7Y>_kP>D*!YA@MS|vID74F#dOV(o50gRP& z{;ths&(PWpxoU%Z!q;Z!@@Gz7*uTaa?Zuq5j2Tn5YIJg4oT-YPIc>qJ1MSc-eqM|Q4noj<7$@2Yma}J!O{v)W2*M}E_RT0fZyewdT7mdfglcs3 z1|Ho~Iy|^?d9hq-8D+$W5f??%_Bf0^@wBH=Av$4CT9g{Rlqm>=XOqwTX=jPJ_!YbgX&o86V>xbP+{M&|`vo-?y3J07@pgh6(LjDPr?^Q@tzRR`Q+ZGI?ZO%6L zJ?7N};WgYY1@20}IQV#DOm(}LSkDw_O*h=&6KI|XT5g(#8DSj9IXrD$wVOr~$p1ZC zsYTxA?D?oaW`xou@KTghYlAYM^1r=&ljV(nX(RHy`J{7YVvJ24t{|u}?ZJ>%NykAT zUYkI~@ihq&ybm$UJF<_JdTeYxvuc*=?1UNkRST^fA}|dIj8q}$!D^Mj87=I!E-YQ! z3}fmPgPz1+^xw3%_KZI~sNd^gK|JQk2;G#Q(?8Fw(kg}BdcBL4jXsd%VOS^xb3(;* zA=llAG3LlPt}nJCaU`xrLgrA52=A(SIljl#V1I^w$nat`LX+^?ue#G+MWUAxYqP{Q zA{a^Ih$+%frU484eZ=8Uw|*=}dOrBy1D1w&U}4&|-E~LWDHqIYBFjt{@2#vrTING$ zwTdwrV)y4!N7q|kZW~0ctA9UN8B<{cp0S*AswXP%W%gw#tE5Lx`y#c^afH;e9&B!Dua)v31sOc-q{r@yWC_A zxEyTv*(n3o-=3Z&Cz`9`!-Nc|WS7{0T?^|Cqm2cg+H#fPQ1IU|u_G@WnWfN{|Cic? zyjNx%mb%HRnjMK1--o;k;JrlHn(^1upA>7N8jLSClYZ%`&iFaD2Z**{W?DhQgN8qe z$PUF~NN)S>@WAteMn?eP*dOn`U(-avTpCLu|dFEw-7tDh5C)&XDlbLRsR$4TGY`*7s#U`6XdlfEC^v_WZd+LMABQg{YudsmxT-6LWZbg8Ps}F-J$oSJ0xr~v9#f{GWf(LwG422h5 z0cQTmQTI>N<{E^@b^)NipFCA`A}WYwB%%F3qqPT@jVfC7HNwPn48wdbGjxOIy=-X2 zZ6&yo<%tZN^hjT)(Pi!JFR1dsgeHRMJ34(}(N?Qmik-y8yF#g#e@D=9U}C--`IPYT z*=1$@QEO@(W;QQG-H%mqWTdU<8|kaZ$_TFFKa~-mUM;&)5@(lu)cs|P*PYbf%uU=b zGT|DXX8@IXYoQaeNOLdUs2g;(ynXCa`3>ny%5iheFwgu0bXi|==Z>)j$O?cOey7$1*sMf^ENlwX`m{_#MT_;H4H$Z z-@4XmB!xZ6KzF+j**~vWwAC&YOFN7pz4T+xVctBDlsK${8NC=(fPs-CZT0aTW9iFq zeefBB#JlR=;Q$qGz+n2Xm0nQnYJg;t;Z5WV%b(dMLwS2ASqZ1-cH1!uhnWn@Rt%JT zoINi}2>jb1zW^FZ&3$F!gjGW2DdWbIKd>c!yF?dmpDHv1_h8RXJD%jSbPy-ERi0db z2D9^Y2ZUP3Sc?p3-IHM-4O9iQp%s*W{1ZtKlSzCa`tXE=x-*1a2!faK)ZD`2)dG?F zz1?pH#j};h7j$$_8ZpUYe03HVp z0SE4(6QBYBI3(C?f1B{%UvTgUh)9o+QBcv)VI6871MqMN2=IsqNJxl?u-?9~^8g|a z67CajsYiHfZ;)vm@p%GbvQTKHE87WPjULnSnm7fbq7f1ilaSIgFfuW-@bL=>3JHtI zJd>4^S5SPeuA!-=t)r`FYG(e{!qUpx*~Qh(-NVx>=zVZV=!cJCv2mZ{6B3iYBxmR3 z=H(X@el7Y|Rb5kCSKrY1y`!_MyQjCWe{6hWa%y^Jc5ZcTePeTL`{&N?$?4ho#pTuY z&Fyb=!2t+=BkLcO{Tp34FuLFo5fKoPf1?Wy-W}Eua1fE6a6iJ8QbT^@h)2T{fPya_ zlU3P{O3VA|n83to6pfIMZ$1fIAmIR7ZkM0me*m@*u_4#21NJ`ljt>C3j9hKa zsl+Pj7wWqD`w5=~RkCJd0YNPIbD^!git8ZElH}mYi}=g@y2jM0Te*z<8M@e;$NuHi z2#ArheRLTryrB;O@^RhG@`(1m1l6^D^Z9b!>;o{oKy`JjPCx1L^GU2#`GIK|KgZ!2 zlcri9U0fT%7L@BmIX!D74cU0KbrO-+hVW#7+z~$ouGixWQLGaR>yYmrQ4b~SsHoD) zz4^3)64`+OVeo!U8ZrNhRosT9YLaL(k_F=yHN!!@(X(<8=QY(9w(8!7msm!p>Z4^{ z8F#9W)%9yhxPfb%ubmJG7|oL2^oq$^&w2#OPGs@wSYHyUvA*L(>K6%FS*O0(@N-@B zqXdtaR1Xq$JpjkCv)$~~OfJO{*KWI8C<66DF{5p|Qgh8QpJd=d^)k9h4O>%=?Yn1^ z*S6MJhB7%I{D-(=&cIU0?7kV7TEl>=cR{RX9q`kjxt8w8GBx{y2o3gHz9A^WIn#r z-7umED<+}?a*$bn8o`Bk;LI;td0ESFd^L-~d@eT{l0jP)V#ZFD;E!Q9$K}8s>l_O= zb6>O!^`m(JTDz1d%rrf1ZSNBAJB?i)03f>qDpd=<=#u!9iH@%(3;f=m+1a*J4?m_Y zBItIQe8bOR@qceD+$ zTiS**Pp&nI#Uu=lT`MSKE}QIcuEU`a{C^6AHfrIW)OfQ*YC1ai4p%=kyf~}+V#N!yq z$s}G*+=Dipox_;5-)gC5NweouvfjEfRKSliih7!#wPT*9i$I*EwcTzIMh?aQlhQ;P ze-J@TE}47brF@rM%{zdRfch@P94G&bLGX1BhAs7}!de6NwJvE?>G6DLW3I@vxwlyb z4W}G>ZEQMc(!n+v6RLIGp}WLCc$23;uLY^&%E%3@&pM&%03AmNRJ#mZn72TOp+f?u2XEIU zb}uc+Du;M)PYfC;I^ShW%4`>OK7EJbcf6ji7sS6Z>>y34#sZTE6L&2?&3$f8`)0 zd^Eq49^G*pU+}?Y+?O)O-JB{(?GcL;GinwYHROE{R+{m&W!($SrV0ce^5ssVtl z>tHJR0en;`KUWGfIcuDdeGRoa$xBN_g_6;LdYTQ#=@=u`yz7)s!6oMKHYY`R8$#`2 z`pbOk_aEO)W7NN}#cGdNK_(t9Ln^KiBN#RmbZawPc!t~*X8%tcHhctSyVh53ZK!J) zbCtr(Th}#MV)wUv@<~AaEi(8ez(`R{+qEQ8HPuRSowTEsoF7?a1-3ZD-Nmj_3D_{; zYVSp~s295AV|ODpx?&YG{#^s{eOrg2ek%_EIIwv@<3tu3RCql$wzK9|R}pd~kBMk% zce1%&FbElIan^t>sYKS(>DZ%exyi(LiZGp;-wAGh)=g_NR=e0FM~hJBMF%GxoBez1xus@IP#^ z+9gEd1`-5?qMbefgxBTj<37fGmzaot6r=Ptp_-~yw4NbvZ=%+C1ej%doCodpmLH$9 zBddWcZP7Ks30<@at0ipD3S$}*mh`ES0OwS1Gqd;Ui4--Jv-kgC)@LKVivES~@>OB$ z{Ma9isH(jAYR354HILqD-7fO&Q3O^Oig`@R(7VIX6=&!=NjLi1{ls7&A8>q&&H|Z^x#h}0072ki@H_r#)j!le6 zam+>GknMuP1iGgjb!lH|)o-Q{7BR@e{2ku8jgczeeN@JZkD1M(vv-$7H9;6TPoQKu zhB+>fM1~oWQi@{7Iz55AKpI&E^riT7$nQ4sx1+{5Xnpbl*jux|C!K&mglaIwxB4BE z>}V`gO^Yh19{`cJDGvZ;`2%2#2l_cx?2@dk8!3=Bx}}wY5?LNl#)ntldo}Dyupp8+ z>(5m!MF1!-tg2IZkJm`NC!F?r6kuxgwFhY{8t)kg2jBH!PLc$N9tjVReoSAts!`6^ zuJDfmdsh7(^0@a5d@=p30zydsbQo9dJz4n|(B{$`R7*!ZACZLh_T;yLt{-04SGMR6 z*XmhSN|MBX3868LQKd~KU;pH+s|`YDjC+29l~c6)>N>nL(aovHhLyTDQoq+@1ZA?; zV%z>pqXjK8-36&z%bK#OeB}h&9Y0ce2I1S}v5vAA@346%T1jj~qC56%;Rl|NyUfn@ zPrm(Zeb!mZ^WjG%eY09pu2a9ZCz}fXwm-5|;kAUpv`dpO{3)4|GNIDUAwTBa;7}HO zr{b9>i+Q9j0#5*v7kywP*^x9CuO=NTt z={*1;K587nuD+ysyS|YeuS_zLUYAI|LiPh;IZy9^PBDY-m-n=O?m6t34snVTTiZB$ zGDNOFokzJK^H`ZkurX`!j{R8WcS)T?uq*FpWAoyezBYOdlk;U&lcR0Hj{J+L#c^k@ z1u{>ci}id7mOaZXn8=3RrC{&fLZXEpfM7#c}@eHoiGVimph<-?R}MoTJ%O zsCuRu3sgKxk-sCDuh}0wHGJDU$G_4PJGUoOm;OrWkt<%sLT2hZmAk0d^qU-y#$lu5 zuI?67E1zTOx0LdqF~*4d5LrT~W91PJF);0)ZpjRl52+TNilqaPwT z%7T9O8Osj<2JSRSV(&y~fHO2vAe~bcKg~;il5$I{(VqH!@~l5PVE6zq8D<8>4by2F zUuzL%97lOXONrCJ9j~#{)AyL`bG9C2xTFht^x{|~py&BP34f`CdJDL!s{V|z;PFG{4P1BdPSp5c<>p5hFc62iRZBs1gVFxTR z-{)cW+K%i5(LB}Ha#Kbmwj!85U4;xqjisgM0?efCOq#DmGu`4>j=3I5{uGXZ;wys8 z*HA9Xag+)T_n6=5ZOrzNL@7Ae)FM=uOVuIx%XtoZDdYdOT(r@D1cw)12iS zrb;Mkgw`W1YDO}vxshypXlMktqY5Itr*k`~;t(Azp5k*jPQz!&J`H%)0W|{ct%CFP zixQ|#&tMXOdC#&)jmDJi|3{6**mqC$_S$&EYA!0vHqRz2f*>yQ*T{rZ{ywq}j35Bk*=e(TBv_ zBHK7bAUWJ1C$^rglujn818$nmtZzk!(HJTTZU|-_fV5Tb>8G|MV=81K~ReikxFG=D@bga_w0H6|u zSY))%xrfq@tlL)`OF5HA`@QfMVH8cxNKG$D?@ntdf%$i#&=QsAI`8y6?2pxCDZTGj zrp{;W@)5f*+#RdxNrono8MAhN+VCn~2doZSs7<~ry!g=H)c@v;s%rg3A54X+yh-xflQ}qPQ(Mm!i{Ch ztYUR@0~zX->VH^oXD1+&2$OqHfj-=MuEJvZ`Rc^!is?_` za)I$?qB6!%Q8m zwO(XGNu5@m(*PypI-J==_aoE1+!z)d;Cgs_znlyOuO@-ZJMJEUQdK!)68+(IWeKV3 zFxC|BMX~an*02?x$7FT@5QuHCRm0Eu_-8U-Wml06sc%FqW^bZ4GtQe`1f1lv78%tO zql~phmSP z-EnIZ*2E%m90p#eZgQu(p6ksY-7SK#njR%W!1SPN+hL7{6UtzVLWT_2QmYZ8hL;Ir zi!{CSt%vxjsh1Z;M$9M5p`q1HYp&=h7Yh5E^|jUYUu60Zc3?EK95%*E0s%Tq288Ia{rD;^f_uw>4>0F{s=0vr+J=Yt| zrmwje{Gl-C%_hr*5a^tWQ%CX57uB{P38n&R&@XHELLS=BCixGPRL1isY-uyzjhC?e z&{RTPnx(e8fMFCyHjUzGG(EmWGjmOauDXXf=*&Wh@LqU5Q_ZIO*Pd&y_?`xjfNSFU znD}lEw6;bmr=C#>V4U>U3kxw1No^AktL1y3E_Xu7QeKS`+VXTr5&lRVlXZBL%JoDQ z!4ZMh!N8YgF*U;m++=)e>`7X92OfZ8FL*H&!0gcu2z!fVQDXw;Zc%Wq-gW7JWn#(> z1O6wC1%3JYxE^K%mG6qY0Q=V-Jn|_mItn6MCUtSo>WIh`UNcOf11>)`gOM%qAjZ7Z`D|W9l%Q zK5Q5A`>DSFltwF85w7EEE539o{5BTzz>)rkxi0j0K2Who{L7J1+>2z5KoW+S+8)vb z(})!;Wr6eQ;S=ypV51jEPv>k$oYb0d%*tJaDr|e~h~1_4eBevMAUzQd1DAB={k(-} zptl$KEr#07%Uti-OD4l1ryh#Fi=sKLujZvYZnp_(f@u~`DQj_7h8@!wa8w_PKhL|n z)9brvj7w}#5Ut-0>K7$j+y!Od!Qup$Ka3M5?Y=$$7TF22V&5N`%xkIesHpBLKN^zuSi?8cr4{(e<1nQjTYaQg-$(U)=zx1d|DMJVCZytbVSO^+) z$C977I^b)pTt9wf&$&@kuN<4bfWK5w*uS!JPAeJ_)SiirdOR3E9qD5DXj%O@__6@K zi+(AqB=@D*;Em!eE{-$nS6Mho3Be@kgO|l;R5HgCUN>VGk-RUC^HWxBtvG1Iluk@4 zrPwg*OGb-`bm?V#PY2>L7V0!hfBKRCbPF-AQ2M%a(hpgpka(FeMKgn*!9i1mh3|wc z^!31pA1kp)>e5$T4N8PC$JjPn@G`60|o^0&`xl9Y( zMjU@(&`$bDPV0Zvc9VoF?e76-XL=wjNBXd4?+&|uH83*V`6PPaS~x6HCBn*$a;QOm z1(<#k;y0oSX|$~i9RFTnJ@-S;i|u0r2Z2Fx0!IOAO#oI0lEMaMCJxvLXc!lO(Oyq}rc?;S!Kx$hE}x=>4tXJJ1pp#8TqBKl=bQ?*Ulk zCkVX@vIXshfu5+Pi9VKUY=j|<`SEX=rif$dAca}-BQFtt{<0)~gI{SKpf`dxcJfIGlB`caP)&G$&LzO)r>+(S~!oUN7GF4S*q-Qn7&Br^Z zP+Rd>>g}19?CFL9d8ifz599wI>7Q4FP(e?aYH2HWl z1xNH+G}+wGR?3M3SH;pzXz#@5`Z`U^?w8N?$p$E~=}Zf|EIi0MuC#Kr3FpL{3KSVa zMb+Cm;`q20m8t>v=2JVLIRBys#A6ZdM$p?jm@lvd%P~L+jQYov!kvyl?ioC?t38q% zSWAKN)phY;i8G1|aN01z1MnVCXUtZV-Fvl(LS^0nJZ6_OVPTQT$~fDTP^Pm++Y}6` zr}k3!!CZwDs}+aaQW=it#>u2JuOuoa6Wis@0Z*4a1;rKHGz|hhC|DPNrSsSKPFLmI zpza4?i$1S8%4Rh&gxyDM6`fgY$lF%#a*l-a?#k(a+Q5nUu6~FMC>tt#0RBk?esMv} z)aCxY8P%$a%Hdkrw@SCLub0@j-Y_fz{Mk1MntljA+I$imdI!_d=?>8IIyL?IylV5u zRdyzwm3?#*)qe<2!k|mISCAt;(DZj$w4t?27Vgp@t7TzWLZXX>!cR0Kv2(Zwg}y{; zgo(}H-mB}YGUgr3-P2L6N)lNXNzB3^HHoW?t7A|w)i3V>qwIg7fxzf;Ov!^_40^<% z6PHLqGO21WBS|{(Z%Xh_h4AN8)A%F#0a|1=AjniFSFSL`9VWxSa{wUCxC_d=lSnFd zRjl4{tU2T`bngEm#P9Zp;lv+>8EF6X7SdB_*ea`SuXG3`WF#^F;RiI7e;6GU4B%(V z9HW~|mX)D2Fn0c(oKkb2QxJ zm5qn;xhjr+6*uFSiCe7So8EO~K)X5xBLaP(@{kS&4XOXiHGB81(rf;EFEp53EIa_J zUFobV(b!5<;muE-v#<3#N!cf>RqtCo3lkN}zWG0HN(vn~YomyI8dhrrG=@qZZ!?EzT&$+%zv2i%k%#A*~2^^qu15Y7SN9~d%%WtI=H$R z8)?ZyP}^o+KM1ZRafN!@thvWB3q4qxFl~gQ=PI0mcy9-07r{(C^A!l9V*7WCT zZx@&MD`Xm8fSMNw;QhU##N_QgY=r~kE+Iq6cjr{AFK2c89N*aUE-%@|(z|s;nECrM z*&Tg3dH^u5;74^SwbwY|!5{b^01^Z1Iopfzjy%arjCAWB_Wti}pV0$o;ej48$0+OQ z;5(){_vq>-$TH^cu%~-&JD>ZOFzHk8vB)jH&Wbs2SSrQK*=YPec^MX>!Vo?X^0nH( ze((crUsLbc?-ktmu^mUldw9RBIEjq7&5tYB+f}RSxlEhB)EJZTK&v#5HGRq&6cAV$ zk?OjqEy}(EX)10i#&njP7>e;OFu){554^5W=eB2%2AB@szg8soX+ATW{`F?+A?cD^ zr~8mEFu51gY%aYA8A2+T^>6)<(T`1Ez*05FvkyQ;4F$`!0@C(;w%OTc+sz2K1P7N8 z;5gPoTJ*cFQ2j2FuoYz^&;0d2T#CY#VD?p=xThMg%{C_f6@C02i6p?QrrDx*5FI0X z(=#qHmREH8{m9#%t9zy+=&ud46~#=V#K!xfhmDy!8F7tuU!KnQ?p6PzM_L zzaRXMZX8N1yt9;3YnePn=x>7SpNT-lA#~3oNAgNcR>mApe@6fN^)mVM$mo|qChD(d z`;VB#Qa#qVJl9Qzvbz~t#vN9r_Eeg~1PeJ?=H2>E#*QTJ=$~YrexIYJ4XTmNt5bok zGcyAS@@okxEo)Y{e_=Zx96P?6B+~z;X@cWd>*OM9E0gINXL>WC?7fAbLk>g@DG7|HOQt@~?2{ zUjHE1!g*eAXVv(Py)PS6e~s(gV@D1a{_s# z$x_#FxAc()S>I5nm2Kbw&}-2oVP?%L@O=rBn(p5hr~h;$AZU^v#RK33D^^U?dffMt z6N+c0kM%$M*qzbYiJ`~BEc;(tv;LE+vap5(o2UyRiFP8;N(ijN90bZPCC#HZo+}zJ z%#`uYewLMhBrV~){)Ey08|_1J3`$SieQJuQ_k9F-!i3>LeB;=&^NOoKW|xJGDH$Ez z!w_az2$^1jYG0YA!PJDt^Opb}P@lcE%-5w0`7F}@}gd%*FsGc*c)8=>%MDc<#f z;(TL5TeDJt2N!q4fbsLpki%?y_tdahbe^+bY3 z>;6(^=<(6Dmz}@xP2>2~l#;$cg;h4oz5+<}8^P<2LqR+F7aYr+1GiGkw|n=zb#bpM zKW^)C+QyWw;k_W$e8e>5a4?L1nyyMt^}JJDWMm1V1xu;eZnchQ@+8TA_k*D5yl`)xnDZ;XuUV6B z)EInJ{)RZ@4V%7cjEO7LN~?1$mn3a^_UFUwgI4gdMENyBbZ7bIJ;*pmK)p-vnVxd| zWkKQ0&a!n~7>HwQ2hZ-Jm&Am3B;u+)ce+{Wk^j`V!3U&>m;t&vY*%t~c#ahUoyg5b z2ahA2TZ>SRoW?-?CgQ&6j*%HVlZa_`e2?xDmtKeuLP4Q7;QF5?C+6u{c~;2@u~XBvS9RQy+XpcP zam{8yeHiNj735Qqtqr+L*1T3zb9tYyM&QkB!&XUkjvd^Ygo)`~DfSXc?aIAZRWarT z;@L}=(mX9K!mLb$bV5kl<*CbS-MzKmhUa)>HOsC-BBjR;iP3!*&dszNjBEw3Rv1}Qf*5a`@)o|Tx zU7B;9q4{WTZCWWcFGs)j+3uUj>8(Cwb_O1yZdPVdiLde$wfPC8T@xoZ=)TStg^F*# z4MO6GJ?>&@dg=AIsAF?4x^0$!&P9l$pF|E0rCj1U7jhI(G&|Aak+N~j&Udew`gWu{ z2X-K~@PqAPH3@;@Q%6wHF;*A9(w_Zet2x`_fP~Y&TwGZ)4#tSGlRgP%%ugbb1#$B# z|7PR0C5r0ieH>Tc2VqonIeXFujS8@tp7CHqw&xm^{>}4(6%+K_KFii)%Kr2{j42cT zf7*(T`;X^y=RS)uqK^PT0hRhtLEPy3D) zh=$@t82jCaR5)3J?cyRI; zhc|shbSr7geT?B4FmZXuO1d;R@ad!QPQU$Zer!0!V61N8sTO`Lff}R+QiuY@i3=Ec zn_*f@ELt1O)2&GSCIB*|aE}R#!6Qm+T@K`?&=s_ZgX@LVCJse2)OEBnP9U&iQA6#U zu+L)a7vy_$n++eNNz4e}vy- zU#iL&T>aC;X5cGL!vv!Sac$)D7}|`RpVCN@p6g;HBOD-OHu zFm#VZm)QPQP2{hP{>*euwP7AlV%O*roSrcaAt(mKRlB!shpm>n$W1icuCwY#zS=q1 zt_u`q50j}(P)NnNOKCNlffd1U)lHMOl%_ZFhSVQNHZwaYO6XV(+SRSqU`5KI zUG(56xsP)s2*Iwq1r#WUtl{Ex6MTzgU61=*ZX>7CTx#8T8)+0pzh&dg%@DXFf8vlN zHx(N+x0=@WBY??@m*HVToaKS@yQ{azRvfRRZNP^c4vNNXX^U>@)hUX`1Lxq)Tdcuq zaM|+oj|)=PA+zb4aKy-QL()&JBZscQGj7B>k4dy@Z+RxAm{1N6@{6IUk43vOoutoj z_hdAKG{?=F9cUu8;PXX^`!V*#-w>Ph1f01J>g$6HL49$)ocFMjKHmKCnigJ7ox%A1 zS6^^)HHM~Hh_h@9kjVl_x>@c$2?I(De%_iI>g#v#CCp)N_A`HU=Vc#XA?!W??{8B@ zx~lIIkun7EFAj&9wZ?ipu>_C4u_DNQo!LqBdaldg@CH~(pry%sTKoX$*W6;4f=lD> zRfe)*MYQwcecN4^8JvTs?vW7Q$a$}I(YMVZ&<8+!;(~9ioL@|DVrGvJiFET_#I8B! zRdb%@^&HwsM$#doN!^`p$&#fJZKUnidxcvUuA2R0IV1KfMUwa=xHb%ZJL&Bj{$i!3 zx>ZL(n_J_P%AcRLu^GM=TWM1=j7Jr7WL;9Q8MV9esi8iJc^_o@PE+Oz0i#efb;G34 z$k-!clCe@*&jtc>6|fhKo{4@~=Nd`@aNYqcH>r=MsN>#-q9Ox(c^x0d4*+<6+yexh9Xo>8R4Txh z(ECrF&Z*t8JOxmZ?C8DQJBi1zBKgjpqLzJ5QM8W{AG7^@2_~a|V(Ju4pEe8p9IYk( zhX>=&Hu@J}t-pd2{oW^nC)X=1q@N)Wwp*q9dQIbe=SD;b7$rEI5}G882K)sOkxj~`ufRgXzt_(!z(`V_uTtX-6PqQl)-ZBCN8h8 zAFIg{G`#r}>;yUO`T>B-z#Qv~Ly2>SGV5`u1PoQ%D|!I94LPG>YaKt#;2Ety0Mgc5 z>_KF`ZWYKs49G3Wr-ME~pI!*Tb}*z*>s+9?xi(IVW;^{Oy zW*MHnkhn#WdI0>F@8hW~VC5D+pCCgKK$n__&f?24^KLKrAoO6OJqtTdLn=lY7DaK>X`Rh31!!W;S zL>l|<(F3qwxaA9`2FK7^d3os4h&p&LgYQ(mX;1z8UHd zK<0a@Ys?2=R_)SP6&m;$v?BNbm@C#!CPQ0~Us)~EMBmXQzZ2oVk54Pj%j>$Rl5%v# z{8rriJf@{Gu!k;P)vw0>`AGF5iEhb0`;+>34FgpSbh06NH)^xgjZ;-U&>ynqW^uk2 z8n|PFJHJy)7*%d-Zi~)BJel)RBbdFuu6l+*T)x)3CVWm;sG zM_BR%LRB@o>#6$E3}L+ZPKabNSUi~*zyY~8_Ve;zxhwzcEy#!KHi%BiutU%Febs6d zTztjZrTW<25_;)Pykb`@((lGgUBno=q23T>j{c?7b#d2Dt)H=qad8d)eSO=>|0=`~ zaaetm6pF+#EKl|==gZ|?AoSTlfll^3i|%~UTd)(&D=|GL)=Yf1EHj4T zzC1%uyc8R8+KRX1QWM*5s^X@_lo@}Wvd4D zy-G79rP&~@P@e%<_9b*~9JYM~w%C%}AAc>aLDz2}6=J~J6(nd!ri#={HTvN$3q$w| z|7=13tGig>$zN|5cty>0PE{mHOniPMis4hge*Tr%T;YNMGeQ|DxSBKaq_b$|0#?40 z{(lJAe*+dU4nR;@$OCY@vfSSs(&BCW0L1vgOiR7sY59|KM(*o1Clf*WtZM|Q|28b0O}=Ohqhuv18b(V{fMr)MVNh1U?BKH#h;{A5QgqR55SXR(Crn~EuJ>N z)dN5Uiv}+yK}ltaJrBSsDGVbohi&)F;&=WfVmo%E>hUYUR9)kpv&;^=idy-TTl}{S z&hLH8@iU;}^sv2Du$>T>jVFo^!1|i;)$mz4FZY}TZwk)Ht`8h+Zu;f7u!y?~?VROo z8AhYl9<&~`|GiO6U$>$G*NV%)P|202Vz!{Sm=S?qCKf&xj-;1XOkS-P>p7q1K=w3E z16Tw5E_58)q7O5?1Opxx>W0jBFXlc^UnaQ0akTao4qfri%WTFD8FM!1*upabcO}hRFgWU;>p=+R@Hfq-C zoK4lfMm7{rIL_~h13;{cp0CWPV>%TpLRliPfAqyVu$1wCol-Nf_|ObO4&8pWmw%rz z5cR5#G`Yi>g`0|x>wx~4_bSXR5V`d2HN?23<#;&!9W0pIs;sQB0Ojwoz3@I{IJ7pNRy0(`OS& z9&mXNKd>!{@A*1djHE&Vxg1zZPFp1Cwrb^@uupmJ>B3}taPfvlx1n{RTT{+~;u(mA zORfXHCtt&YAgvQTTLM3a?bD+r9D0c=q`%bs~FD2aK*YBWv5mj1K zm(-4dCOA+Xg)AhDFR?1xI0oC-1To}Gs$qY=JfzD}BSEu}ogF*)Bs`Qpw71CnEI=N# z=M8fmf2*@kyCCSy_;BfH=_WEU6e zKU<>{YCQQ?(VWq?)$qmJ-*Y~g$tgQI1%R?x79jqQwa6)pxrzY#&Qis~mK zYH^ELpYg&hxb0U`Jf46TOZHwZEz52y`Ath%Xad1=YMOG3Kja4{Vx9HojG_q>F<3b4 zIr72?LWi4D`)C8A6vc*kR79pC34S`|c+-Sb<+hhu5s}&s^nMxw-hS}!K&0eBIoQ#4 zhhkQ@Hn)DZCJnBs&8c3VZKpvgQ-D)^_tm`Lzrd73l3;Z7g$46h540XN-)9^-g>!nl zPsAs!-i?+x5xgvNdRgD5xx$4^9*8<{0YcEVKKjaPEfQZ-o9}O=um3zOj>|Bhk4c9d zX@yI@+Kke9LQV3W#q18@rC#Y}7Fqw>7M%oH6M<;9$J{+&Shi8~m_7Zgcz%!iL}}@T zSpMnU;yNlTOE6}F^m?!n0^ryyEWB%(Q`&A>5&>bSoP(9;y=sokwctqmu{U9znVXq8}d}y<`t=nFpkyX6U!JChpc8WFM_Dgz5h;^-KZq7gNI)C5(O?@ z!b({*t)hK`K_yeK`^hktmuae|hYyh{VYI;K>AF)rk~_%jF_xN?LkroMH#U(Q4J z=8JQPzPJlVDBv<;eaOO5({@uukBf^Nr=Y-xOPE7SO-{)3+0ycrn|i7{QZZjCxK2!h zcoUiKE28zz2s4U|U7V?=RL!n>lUv^?nsHF!1JEs>SedwK+?)&BjJ8vliRE|nUBD}Q zF2BarwOHPsybyO^j$j~y$o!dFJu?eRH=Ni_UeNc-`DLrR%H783IX2tY{-HrKvZQZV zvpk`qQN`7ese9N4q3I=Lj3x33)%VCDenZ^|U*GYf;$wgFT(UcCfPkBN49+5)4Pm7V zW9<|FDZT#h-~Fwg#uQKLjV=1Rk0VR1m?V5YEF3EAkBs?)VZ1Ihp!?6ADqem z^NaqnU-a`12fxbNorX2h|AW)>qSR9{sj}^T?TmAR4CuZ51JF55vVwhswg{TWzE9H5 z(wbo^kR_7!4#uuD0*z>aAQw~*0G@K4AlGij+k~A0IsaZknn0A-PvQ3T_$6U0x39$B zB>4P^A-mobpLN$QQ+D%q^HhQQH%_toyBLQ z=XJY~p}(2yR<-Is{qJ#(kchHYhB0GJ5o-g5@sbeSwI!LypD;e3x!ri5+&!&2(0qN; z6M6`<>2>YydMYlg+)Y2etmxfWCOhyP z>NiW=AVay>fYE8UJc6C@ZR1$>%!9FG&LRT`Ji18N>HexM_ESkjwoaSN>JTy3LLer8 z-6HHKXbxGGzhOIk%6{{^Ybu)yT{y>e|OmZ@wDBhpyT`b zAg8{qZV%%|5o(fl*v{y{i(+L`P5CPC(bAqGS^T;$d~*QXh ze=gHzyy{E&{Dg*8vQqiZMzM?B5qVRzT=x?No$8NxA5GAE=!CZ2O}s~KX2rq&Mst~! zCx#c7X{*@@$LyCm4kJtQfm&2d5@~hmKT_lrAswZ#U&|?%o3Kw9n%a_!x%!Y+x}lTL zdiCDv+xt%uRE<4ZVv*)MM!1dNPC~wZRdqzSIz`2d;NB3m<t7l`lP*J*N>^G>O_MuM%K=y&@2r7W`SadZoavq zKxpOtV$1`;PFQGVL^Qo_j6JifnqL|fEnKf#n&(V6SULGJhZ^nCS;B&I-C@M>w>vRI zdBsVrJa;F4TWMVjPJ56@TXe<(be~IWrkJ?T$Zd4{9;AQYVUrC7mx`Y`JpkPzgkQY* z^Cs6zrZ)XXYnSA85C9p4{#=?*erJz`M2{VeJ$j_Z?HQ^YTg(&STm1$+DPCj1X~o1p z&;EN4$G$X)&g9abFqiu71kzh3_HuepGfEl$Mr04D%oYZoznjb6Fm}fCDbDgc-RvFE zYY6?Aj1^lQu1GU5pPl%U;C%)&B)5R}i2NA7s_p`&$#;rt>@v@%3!>%@r&vACE1i%g z-i?NyO$t)@gBR%lp&?eMqs}?ygo67F{>}_bB*b*X=2$xYA)+6yuPV1|*I1D|(=l5n z%~STB^>c0W*uy+a+79tpH&!UQz-dO|O4EG9kFC{riVFtJzb?o-vL*5~_8}l@I6P*? zg)c-I;6N3#G$bnDI=IFwoj<=z+%?GPYUHmusfzUuVoWkwN^lmHlSDo33=2j-mK$+S z=T2v(S?-~lYelJ_X3Hkzm39DCvv1>Y9tm8apdU-TC&vrYy-LSAA-Jp~=o(y5m&Gbf z41c<-P0UpsNJE(E`CR&>iSenEgFelKAHkHWe|a-Ma|LEgaOw9S8w&ZaZd_+i$sPUm z_oT1wU^`O-^=Co)DdlU6xMDA@4&2sEg=){lhZ$oTXzz7X>=USJ7iWiwhw$#mD+f-p*=?J?(GjL_JJxOR~m17Jxc!FiS#T%-o9?4#^i;v z6GUZ{vVV$Q!eqhFuxb(^v6;c1?q79IHD~)w#pg(K?eeP zq~i~|>WlRUabYEMS~ay}mI*Z@$k#4=-a0n_Yi%J#NG?Jv(#a&ceLFx{*D*-PskZFk;8i)}E~hpJS8O zL}35kgFKxD6Yo2(Wr$Ety<%p#LR7oqHp;EN^O*$Kpr?F-y(2%7c8Rz>AVA%65ZjwyDpa_Ew}{DneloqTkxQJV$c}h zY`vY|3_Yl>b&}lcVmeWYavEVO!YG3ps z`d#9jPh&tc*6rqE>)@DY5=7+d$FMrum?i`v(a8ZS)ZK(u9uR)>l-%i|e8?^m70uiV z%B8?!w^XI#5L_Pxfff5J@I~FlbtLTHJ*e&cqo~u|a&W0#^-qp><(&4W-&6$_+oD~9 zm6&7TTXA&j5fR!;=k+037{e@Icz$-SYTk2#l@*wPxk@`2ZSJ!ElmX6ql6>O?^#x@1q?j*nR z`3u(c>QAXQomokP)kmaRz3lcwwNjS)Jl~?5RJvC-e-*5KQBd!v(53FrC$^4mFTVJg z;DP18B-|8$!wd%CzZU@MsgHS%k<&gXtj7U*7l7jtg!!MHEPwxO2MPj?ujbRJ+BN{- z-lGX_LqJa*^%j}ZwgAAaFOX$kn*cA%Yma1{cmZ>FOa-N1Lm{;_ozG&xgUcCuz z@E?$!5tATLUHGe=pT}@hIsfaBkwcy6zlbyanXw&`AW*AuKL5sFem)mIDjPc&SaSUk zGH?|CImA!t&qKP}C$+f4+pA1Ej~CKd(fux3T28io*Dis&vuF|ee+`3;TCZS~k9C_lwiDl-9m_7%+J1wtjH+8OE&sfRp) z&Pna(1E@REedxgv@C8%g3zPPVoMRcAs7MR@%RRvb3GRf|6MA<|KS?n#-*;F+ZRUj{ zbOcdg1bAcnH?&~I;XSi(zPLvfgVuD@{DyAgWtWu z?z2_L7pX<{5ncHnuxtEneJ1D6j`-eB*{nYRqJDsFUj#_s8h|*hYE|d_&#_^hL%o^i z<+ROP$pK7ujsGS#gd_Mbm-Z^Xf3X`hG=nLRXgH2sVUi@+m3K4EB4rL9sNs%4Z-naZMet7JOG&GGJQ)&z#M1PF_}~YIuV=-J)8#=)Hx0 zE3MyEL#ii{y5h|hSa`*c(1L7JX8UjxZuhlD*_lUZO_M7}$ouu$a1}(n9>7|!H`15c zZD61@)l6-(acfIc)V2;JIGAGJBG{Rlmfk1*0)Xzy1RCS=-jzSWC8u4w@eb$K1!*DG z$k{lA2p_lBsb-7gReZJKT%)nH@L7FAe}BtZ_9DI)6);J(Rk4msWop8@ZQ4VQERslt z(n@?C^?P~U?j)8h@ph6p;`cb)X)^P!@5nPwYj3t@eOXJ;>}{O7)}%fqe|b)3u#1zF z@Pj5DCUUaLS9FbILz+`pjC@TtdsW^pkxuJjaQ<|My5_v3!S+rm;McwuYrTqwHdw8Q zg2?X4QS|`8J>Fx^+L1kXPqI<+z&DZMS}|7dCDExmN%ncaA!+XM;OhG!?MniEvv zv3yQH5Z<&XSm?yPT$UvyHFq(!!}^KYXrsH+n-9j?vSH-wuwaN2CQZ;>K-6ik&6;7G zjeGR*WXd2-7+tVo@W?>DkrDqTsyAev5$X^yKG;C&xp4Q&^&X*Rn(Y}?W@4vBEIY-D zCsT(7Y*nLl79ZxyMlDO%Oc8k@{wydcUBKI#G{#vv@#u?Q53Cu|C$N#RWgkia;A$2C zvZvhDB$F#3+=UZ~N6crhx1ysJfY=mY%kyjK?4G$4DH|G&PQsveKa?xO>Gqv%;NY4F zWQIKg0O$a2;3RpYrYu}{QivDG52iUfXUP)bexm*G(%=H|b?lZWoUckLM#)#1%kjEI z150^}LS~h2gdY|gu~y^GOlJF&Miz^|lcXi3G4CIg2SA{E#}`HzCU*B~O03M~?}#CH zAzH8D7?Zgz_xF00_cQ3G5_mFf)9*ZRyd=$B6!W%GWF~|5*^-3=1Ic1VXmQKz4I^uz zN!>=aL#gD*+r)Mc?u8Fp?NDmD()1Tyiht+QYMhlb4RdjC5}}{k@XRpOIX4p*28(}(!Jyc%dvOJA#_(0dtMDtf zy3YG+?pj^bg{ueN%?!<0<;Qjt#kpbJt)K%6X8)3Ix^}@wqU`WjdHI^FsJo+kBZFVR zroSGYM)KTUw;>}607t1gVBTDB*scoeHdIcnRDu*tB(2#{SLBqP+MJ4V)>;X)p!OoG z4Myoi2jk8G=L>iunyZ`&+%0VLEg)_>@v-8Mwwm1bGg-ac^D(nPe2n$1UX~74H5}Z} zY0PqFPu+e)lT+*elz1PaU`%G$*L4rk9D~9Nia*IPt)HWs9)uowiFHB?fb4Buj`PQ5 z2v6aZx_I&zdfVIZEM@fwccP7cCyW9Z%#64E-K5qytmbBGvEd3%G%s$F>`jXav1gP1H(wErM5eR z3U6JoyJB6ol*qTm95n`eTUHZGzIMsy6ERt7)SxIjM9PfJ>Vv@gJ!fn_Oid9gSxNyA zd5aDBMOCVjj`X}Vn5jzAKvjc>Gv095!*I7pE`=bjyaQS_z4$bsN(UzBuEYDFw$yiZ z`f;%f1F$~Sb*I=Bw)4>l-;h1^2Qr}jtN^OJpQ+8V&-3$x+9G4Iai`oZ@<&R304@!47=mzBdYSZi7+>3Xq-dxo7^~s}4+Yg>)!<&@C5{ULggt28bK8(1a zD`6taNHmdZ7=)-_QRAM*U5P%<54YxyF5B$x5LsJhO@!UGCN^$HibozfeYo0$)?ynG zq~tK0kXwZ!1`^rQ!j_KHpQ}tx4uLa_$FPzaj0F~ORUse2%p4-kk57L)9Cbo7vKN7r5MUoQ(pLh0Ld*`*!E ziXW;HRJt@hT5WnqD7kHi!{3oL9}?@R7f2pZ;sq@@qKZ5X1Ww^Wpo1RJA3}`9tX1XB zu2sFK(JCrZ55Jkx=Q(@VvcGNNHSJZrsCnYaib~75E0m8zGIDfV=5FE+Tl>D+4>TGv z2@zL?&4)(Ode-M!dgRSu-DpbRZ+a3~o;0?1xO{^)q;XdG0<3X=FGzB#oxg&kQz5$0 z=>1EVTTc1nO-=8nT|(Q3iDrio0CXJpi=C3!^@s>xovyIHDH37ZQ2Wb1iQaSW>IHPX z9a+Zi8XIY0K1Jd9+O6GgS)wBM+>EPhtzK^R`KSuH`XSs4MHix@I01Ls)iLhVV{=y7 zW60jYJ)^7TBjq+bsJfl^TelMgwW4|lrS&2HxVNv7UtG8{`l)|Dd`Y|5*DTFt>Itcw z-<7?r69a%FMPh6~bQe#hh97vQ^gDGVoR>YFon$+X4?T?95#~e^pZP`L6HjPs=vN(4 zlqZnR-v`_dsJ3p}?6#1CZK_z_vYQO-eK7nf`P8f`dbwnsr3<=-o!vM~5SBe+TXMe$ z-kE1_x84Zr)#A6ByR*1J@NVf-uaxHJY=GaS5*#H`U;jd23S|ZTrft0AF|ujAdbZ9I=-fIl!oa+KC!RNpFvmS`J9F1Pg0No&e`9l#{Arai=5>Nk>J z6ZDxHt&hl1uND$q+1JxXfc_muWMr;;d&nW@eOX1gD{F#K!{xkO$h}LwyafIlua|<} zVYuXsI!7J*#H%?K`#+0xrU{u_83q}&pHXHcBjrHmNVX&pjK?)mbqi{2TTN-3$oYd{ zLQ!j?!TCa;m5_boIGpw|>0@l{s|S~qzf&LmEyl)C|cM_GK0Vhr+*$-w;I0`8Z~AKN)o0ur6P)<3Xr0 zA(U>N8ahw8BAB~hpf%(qasctyQE*q!`032;v-LW7%f0~w{GHDb=3tGY_vI0sV|gN~2y77xZ_VJ2vD z?9lO7r4jXcu7c~+>Z?@}!^QBJuf3lZFB^C4EMmvZ6;dE~d!7K2JKN^1j&W$EohD|g zr1{EQuh-wbN@H~QdU5+z#SXM>DH_6Q#rx~FkSU50!>vosZbr5F@j0}*Mqf4KTNZ;k z!ssATH18riF^p-ka9u7WnS9Y&W)Whz*=7AWl(WOu*OHyRJ&A#0doG`^$8lG&U+ROa zq^M8V7avB5FA{l+T4;w?54pE<%3mN)fpz^(%CLaXxoG_Vu5!gT@p9GO^d77iT})-I z(uzKcKJyW6GyM6z)rAEI9K7GdDIfd)U1R$xf=Q(-9VD3$~dh9=Q~8pC!ItDRZKAqq9NRHqrn<0_e~Y zun@jlZLAq<*{X#G#>vQ|)B=)UW7N}P1Sm`)?J=pKlLa!#Az6Nsp)EhaEmMTep-^G8znt|q-BT66T~c+ zi%xF)G9w&YA$LF=evGOW+XITAXxdL`JZWbW*u z0BAK^w-tao&;^gRZ|m4J^QhfB^hF3sc;4uLOjPbA*+|~3e`)n2>qI(t@9UIBAM0bHVb>{}uB-<)C&`ozQI`y}Z5Wtg zMdyd!(r3T^Q87gLipPLO`U8_py{XngQZ^l``_0b?@260>VIO_G2}ITbCpgh_PAjKN z=jrMKy}NtM=5hFD(bHUOgWjw2&UvH-U*WB8@5vS+&d;3*n=i_i1t8{j^ckV|nz898 zkR!!;F9p@yB``Dkww!@%gFNKO>v~(5xfiuXC_!t~n7stYD1N7@p5_M=JmPIQ&)ZM< z_i(zX1uIp1XYU@%jUL-HvM3=rpH}Ed!X#ziBOOBNN&;V_!Mf!PL+Y{i_zN_XeNut4 zKvbPUR6ZcAQYTy`N_w)j$fb@=-lS89S%*)r#J_y*>p0AS-2-Jjbu<}UHXB;@W-C35 zDkn>VH9V}#h(gUeOtO*CPUbFpgRn}mz~(jDV-*4xe9FDbW|(;u*v~_&K)OIz>oeFC zphle3sR-aVP>+;hDko-a2$@(~>gCTC=!K+Bt!>{h(XJliavqA(;Ze^|D<;M#vZZ0V zt3-oF1FLyWPW{+k*I$C6Fv>4>{6UUIs0|S$)4Y7_+D8dnW}X8!OONed-a_%Kme}z) zPhN1SiO0e=TD*ux$^ws)YlgY5rb=3j-2wE%+b z=)x+{{G^4$L|Lk=?2cLg@Hw@iuVoKMf^3`I3uH05sGeO9G+8*ZCKIh1r;X~hV`o!0 z=j9c-XTiV6wDaYI4MRxlj9jO272NMlC%J8~LR?9@#-l6q+Q&u&QT}Xe8GCDo5FkTV zuyzsx`eLsB;ENNaygFQ~!Z?z3CVXqbltgCcLQq>5t^G?3w;i39AD4XS-W5IZkVPG# z91)JQ5deo&Gjt2clo5yM?Ez72W5Q*XrMjPYZii>!*THvA0ARA3 zM&|zpkNZ#BpfA*&+x4a>fE_TT2~`zPG6y;$W32-)`yT`HzVscDd=*{GEWps)5EUK% z0&YG^g#1z_2Tw<<&Dnyb^kdAz(>!l)Z|$_{*QI@>@Fq-oPz*)5){8lkxuMvvj126j z>9~hGk8IdN)4^#b0#A~f^JRmKs`wFtQaaRL-L3m{&h6pXcqN->>^LG%Tn_S(aWxoD0!K+5D;$$KK!kd>^*`b zm0ZEwn1ME>j0Fi?>OkYvfu9>F4Lt5Vz$ADa7sav(7Qx!b{(?Yjqq;xWD>?<4! z7OI9W<*c_2W+W#>t`pr!I4_<1d9j9fpDu_Q{!MS}a@3jMva;0mXV*ClJlpf%kB}%U z7>9VFT%EyvYLlU93KD`$6U@)esR)XO*DoC?>6E;Bg>0zrwH=zuR6i7yjU|kU^Ktl4 z&%|(`{R;kBO+!&DMoy}|wFl7;CYr0>>oHzdvR=PEANo9M6l%KF*z2IKJyx*4xXw}3ho3+(pSv(t#HIZN_H*!JYlVr4D#N{CKRw%38MWI;7Zrs$h6 zidMY#L`bWdj^0Z(ID;7#5TrQc(U639eCucWjO1uW%-gj<9|HgEgE-83@%OO+rRgSz zs90PMyW9eW;hhZ$#Uf7w*I$Lx4{%beP*47;p@OZ={u`B@^uR0p!G-b)60FKZ67GMI z(5G~=`-in`iptbVP-Kr{0@eZ+;Z_hZ-L#K^Uph5o$@A(~KTZB!!|LA$vM#Q2ybkVi z&;AwL#oerRmXpH~p_P<|UIWXUds)kAov+&q06WufL)`4DM!D5}^<*R-au(!0r@$X3 zgYqy>bQqXf;wZm%JgB948dHRP_*V^j^4gbpmTwv^UC_O1MG zHh&?m;&cebR$ngZ;LefL88h1f37LpQn(ZRid-mZi6ZSsQXr6pIrAo@Pk>UO3cbRTq zL!2B&0*Zs#SMfB6YRXzDln{xUChAP40liQOV9YIeQ6&9y^Q;WW&aCoIdZ=0NGB7^h zrzaC!)APIL5KO>qOZF6W2Q;?jO!3929`u+I@m&E7KeYr#R^P9r0M%l)yl)#ZPiRu zA~hQfADp#pTau^323pd`S()uS8SDr8+j02oy&(Lq>(pbXBU043OLfSL;u)L_LatGi z0}}}NF@>q%!nRd&w>!X+pjKXr6y!ikG*^-|7gSvL-$iV5o)(|$TIJc=b5rZ6KiA7) z03qte(*(*&{kc(*gow)bzJ( zNRSNjWoFXjX&O;D8?kLKkv977Y(8LaK(`z? z)M*^xkqs>3sY5j#fIgk7L!5HI4IVcn;X=!jT%7F=&GXRV;ax>wUgn*Rgz+Ex43QV? zK2wTC#gci~OObdL*xhfFg}!{}qk7Fsgtds_SqH7kGRDW_5XAWN2KaR|j6J}{vQET* zD%B|9^vRiJep~yfprhFv)R{cs!Is`c8GM{u=MrqVa5y2AF{eZQXBHVl2*@J09RLh> z8p!L;iwncrVYOd@G9uNqzw@jwt40yKubJIHqQNFl($>!%F-voVmcIpsjdWo-wsPDD z@)Cc4sQ_bH5ZmP>G%wuGs7Z52EJ$@N^tUM>akrN!y$eAfKVov7yT9g zNV3B6#-WhO6|TRK@uQHUfG5F<*^hOLiKFf5{hpsL3;LI(mznWR`!SHYo+elDW6o1X z%{*q-gVDiP+maN#A{8yaCVysLH$Ba~f${#zDdIa#qk7|}7Qu^)0IBAcB0H(&{{xcC zKUZJTsR~Bans|9j(Ig)KB95&D- zPyzSo8?z>}z6%%9)R4qwR^|CRK+~xIE0}>Cd8WM6()%YN`RWGWSYi475F9pbalYHA zc$4ENmr8%Z3JEn^&zMR5SQgtW+n#;Bvdq{cVf~x~L_^LCQP{8+glhNy(tG}yWdqi% z<~ym&>C5@hFQn(T_wh}Da@PB*zsHH?&P`I({&#}RUn&6vj_|*H>)-G7hiY+;%cCAd zyF|v!W!*B);A`l6yhjOnZ}ptrpyRVp4cPftNy+~Iy7A`)Vdv-k|Alqqp~>6A)0rEE zGh0JkioZq|to-Ea8$)sS>bM}P>JT^NV!)jXn!f-e`lrP(0k(KS*L>C7!Wxip->Jky nU_bb8Q|6)VE~dPcWJ$&idWdUDB7|i-3J5IoZv+ni zIhk|D_S!Rh&sq`6iqc5%c<>)Sd_V%oNT`1J@R|F=hflI!VBYUMR5`PK_(1XjAR(&m zm3fi{>xZ$>@D|v1^y#MvCWXppG==ckLnFjOT=aq1tF7-fznu*dEl=8$yJCF3nZ21O zIGxXtJWXfpSP12@^JQ`3MRJ))gFXOc+TM6QJvHje*3z}@(YO4B8J4rsS0+|l?nYbo z@%j}q?O=LX5dY&E{T9kPiED%tYWyFUHC*|s*?;^t#@Q?VnF9LH=Ma1JQlJe>I(BBD zTiuUC4X?{BV1LZ?>D^*mn>8voCF?34e>pYd?$$dIc5bfxy#o*8-EcUH1XR@Un3x)d8!nJ@ zOCxehN=mcW&{JEJLOPEq-nWm(+zt-T1kTPi#bs5tDvOo+XsDQ&AtVK;VR3u)JSd1W z8VL?cZf6@GPu0l25}14)z^hDCQFFpgk!Gq6vkWzUhVK~VxF!53?!t#i3fydXkcAqx zbTQ&<)WvIbs_JEdrsaY)^n{93e8V^>|7QyJ;TjdICjx$WN6ZFJ^wAHpjP%?qIHaVc zIJ|y1iAk;bH8rSINdN+FyqGWW@ZITkA&U)`%#~gjV`nL$FxL57+5|PMSt|Pa6;D2N zae9s5O8tbyObU#aT9+g$#p{Hs3#^wXi0S0_*De0Jn<7KMkjF=#s>0ta>)l`NM4oez z4;I_9yoU1H3B|+^!w(mbSzq{bA0?26kqy3=1YyD>_T0zkeuYNCK@hJ(EKy>EL*US@ zLPvu!eU!m@iV1z#`N%=A4%7TFoo&2~mT;Os8Q4n!{kiFgmge2eT`{LixiRSYs|mlg zJb@<+W@UoKf~UeK2a%bCMW;y;t#y0*`c3-lOS%&;E_X+G(o-GPE_Zix&;||&^wEj2 zkDYzULy`KLSrbSBqPq<$|-x@&Z5J^zvwUA9;_qH6e@~ZSry+C+7VvUG78cV zn^xh^<+m4$4y&pn&V(gr#LiPDQ>(VKy$;wZ_Mbqi{ z$J|CL;PP46a75Vp$SkO)%}1~HPjubWW&3U#AaYVR9B~mh${4O+8(@FA@4O_cXvumB zBIQ8*%{>a+dWTLQlgU_tIjpE^CA$Ev1Y!=^jDgWb?>s?iuBxHd$|yp@;njY`M|+=d z#$G$c-o-Yeffr8&NrI936{i>0Xh-XBRbyD=T~MdX4RtRL?P791NMDeV#pYk_>|PE4 zbAL~t^uv%}2ATyntp75saugS=v0fe8dpTaw#$760r~Q?aKk&lY2uO-?&CYmc{j_ZF zw{>45_TaH)Msy2c`$~iry58Xvd1W@$%xx~qp2BY`21{1 zL&Fmc23Lv=@#Gq|ZU9T095;{`lrqBSHmYnf=QH*91!BA8oAG~ss(SeOpcBl%)ut2`%qkJ6JJWzcb>7C7R%N9t@TA)r zz8RHjV&jLku657gAu|y>I4BhE*k^B`w8X~gb;?J%w|Tb}@>x8Cm{~ixOZb5jzT@7m zWB#1p@y4FfdY?;N`OA;ORnl_yyaiM#r!InKhasTkF~ zlY`lNeZZ19_rg85r@fV1RqyAQ(lnae5EgUzewOM(I%5}98B)e|Z64Ueq6uXN-lNwP z3{Z8*z$9L1R?UV6jjBo;_5XA>y;zHV5gA}ot)SUr!$CC&AP6OSAU)(GbiE<szlPnUdAwj;_?|u@iTz$glM%HZs%n*w-d~8xP1!*P*K&KWLa9BWW)W-;Sjuu*csqP z+6n9&sdcUplbgz-<%*GdGNnrD$W%>h4kA>}*j<*C$lZx5_t`=RGi$e1b8|p%PP3or zIJ(xgd@Un>L+BJ(YwuiXn6ZSb>T56<_+)r%zwo6VgOK!^Y_@YEPn17K&R%94r|uN5 z?h87H5dmHucXRa9vhQBHO5g?Cq|o%!As*V}B#?rOQHJE7;rie}xE-9kiKXJi5aGh7l`H#tE6xPBY! zZR;_M{|QU^Mr!b5xMKH4h6p0rTA&p!;@o1>154|eqG;T~3s2F8pb7gWci>MyIWS|~ z&zdP(K0E*bP%Pj%UbskMHPG859UFPBS;^6HGtBFO*x_@7(Md;p(o#yNf5_0ht$BZt zq;&f1o|x#r78k47{&3p9s|rc&&txLSnLF*#$1R5#^n4+x(5>qTg4sE)jZu24N`z(4qiD4O zWM4+XM1jj1fZS9HPH;3&YwZWo-&m4jronJ87LaiBL)m;^>3oK=Wov&}olY}-J1eUh zwvPG5y;mxR(WVismRP8V*5Rl74kfZXo({GQM;}^uLF~9QDgQ%lXIFeOvZ>BDCum8} z#;vWd0e(-_<;keMpa+K{7Szb%=3+ z&C+=E_^5bj3};hPYFt3UT5LkT`kB~b$l=OsTkDp^b8sEkb&)E2%N>&V!+ zqlQosNC(Nh z_^z08%VR}Nf7TR=?7MvBpSk6GHQG#vSuC!sb@eL89sRiRS-B^qr0Ua#w+jtX?0|~4 z+x8|qP_7%R4oYsfDv==UMFBC}X<-r&LrXxyiWu_q@HzpfMo`*`G z-)~VFe0vt6?|XYFyWbsxaKE$)%A`BX6h%jcFOUWTXl1-L+JICHREIy3!4x32B%a$D z=M!P4uW%O^INTQXJW|dH`NGV?hP|}(X0+$O6$$Fp^jee4kRJ+~%StCq=R7w|pVN+e z{qJsliR-<{$uB8o2)yoy+FOcBvWGNRs@QM0Uxdv_ulhm;s~dxOpBNduO^Z%jH=`h~ zgWVuz2T3cfVs)ikbI!0uY!QP;V4l?s5Uj8;N^FP3enl%Fj860L3RrRBTdJk{4bbwY z&12ICQH}>ST?k>7_OGb}%|^YwXbZRa+ss?WfOLF2E2@o!lmX*g>8!5EiAicsl}DNJ zke)DP65(?&)9ynb!rTEcBew2gz`10v{nSg|PqUZGL(1h zX@hxCsGIyRR&Lo6Y4n?@J_aUisWUxkBr)}GQ`YNAwta*TdDgnJtw~rUJB{cM- z(rb`HRwwm+Xo&%;{La14LsUh|8D3mK!l#`AggzS#LK?quZ`id`uO6&h~iw*Jtf8#}ihI))D3eD|zZv_)( z9Jsk10AHsE?>b&e&|&=wEt1F3VQti)pVPGOmH~5?)2|h$Xa#mw9a4dvb49R-4&+PEARPGJn`{O~OE8ylH7UID7bYK%!ENzW6TDAQF#-p5KTDdA&{oo5`!Zv+JEb#q$GnM*Ll zYs^&Z**m+Bt}w*<+<)7^E;2p1h$!oGc>oSdphL@owRO3`A*=2TYkL2mJI5E8i8cG~ zL~hUR9ZP1@x!eI3)7K81#+6z>rvpUmM9p?IrLKBh^G$yJ{?qURM#A#qNZaTt#_7MYOA=n5E99KYP6 zw87Ea-;WSAkVGA4+i0!w8vwqRl~#>Y$H*KMJ>8W%z(EgFbcUm$7m6BIwG`g~&InO< zr;MYi=##7H8`TKqol{ZA!N9NN>3Xs6T9E9HRPST1cCaEh30zTFV01+GF>61PUA7#S zk4d(crJ9sb&`Z%OnFhQepUKBB*A^f0X$EBWUi23}Eo@P_^mt zCUrHX1XJkyB*ps4=CnSk4&f)l;B<4mj%Q26a76¥$o>5__5#lEVq2x2e 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 X^2kKgr(WmqUsUgD-Oamg_4GdgEI8Pt literal 0 HcmV?d00001 From ac483fc38929ddbc8583fa5314aa73732349fafa Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sat, 23 Apr 2022 15:51:10 +0800 Subject: [PATCH 65/68] =?UTF-8?q?[F]=20=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tile\345\205\263\351\224\256\345\255\227.md" | 2 +- note/images/JDK/volatile-04.png | Bin 0 -> 91844 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 note/images/JDK/volatile-04.png diff --git "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" index b90dd17..015b838 100644 --- "a/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" +++ "b/note/JDK/\346\267\261\345\205\245\345\255\246\344\271\240Java volatile\345\205\263\351\224\256\345\255\227.md" @@ -96,7 +96,7 @@ d = 4; //语句五 **volatile内存语义的底层实现原理——内存屏障** 为了实现volatile的内存语义,编译期在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序。下图看看JMM针对编译期指定的volatile重排序的规则表: -[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nUC08aj9-1596181331578)(https://note.youdao.com/yws/api/personal/file/2DB4A9DDE8D243E680668BEDA1EA931D?method=download&shareKey=03684bd761521c57dfea00548eadeb15)] +![volatile-04](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/images/JDK/volatile-04.png) 就上面的图标,是什么含义呢? 举例来说, diff --git a/note/images/JDK/volatile-04.png b/note/images/JDK/volatile-04.png new file mode 100644 index 0000000000000000000000000000000000000000..44b287a09a22e387bf3c67d24477f24339374186 GIT binary patch literal 91844 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 N7X+*-50f Date: Sun, 24 Apr 2022 23:26:11 +0800 Subject: [PATCH 66/68] =?UTF-8?q?[A]=E4=BD=8D=E8=BF=90=E7=AE=97=E5=88=86?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concurent/ThreadPoolExecutorDemo.java | 48 ++++++++++ ...20\347\256\227\345\210\206\346\236\220.md" | 95 +++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 JdkLearn/src/main/java/com/learnjava/concurent/ThreadPoolExecutorDemo.java create mode 100644 "note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" diff --git a/JdkLearn/src/main/java/com/learnjava/concurent/ThreadPoolExecutorDemo.java b/JdkLearn/src/main/java/com/learnjava/concurent/ThreadPoolExecutorDemo.java new file mode 100644 index 0000000..5d5b5fc --- /dev/null +++ b/JdkLearn/src/main/java/com/learnjava/concurent/ThreadPoolExecutorDemo.java @@ -0,0 +1,48 @@ +package com.learnjava.concurent; + +import java.util.concurrent.atomic.AtomicInteger; + +/** + * @Description + * @Author luohaiyang + * @Date 2022/4/24 + */ +public class ThreadPoolExecutorDemo { + + public static void main(String[] args) { + testThreadPoolExecutorBinaryCalc(); + } + + + /** + * 验证ThreadPoolExecutor中的二进制位运算操作 + */ + private static void testThreadPoolExecutorBinaryCalc() { +// System.out.println(ctl.get()); +// System.out.println(Integer.toBinaryString(ctlOf(RUNNING, 0))); +// System.out.println(Integer.toBinaryString(RUNNING)); + // 修改线程状态-STOP + System.out.println(Integer.toBinaryString(~runStateOf(ctlOf(STOP, 10)))); + // 修改线程状态-TERMINATED +// System.out.println(runStateOf(3)); +// System.out.println(Integer.toBinaryString(~CAPACITY)); + } + + private static final int COUNT_BITS = Integer.SIZE - 3; + + private static final int CAPACITY = (1 << COUNT_BITS) - 1; + + private static final int RUNNING = -1 << COUNT_BITS; + private static final int SHUTDOWN = 0 << COUNT_BITS; + private static final int STOP = 1 << COUNT_BITS; + private static final int TIDYING = 2 << COUNT_BITS; + private static final int TERMINATED = 3 << COUNT_BITS; + + private static AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); + + private static int runStateOf(int c) { return c & ~CAPACITY; } + + private static int workerCountOf(int c) { return c & CAPACITY; } + + private static int ctlOf(int rs, int wc) { return rs | wc; } +} diff --git "a/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" "b/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" new file mode 100644 index 0000000..2b0bcab --- /dev/null +++ "b/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" @@ -0,0 +1,95 @@ +相信看过几个流行框架源码的小伙伴,或多或少都见到过底层代码运用的位运算,不知道有多少是能够一眼看懂了的,一眼看懂了的都是“真大佬”。如果看不懂的话就老老实实的通过二进制分析来看下这些二进制算法的作用。 + +## 1. JDK1.8 HashMap里运用到的为运算 + +## 2. Netty里运用的位运算 + +## 3. JDK ThreadPoolExecutor里的位运算 + +```java +public class ThreadPoolExecutor extends AbstractExecutorService { + + // ... 其他代码省略 + + private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); + private static final int COUNT_BITS = Integer.SIZE - 3; + private static final int CAPACITY = (1 << COUNT_BITS) - 1; + + private static final int RUNNING = -1 << COUNT_BITS; + private static final int SHUTDOWN = 0 << COUNT_BITS; + private static final int STOP = 1 << COUNT_BITS; + private static final int TIDYING = 2 << COUNT_BITS; + private static final int TERMINATED = 3 << COUNT_BITS; + + private static int runStateOf(int c) { return c & ~CAPACITY; } + private static int workerCountOf(int c) { return c & CAPACITY; } + private static int ctlOf(int rs, int wc) { return rs | wc; } + + private static boolean runStateLessThan(int c, int s) { + return c < s; + } + + private static boolean runStateAtLeast(int c, int s) { + return c >= s; + } + + private static boolean isRunning(int c) { + return c < SHUTDOWN; + } + + // ... 其他代码省略 +} +``` +首先看下ctlOf()方法,入参是int rs和int wc,这里rs其实是线程池里线程的状态,而wc表示的时线程数,基于这两个点我们进行位运算分析。 + +首先看先成变量: +```java +private static final int COUNT_BITS = Integer.SIZE - 3; +private static final int RUNNING = -1 << COUNT_BITS; +``` +Integer.SIZE = 32,所以COUNT_BITS = 29,这里RUNNING就是-1的二进制位左移29位,得到的结果就是(提示:-1的二进制是: 1111 1111 1111 1111 ... 三十二位全是1) +``` +1110 0000 0000 0000 0000 0000 0000 0000 +``` +这就是RUNNING的二进制值。 +同理我们可以分别得到SHUTDOWN、STOP、TIDYING、TERMINATED的二进制值 +``` +0000 0000 0000 0000 0000 0000 0000 0000 // SHUTDOWN +0010 0000 0000 0000 0000 0000 0000 0000 // STOP +0100 0000 0000 0000 0000 0000 0000 0000 // TIDYING +0110 0000 0000 0000 0000 0000 0000 0000 // TERMINATED +``` +这里其实已经可以看出作者的用意了,就是让高3位作为线程池的状态,低29位用来表示线程数量。对于 +```java +private static int ctlOf(int rs, int wc) { return rs | wc; } +// 位运算“或”,遇1得1,否则为0 +``` +所以ctlOf就表示将rs代表的线程状态和wc代表的线程数计算在同一个32位二进制中,互相不影响。 +所以如下: +```java +private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); +// 1110 0000 0000 0000 0000 0000 0000 0000 +``` +接着,再来分析下另外两个方法:runStateOf()、workerCountOf(),这两个方法都喝CAPACITY有关,先看下CAPACITY属性 +```java +private static final int CAPACITY = (1 << COUNT_BITS) - 1; +// 1 << 29 => 0010 0000 0000 0000 0000 0000 0000 0000 +// 1 << 29 - 1 => 0001 1111 1111 1111 1111 1111 1111 1111 + + +private static int runStateOf(int c) { return c & ~CAPACITY; } +// ~CAPACITY => 1110 0000 0000 0000 0000 0000 0000 0000 +// 运算“与”表示11得1,否则为0,所以 c & ~CAPACITY实际上就只能操作高三位, +// 也就是只能计算线程状态,并且~CAPACITY表示的是RUNNING时的状态 + + +private static int workerCountOf(int c) { return c & CAPACITY; } +// CAPACITY => 0001 1111 1111 1111 1111 1111 1111 1111 +// 所以 c & CAPACITY 就表示只能操作低29位,所以workerCountOf就只能操作线程数 +``` +这里需要注意的是,runStateOf()和workerCountOf()传入的数字都是需要由:ctlOf()计算返回的,否则计算会出错。 + +线程池位运算相关验证代码于: + + +未完待续... \ No newline at end of file From 97604e90be60878f67e4001b4365fc89ea1cf017 Mon Sep 17 00:00:00 2001 From: luohaiyang Date: Sun, 24 Apr 2022 23:29:58 +0800 Subject: [PATCH 67/68] =?UTF-8?q?[A]=20=E6=B7=BB=E5=8A=A0=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E4=BB=A3=E7=A0=81=E8=BF=9E=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + ...275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fee20a8..fae4153 100644 --- a/README.md +++ b/README.md @@ -75,6 +75,7 @@ SpringCloud源码 - [深入学习Java volatile关键字](https://github.com/coderbruis/JavaSourceLearning/blob/master/note/JDK/%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0Java%20volatile%E5%85%B3%E9%94%AE%E5%AD%97.md) - [深入学习Thread底层原理](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/JDK/%E6%B7%B1%E5%85%A5%E5%AD%A6%E4%B9%A0Thread%E5%BA%95%E5%B1%82%E6%BA%90%E7%A0%81.md) - [深入学习JDK1.7、8 HashMap扩容原理]() + - [开源项目里那些看不懂的位运算分析](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/note/JDK/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E9%87%8C%E9%82%A3%E4%BA%9B%E7%9C%8B%E4%B8%8D%E6%87%82%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97%E5%88%86%E6%9E%90.md) - Spring源码学习 - Spring版本:5.2.1.RELEASE diff --git "a/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" "b/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" index 2b0bcab..cec5185 100644 --- "a/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" +++ "b/note/JDK/\345\274\200\346\272\220\351\241\271\347\233\256\351\207\214\351\202\243\344\272\233\347\234\213\344\270\215\346\207\202\347\232\204\344\275\215\350\277\220\347\256\227\345\210\206\346\236\220.md" @@ -89,7 +89,8 @@ private static int workerCountOf(int c) { return c & CAPACITY; } ``` 这里需要注意的是,runStateOf()和workerCountOf()传入的数字都是需要由:ctlOf()计算返回的,否则计算会出错。 -线程池位运算相关验证代码于: +线程池位运算相关验证代码于,读者可自行测试以加强理解。 +[ThreadPoolExecutorDemo](https://github.com/coderbruis/JavaSourceCodeLearning/blob/master/JdkLearn/src/main/java/com/learnjava/concurent/ThreadPoolExecutorDemo.java) 未完待续... \ No newline at end of file From a892201439d38587dea8b65266324c4cd2b394d3 Mon Sep 17 00:00:00 2001 From: CoderBruis <37364336+coderbruis@users.noreply.github.com> Date: Tue, 31 May 2022 18:26:51 +0800 Subject: [PATCH 68/68] =?UTF-8?q?Fix=20=E9=94=99=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix 错字 --- ...\210\266\357\274\210\344\270\213\357\274\211.md" | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" index d99cbec..8bd2172 100644 --- "a/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" +++ "b/note/Dubbo/Dubbo\345\272\225\345\261\202\346\272\220\347\240\201\345\255\246\344\271\240\357\274\210\344\272\214\357\274\211\342\200\224\342\200\224 Dubbo\347\232\204SPI\346\234\272\345\210\266\357\274\210\344\270\213\357\274\211.md" @@ -51,8 +51,9 @@ SimpleExt ext = ExtensionLoader.getExtensionLoader(SimpleExt.class).getDefaultEx } return loader; } -```Java -getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经缓存了该类型的扩展点加载器,如果没有则new一个该类型的ExtensionLoader并添加进EXTENSION_LOADERS中。但需要注意的是ExtensionLoader的构造方法 +``` + +getExtensionLoader方法首先会去判断EXTENSION_LOADERS缓存中是否已经缓存了该类型的扩展点加载器,如果没有则new一个该类型的ExtensionLoader并添加进EXTENSION_LOADERS中。但需要注意的是ExtensionLoader的构造方法 中,是会先创建默认的ExtensionFactory类型的ExtensionLoader对象,然后调用getAdaptiveExtension()方法创建适配类型的扩展点实现类。 ```Java @@ -112,7 +113,7 @@ getExtensionLoader方法首先回去判断EXTENSION_LOADERS缓存中是否已经 loadDirectory(extensionClasses, strategy.directory(), type.getName().replace("org.apache", "com.alibaba"), strategy.preferExtensionClassLoader(), strategy.overridden(), strategy.excludedPackages()); } - // 这里只会返回非Adaptive和非Wrapper类型的扩展点实现类Class,因为Adaptive会被缓存到cachedAdaptiveClasses缓存中,儿Wrapper类型的类会被缓存到cachedWrapperClasses缓存中。 + // 这里只会返回非Adaptive和非Wrapper类型的扩展点实现类Class,因为Adaptive会被缓存到cachedAdaptiveClasses缓存中,而Wrapper类型的类会被缓存到cachedWrapperClasses缓存中。 return extensionClasses; } @@ -267,10 +268,10 @@ public class AdaptiveExtensionFactory implements ExtensionFactory { } ``` -① 中逻辑是这样的,调用ExtensionLoader#getSupportedExtensions()回去加载ExtensionFactory所有的扩展点实现类,并返回一个扩展点名称作为Key,扩展点实现类Class对象为Value的Map集合, +① 中逻辑是这样的,调用ExtensionLoader#getSupportedExtensions()会去加载ExtensionFactory所有的扩展点实现类,并返回一个扩展点名称作为Key,扩展点实现类Class对象为Value的Map集合, 在上面的SPI配置文件中已经展示出来了,所以这里获取到的是spi。 -// 有人可能会问,上面的SPI配置文件不是还有一个adaptive吗?为什么没加载进来呢?这是因为getSupportedExtension()中实际是调用getExtensionClasses()方法去获取Map集合,而其底层是去从cachedClasses缓存中 +有人可能会问,上面的SPI配置文件不是还有一个adaptive吗?为什么没加载进来呢?这是因为getSupportedExtension()中实际是调用getExtensionClasses()方法去获取Map集合,而其底层是去从cachedClasses缓存中 获取,而adaptive扩展点实现类是缓存在了cachedAdaptiveClass中的。 @@ -385,4 +386,6 @@ public class SimpleExt$Adaptive implements org.apache.dubbo.common.extension.ext ### 3. @Activate注解 +TODO +