From b2567adaf3e9f9be79243e3d8fdf739112b25a89 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Tue, 3 Nov 2020 23:45:48 +0800 Subject: [PATCH 01/22] add --- .gitignore | 25 ++++ 01jvm/GCLogAnalysis.java | 63 ++++++++ ...7\345\242\203\345\207\206\345\244\207.txt" | 38 +++++ 02nio/nio01/pom.xml | 24 +++ .../main/java/java0/nio01/HttpServer01.java | 37 +++++ .../main/java/java0/nio01/HttpServer02.java | 39 +++++ .../main/java/java0/nio01/HttpServer03.java | 40 +++++ 02nio/nio02/README.md | 6 + 02nio/nio02/pom.xml | 86 +++++++++++ .../gateway/NettyServerApplication.java | 28 ++++ .../gateway/filter/HttpRequestFilter.java | 10 ++ .../gateway/inbound/HttpInboundHandler.java | 78 ++++++++++ .../inbound/HttpInboundInitializer.java | 28 ++++ .../gateway/inbound/HttpInboundServer.java | 57 ++++++++ .../httpclient4/HttpOutboundHandler.java | 138 ++++++++++++++++++ .../httpclient4/NamedThreadFactory.java | 32 ++++ .../NettyHttpClientOutboundHandler.java | 30 ++++ .../outbound/netty4/NettyOutboundServer.java | 48 ++++++ .../okhttp/OkhttpOutboundHandler.java | 90 ++++++++++++ .../gateway/router/HttpEndpointRouter.java | 9 ++ README.md | 2 + 21 files changed, 908 insertions(+) create mode 100644 .gitignore create mode 100644 01jvm/GCLogAnalysis.java create mode 100644 "01jvm/\347\216\257\345\242\203\345\207\206\345\244\207.txt" create mode 100644 02nio/nio01/pom.xml create mode 100644 02nio/nio01/src/main/java/java0/nio01/HttpServer01.java create mode 100644 02nio/nio01/src/main/java/java0/nio01/HttpServer02.java create mode 100644 02nio/nio01/src/main/java/java0/nio01/HttpServer03.java create mode 100644 02nio/nio02/README.md create mode 100644 02nio/nio02/pom.xml create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilter.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundInitializer.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/NamedThreadFactory.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java create mode 100644 README.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..966499f4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,25 @@ +# Compiled class file +*.class + +# Log file +*.log + +# BlueJ files +*.ctxt + +# Mobile Tools for Java (J2ME) +.mtj.tmp/ + +# Package Files # +*.jar +*.war +*.nar +*.ear +*.zip +*.tar.gz +*.rar + +# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml +hs_err_pid* +*.iml +*.idea/ \ No newline at end of file diff --git a/01jvm/GCLogAnalysis.java b/01jvm/GCLogAnalysis.java new file mode 100644 index 00000000..01310b71 --- /dev/null +++ b/01jvm/GCLogAnalysis.java @@ -0,0 +1,63 @@ + +import java.util.Random; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.LongAdder; +/* +演示GC日志生成与解读 +*/ +public class GCLogAnalysis { + private static Random random = new Random(); + public static void main(String[] args) { + // 当前毫秒时间戳 + long startMillis = System.currentTimeMillis(); + // 持续运行毫秒数; 可根据需要进行修改 + long timeoutMillis = TimeUnit.SECONDS.toMillis(1); + // 结束时间戳 + long endMillis = startMillis + timeoutMillis; + LongAdder counter = new LongAdder(); + System.out.println("正在执行..."); + // 缓存一部分对象; 进入老年代 + int cacheSize = 2000; + Object[] cachedGarbage = new Object[cacheSize]; + // 在此时间范围内,持续循环 + while (System.currentTimeMillis() < endMillis) { + // 生成垃圾对象 + Object garbage = generateGarbage(100*1024); + counter.increment(); + int randomIndex = random.nextInt(2 * cacheSize); + if (randomIndex < cacheSize) { + cachedGarbage[randomIndex] = garbage; + } + } + System.out.println("执行结束!共生成对象次数:" + counter.longValue()); + } + + // 生成对象 + private static Object generateGarbage(int max) { + int randomSize = random.nextInt(max); + int type = randomSize % 4; + Object result = null; + switch (type) { + case 0: + result = new int[randomSize]; + break; + case 1: + result = new byte[randomSize]; + break; + case 2: + result = new double[randomSize]; + break; + default: + StringBuilder builder = new StringBuilder(); + String randomString = "randomString-Anything"; + while (builder.length() < randomSize) { + builder.append(randomString); + builder.append(max); + builder.append(randomSize); + } + result = builder.toString(); + break; + } + return result; + } +} \ No newline at end of file diff --git "a/01jvm/\347\216\257\345\242\203\345\207\206\345\244\207.txt" "b/01jvm/\347\216\257\345\242\203\345\207\206\345\244\207.txt" new file mode 100644 index 00000000..361ed5c2 --- /dev/null +++ "b/01jvm/\347\216\257\345\242\203\345\207\206\345\244\207.txt" @@ -0,0 +1,38 @@ + + +## Windows + +1.管理员身份打开powershell + +2.运行 +Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) + +3.执行choco install superbenchmarker + +4.输入 sb + +执行 sb -u http://localhost:8088/api/hello -c 20 -N 60 + +## Mac + +1.执行brew install wrk +如果显式brew update很慢,可以ctrl+C打断更新 + +2.输入 wrk + +执行 wrk -t8 -c40 -d60s http://localhost:8088/api/hello + +## 压测程序 + +1.可以从github获取 +git clone https://github.com/kimmking/atlantis +cd atlantis\gateway-server +mvn clean package +然后在target目录可以找到gateway-server-0.0.1-SNAPSHOT.jar + +2.也可以从此处下载已经编译好的: +链接:https://pan.baidu.com/s/1NbpYX4M3YKLYM1JJeIzgSQ +提取码:sp85 + +java -jar -Xmx512m -Xms512 gateway-server-0.0.1-SNAPSHOT.jar + diff --git a/02nio/nio01/pom.xml b/02nio/nio01/pom.xml new file mode 100644 index 00000000..0fc8ec7e --- /dev/null +++ b/02nio/nio01/pom.xml @@ -0,0 +1,24 @@ + + + 4.0.0 + + java0.nio01 + nio01 + 1.0 + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + + + + + + \ No newline at end of file diff --git a/02nio/nio01/src/main/java/java0/nio01/HttpServer01.java b/02nio/nio01/src/main/java/java0/nio01/HttpServer01.java new file mode 100644 index 00000000..c9cc060f --- /dev/null +++ b/02nio/nio01/src/main/java/java0/nio01/HttpServer01.java @@ -0,0 +1,37 @@ +package java0.nio01; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class HttpServer01 { + public static void main(String[] args) throws IOException{ + ServerSocket serverSocket = new ServerSocket(8801); + while (true) { + try { + Socket socket = serverSocket.accept(); + service(socket); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void service(Socket socket) { + try { + Thread.sleep(20); + PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); + printWriter.println("HTTP/1.1 200 OK"); + printWriter.println("Content-Type:text/html;charset=utf-8"); + String body = "hello,nio"; + printWriter.println("Content-Length:" + body.getBytes().length); + printWriter.println(); + printWriter.write(body); + printWriter.close(); + socket.close(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java b/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java new file mode 100644 index 00000000..5a925776 --- /dev/null +++ b/02nio/nio01/src/main/java/java0/nio01/HttpServer02.java @@ -0,0 +1,39 @@ +package java0.nio01; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; + +public class HttpServer02 { + public static void main(String[] args) throws IOException{ + ServerSocket serverSocket = new ServerSocket(8089); + while (true) { + try { + final Socket socket = serverSocket.accept(); + new Thread(() -> { + service(socket); + }).start(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void service(Socket socket) { + try { + Thread.sleep(20); + PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); + printWriter.println("HTTP/1.1 200 OK"); + printWriter.println("Content-Type:text/html;charset=utf-8"); + String body = "hello,nio"; + printWriter.println("Content-Length:" + body.getBytes().length); + printWriter.println(); + printWriter.write(body); + printWriter.close(); + socket.close(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java b/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java new file mode 100644 index 00000000..cde4c1d3 --- /dev/null +++ b/02nio/nio01/src/main/java/java0/nio01/HttpServer03.java @@ -0,0 +1,40 @@ +package java0.nio01; + +import java.io.IOException; +import java.io.PrintWriter; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class HttpServer03 { + public static void main(String[] args) throws IOException{ + ExecutorService executorService = Executors.newFixedThreadPool(40); + final ServerSocket serverSocket = new ServerSocket(8089); + while (true) { + try { + final Socket socket = serverSocket.accept(); + executorService.execute(() -> service(socket)); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + private static void service(Socket socket) { + try { + Thread.sleep(20); + PrintWriter printWriter = new PrintWriter(socket.getOutputStream(), true); + printWriter.println("HTTP/1.1 200 OK"); + printWriter.println("Content-Type:text/html;charset=utf-8"); + String body = "hello,nio"; + printWriter.println("Content-Length:" + body.getBytes().length); + printWriter.println(); + printWriter.write(body); + printWriter.close(); + socket.close(); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/02nio/nio02/README.md b/02nio/nio02/README.md new file mode 100644 index 00000000..82214410 --- /dev/null +++ b/02nio/nio02/README.md @@ -0,0 +1,6 @@ +# netty-gateway + +``` + + +``` \ No newline at end of file diff --git a/02nio/nio02/pom.xml b/02nio/nio02/pom.xml new file mode 100644 index 00000000..e751f5fc --- /dev/null +++ b/02nio/nio02/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + io.github.kimmking + netty-gateway + 0.0.1-SNAPSHOT + jar + + netty-gateway + Demo project for Spring Boot + + + org.springframework.boot + spring-boot-starter-parent + 2.0.4.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + + io.netty + netty-all + 4.1.45.Final + + + + commons-logging + commons-logging + 1.2 + + + org.slf4j + slf4j-api + 1.7.25 + + + org.slf4j + slf4j-log4j12 + 1.7.25 + + + org.apache.httpcomponents + httpasyncclient + 4.1.4 + + + + com.squareup.okhttp3 + okhttp + 3.6.0 + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java new file mode 100644 index 00000000..f3c9cd9b --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java @@ -0,0 +1,28 @@ +package io.github.kimmking.gateway; + + +import io.github.kimmking.gateway.inbound.HttpInboundServer; + +public class NettyServerApplication { + + public final static String GATEWAY_NAME = "NIOGateway"; + public final static String GATEWAY_VERSION = "1.0.0"; + + public static void main(String[] args) { + String proxyServer = System.getProperty("proxyServer","http://localhost:8089"); + String proxyPort = System.getProperty("proxyPort","7000"); + + // http://localhost:8888/api/hello ==> gateway API + // http://localhost:8088/api/hello ==> backend service + + int port = Integer.parseInt(proxyPort); + System.out.println(GATEWAY_NAME + " " + GATEWAY_VERSION +" starting..."); + HttpInboundServer server = new HttpInboundServer(port, proxyServer); + System.out.println(GATEWAY_NAME + " " + GATEWAY_VERSION +" started at http://localhost:" + port + " for server:" + proxyServer); + try { + server.run(); + }catch (Exception ex){ + ex.printStackTrace(); + } + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilter.java new file mode 100644 index 00000000..93ce0bf2 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilter.java @@ -0,0 +1,10 @@ +package io.github.kimmking.gateway.filter; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpRequest; + +public interface HttpRequestFilter { + + void filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx); + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java new file mode 100644 index 00000000..1e4a9a5a --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java @@ -0,0 +1,78 @@ +package io.github.kimmking.gateway.inbound; + +import io.github.kimmking.gateway.outbound.okhttp.OkhttpOutboundHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.util.ReferenceCountUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class HttpInboundHandler extends ChannelInboundHandlerAdapter { + + private static Logger logger = LoggerFactory.getLogger(HttpInboundHandler.class); + private final String proxyServer; +// private HttpOutboundHandler handler; + private OkhttpOutboundHandler handler; + + public HttpInboundHandler(String proxyServer) { + this.proxyServer = proxyServer; + handler = new OkhttpOutboundHandler(proxyServer); +// handler = new HttpOutboundHandler(this.proxyServer); + } + + @Override + public void channelReadComplete(ChannelHandlerContext ctx) { + ctx.flush(); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) { + try { + //logger.info("channelRead流量接口请求开始,时间为{}", startTime); + FullHttpRequest fullRequest = (FullHttpRequest) msg; +// String uri = fullRequest.uri(); +// //logger.info("接收到的请求url为{}", uri); +// if (uri.contains("/test")) { +// handlerTest(fullRequest, ctx); +// } + + handler.handle(fullRequest,ctx); + + } catch(Exception e) { + e.printStackTrace(); + } finally { + ReferenceCountUtil.release(msg); + } + } + +// private void handlerTest(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { +// FullHttpResponse response = null; +// try { +// String value = "hello,kimmking"; +// response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(value.getBytes("UTF-8"))); +// response.headers().set("Content-Type", "application/json"); +// response.headers().setInt("Content-Length", response.content().readableBytes()); +// +// } catch (Exception e) { +// logger.error("处理测试接口出错", e); +// response = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); +// } finally { +// if (fullRequest != null) { +// if (!HttpUtil.isKeepAlive(fullRequest)) { +// ctx.write(response).addListener(ChannelFutureListener.CLOSE); +// } else { +// response.headers().set(CONNECTION, KEEP_ALIVE); +// ctx.write(response); +// } +// } +// } +// } +// +// @Override +// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { +// cause.printStackTrace(); +// ctx.close(); +// } + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundInitializer.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundInitializer.java new file mode 100644 index 00000000..d902b4c8 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundInitializer.java @@ -0,0 +1,28 @@ +package io.github.kimmking.gateway.inbound; + +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.socket.SocketChannel; +import io.netty.handler.codec.http.HttpObjectAggregator; +import io.netty.handler.codec.http.HttpServerCodec; + +public class HttpInboundInitializer extends ChannelInitializer { + + private String proxyServer; + + public HttpInboundInitializer(String proxyServer) { + this.proxyServer = proxyServer; + } + + @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 HttpObjectAggregator(1024 * 1024)); + p.addLast(new HttpInboundHandler(this.proxyServer)); + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java new file mode 100644 index 00000000..071fa9bc --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundServer.java @@ -0,0 +1,57 @@ +package io.github.kimmking.gateway.inbound; + +import io.netty.bootstrap.ServerBootstrap; +import io.netty.buffer.PooledByteBufAllocator; +import io.netty.channel.Channel; +import io.netty.channel.ChannelOption; +import io.netty.channel.EventLoopGroup; +import io.netty.channel.epoll.EpollChannelOption; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.nio.NioServerSocketChannel; +import io.netty.handler.logging.LogLevel; +import io.netty.handler.logging.LoggingHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +public class HttpInboundServer { + private static Logger logger = LoggerFactory.getLogger(HttpInboundServer.class); + + private int port; + + private String proxyServer; + + public HttpInboundServer(int port, String proxyServer) { + this.port=port; + this.proxyServer = proxyServer; + } + + public void run() throws Exception { + + EventLoopGroup bossGroup = new NioEventLoopGroup(1); + EventLoopGroup workerGroup = new NioEventLoopGroup(16); + + try { + ServerBootstrap b = new ServerBootstrap(); + b.option(ChannelOption.SO_BACKLOG, 128) + .option(ChannelOption.TCP_NODELAY, true) + .option(ChannelOption.SO_KEEPALIVE, true) + .option(ChannelOption.SO_REUSEADDR, true) + .option(ChannelOption.SO_RCVBUF, 32 * 1024) + .option(ChannelOption.SO_SNDBUF, 32 * 1024) + .option(EpollChannelOption.SO_REUSEPORT, true) + .childOption(ChannelOption.SO_KEEPALIVE, true) + .option(ChannelOption.ALLOCATOR, PooledByteBufAllocator.DEFAULT); + + b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class) + .handler(new LoggingHandler(LogLevel.INFO)).childHandler(new HttpInboundInitializer(this.proxyServer)); + + Channel ch = b.bind(port).sync().channel(); + logger.info("开启netty http服务器,监听地址和端口为 http://127.0.0.1:" + port + '/'); + ch.closeFuture().sync(); + } finally { + bossGroup.shutdownGracefully(); + workerGroup.shutdownGracefully(); + } + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java new file mode 100644 index 00000000..856dc168 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/HttpOutboundHandler.java @@ -0,0 +1,138 @@ +package io.github.kimmking.gateway.outbound.httpclient4; + + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpUtil; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.concurrent.FutureCallback; +import org.apache.http.impl.nio.client.CloseableHttpAsyncClient; +import org.apache.http.impl.nio.client.HttpAsyncClients; +import org.apache.http.impl.nio.reactor.IOReactorConfig; +import org.apache.http.protocol.HTTP; +import org.apache.http.util.EntityUtils; + +import java.util.concurrent.*; + +import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; + +public class HttpOutboundHandler { + + private CloseableHttpAsyncClient httpclient; + private ExecutorService proxyService; + private String backendUrl; + + public HttpOutboundHandler(String backendUrl){ + this.backendUrl = backendUrl.endsWith("/")?backendUrl.substring(0,backendUrl.length()-1):backendUrl; + int cores = Runtime.getRuntime().availableProcessors() * 2; + long keepAliveTime = 1000; + int queueSize = 2048; + RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();//.DiscardPolicy(); + proxyService = new ThreadPoolExecutor(cores, cores, + keepAliveTime, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(queueSize), + new NamedThreadFactory("proxyService"), handler); + + IOReactorConfig ioConfig = IOReactorConfig.custom() + .setConnectTimeout(1000) + .setSoTimeout(1000) + .setIoThreadCount(cores) + .setRcvBufSize(32 * 1024) + .build(); + + httpclient = HttpAsyncClients.custom().setMaxConnTotal(40) + .setMaxConnPerRoute(8) + .setDefaultIOReactorConfig(ioConfig) + .setKeepAliveStrategy((response,context) -> 6000) + .build(); + httpclient.start(); + } + + public void handle(final FullHttpRequest fullRequest, final ChannelHandlerContext ctx) { + final String url = this.backendUrl + fullRequest.uri(); + proxyService.submit(()->fetchGet(fullRequest, ctx, url)); + } + + private void fetchGet(final FullHttpRequest inbound, final ChannelHandlerContext ctx, final String url) { + final HttpGet httpGet = new HttpGet(url); + //httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE); + httpGet.setHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_KEEP_ALIVE); + httpclient.execute(httpGet, new FutureCallback() { + @Override + public void completed(final HttpResponse endpointResponse) { + try { + handleResponse(inbound, ctx, endpointResponse); + } catch (Exception e) { + e.printStackTrace(); + } finally { + + } + } + + @Override + public void failed(final Exception ex) { + httpGet.abort(); + ex.printStackTrace(); + } + + @Override + public void cancelled() { + httpGet.abort(); + } + }); + } + + private void handleResponse(final FullHttpRequest fullRequest, final ChannelHandlerContext ctx, final HttpResponse endpointResponse) throws Exception { + FullHttpResponse response = null; + try { +// String value = "hello,kimmking"; +// response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(value.getBytes("UTF-8"))); +// response.headers().set("Content-Type", "application/json"); +// response.headers().setInt("Content-Length", response.content().readableBytes()); + + + byte[] body = EntityUtils.toByteArray(endpointResponse.getEntity()); +// System.out.println(new String(body)); +// System.out.println(body.length); + + response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body)); + response.headers().set("Content-Type", "application/json"); + response.headers().setInt("Content-Length", Integer.parseInt(endpointResponse.getFirstHeader("Content-Length").getValue())); + +// for (Header e : endpointResponse.getAllHeaders()) { +// //response.headers().set(e.getName(),e.getValue()); +// System.out.println(e.getName() + " => " + e.getValue()); +// } + + } catch (Exception e) { + e.printStackTrace(); + response = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); + exceptionCaught(ctx, e); + } finally { + if (fullRequest != null) { + if (!HttpUtil.isKeepAlive(fullRequest)) { + ctx.write(response).addListener(ChannelFutureListener.CLOSE); + } else { + //response.headers().set(CONNECTION, KEEP_ALIVE); + ctx.write(response); + } + } + ctx.flush(); + //ctx.close(); + } + + } + + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { + cause.printStackTrace(); + ctx.close(); + } + + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/NamedThreadFactory.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/NamedThreadFactory.java new file mode 100644 index 00000000..726beb9d --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/httpclient4/NamedThreadFactory.java @@ -0,0 +1,32 @@ +package io.github.kimmking.gateway.outbound.httpclient4; + +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; + +public class NamedThreadFactory implements ThreadFactory { + + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + + private final String namePrefix; + private final boolean daemon; + + public NamedThreadFactory(String namePrefix, boolean daemon) { + this.daemon = daemon; + SecurityManager s = System.getSecurityManager(); + group = (s != null) ? s.getThreadGroup() : + Thread.currentThread().getThreadGroup(); + this.namePrefix = namePrefix; + } + + public NamedThreadFactory(String namePrefix) { + this(namePrefix, false); + } + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(group, r, namePrefix + "-thread-" + threadNumber.getAndIncrement(), 0); + t.setDaemon(daemon); + return t; + } +} \ No newline at end of file diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java new file mode 100644 index 00000000..edc0b1ed --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java @@ -0,0 +1,30 @@ +package io.github.kimmking.gateway.outbound.netty4; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpResponse; +import io.netty.handler.codec.http.HttpResponse; + +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; + +public class NettyHttpClientOutboundHandler extends ChannelInboundHandlerAdapter { + + @Override + public void channelActive(ChannelHandlerContext ctx) + throws Exception { + + + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) + throws Exception { + + HttpResponse response = (HttpResponse) msg; + ctx.writeAndFlush(response); + ctx.channel().closeFuture().sync(); + } +} \ No newline at end of file diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java new file mode 100644 index 00000000..511aa046 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java @@ -0,0 +1,48 @@ +package io.github.kimmking.gateway.outbound.netty4; + +import io.netty.bootstrap.Bootstrap; +import io.netty.channel.ChannelFuture; +import io.netty.channel.ChannelInitializer; +import io.netty.channel.ChannelPipeline; +import io.netty.channel.nio.NioEventLoopGroup; +import io.netty.channel.socket.SocketChannel; +import io.netty.channel.socket.nio.NioSocketChannel; +import io.netty.handler.codec.http.DefaultFullHttpRequest; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpRequestEncoder; +import io.netty.handler.codec.http.HttpResponseDecoder; + +public class NettyOutboundServer { + + private String proxyServer; + + public NettyOutboundServer(String proxyServer) { + this.proxyServer = proxyServer; + } + + public void connect(FullHttpRequest httpRequest) throws InterruptedException { + NioEventLoopGroup group = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(new HttpResponseDecoder()); + pipeline.addLast(new HttpRequestEncoder()); + pipeline.addLast(new NettyHttpClientOutboundHandler()); + } + }); + + ChannelFuture f = bootstrap.connect("127.0.0.1", 8888).sync(); + httpRequest.setUri(proxyServer); + f.channel().write(httpRequest); + f.channel().flush(); + f.channel().closeFuture().sync(); + } finally { + group.shutdownGracefully(); + } + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java new file mode 100644 index 00000000..ebb221e3 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java @@ -0,0 +1,90 @@ +package io.github.kimmking.gateway.outbound.okhttp; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpUtil; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +import static io.netty.handler.codec.http.HttpResponseStatus.NO_CONTENT; +import static io.netty.handler.codec.http.HttpResponseStatus.OK; +import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; + +public class OkhttpOutboundHandler { + + private String proxyServer; + + private OkHttpClient client; + + private ThreadPoolExecutor executor; + + public OkhttpOutboundHandler(String proxyServer) { + this.proxyServer = proxyServer; + client = new OkHttpClient.Builder() + .readTimeout(100, TimeUnit.MILLISECONDS) + .connectTimeout(50, TimeUnit.MILLISECONDS) + .build(); + RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy(); + int cores = Runtime.getRuntime().availableProcessors() * 2; + long keepAliveTime = 1000; + int queueSize = 2048; + executor = new ThreadPoolExecutor(cores, cores, keepAliveTime, TimeUnit.MILLISECONDS, + new ArrayBlockingQueue<>(queueSize), policy); + } + + public void handle(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { + String url = proxyServer + fullRequest.uri(); + executor.submit(() -> execute(ctx, url, fullRequest)); + } + + private void execute(ChannelHandlerContext ctx, String url, FullHttpRequest fullRequest) { + client = new OkHttpClient.Builder() + .build(); + Request request = new Request.Builder().get().url(url).build(); + Response response = null; + try { + response = client.newCall(request).execute(); + handleResponse(ctx, response, fullRequest); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void handleResponse(ChannelHandlerContext ctx, Response response, FullHttpRequest fullRequest) throws IOException { + DefaultFullHttpResponse httpResponse = null; + try { + String body = response.body().string(); + httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body.getBytes())); + httpResponse.headers().set("Content-Type", "application/json"); + httpResponse.headers().setInt("Content-Length", httpResponse.content().readableBytes()); + } catch (Exception e) { + e.printStackTrace(); + httpResponse = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); + } finally { + if (!HttpUtil.isKeepAlive(fullRequest)) { + ctx.write(httpResponse).addListener(ChannelFutureListener.CLOSE); + } else { + ctx.write(httpResponse); + } + ctx.flush(); + } + + } + + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } + + +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java new file mode 100644 index 00000000..f921330a --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/router/HttpEndpointRouter.java @@ -0,0 +1,9 @@ +package io.github.kimmking.gateway.router; + +import java.util.List; + +public interface HttpEndpointRouter { + + String route(List endpoints); + +} diff --git a/README.md b/README.md new file mode 100644 index 00000000..e6a677d6 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# JavaCourse +JavaCourse From e8222b1d874267c634a905acd3b52149939ed4f9 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 4 Nov 2020 17:16:42 +0800 Subject: [PATCH 02/22] commit homework of week_03 --- .../gateway/NettyServerApplication.java | 2 +- .../gateway/filter/HttpRequestFilterImpl.java | 11 ++++ .../gateway/inbound/HttpInboundHandler.java | 61 +++++------------- .../outbound/netty4/NettyHttpClient.java | 51 --------------- .../NettyHttpClientOutboundHandler.java | 30 --------- .../outbound/netty4/NettyInboundHandler.java | 47 ++++++++++++++ .../outbound/netty4/NettyOutboundClient.java | 64 +++++++++++++++++++ .../outbound/netty4/NettyOutboundHandler.java | 22 +++++++ .../outbound/netty4/NettyOutboundServer.java | 48 -------------- .../okhttp/OkhttpOutboundHandler.java | 44 +++++++------ 10 files changed, 185 insertions(+), 195 deletions(-) create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java delete mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClient.java delete mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyInboundHandler.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundClient.java create mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundHandler.java delete mode 100644 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java index f3c9cd9b..4f223fab 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java @@ -10,7 +10,7 @@ public class NettyServerApplication { public static void main(String[] args) { String proxyServer = System.getProperty("proxyServer","http://localhost:8089"); - String proxyPort = System.getProperty("proxyPort","7000"); + String proxyPort = System.getProperty("proxyPort","8888"); // http://localhost:8888/api/hello ==> gateway API // http://localhost:8088/api/hello ==> backend service diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java new file mode 100644 index 00000000..df2acd44 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java @@ -0,0 +1,11 @@ +package io.github.kimmking.gateway.filter; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpRequest; + +public class HttpRequestFilterImpl implements HttpRequestFilter { + @Override + public void filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { + fullRequest.headers().set("nio","wangyibing"); + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java index 1e4a9a5a..2ef46da5 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java @@ -1,5 +1,9 @@ package io.github.kimmking.gateway.inbound; +import io.github.kimmking.gateway.filter.HttpRequestFilter; +import io.github.kimmking.gateway.filter.HttpRequestFilterImpl; +import io.github.kimmking.gateway.outbound.httpclient4.HttpOutboundHandler; +import io.github.kimmking.gateway.outbound.netty4.NettyOutboundHandler; import io.github.kimmking.gateway.outbound.okhttp.OkhttpOutboundHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInboundHandlerAdapter; @@ -12,15 +16,19 @@ public class HttpInboundHandler extends ChannelInboundHandlerAdapter { private static Logger logger = LoggerFactory.getLogger(HttpInboundHandler.class); private final String proxyServer; -// private HttpOutboundHandler handler; private OkhttpOutboundHandler handler; - + private NettyOutboundHandler nettyHandler; + private HttpRequestFilter filter; + public HttpInboundHandler(String proxyServer) { this.proxyServer = proxyServer; - handler = new OkhttpOutboundHandler(proxyServer); -// handler = new HttpOutboundHandler(this.proxyServer); +// OkHttp客户端请求 +// handler = new OkhttpOutboundHandler(this.proxyServer); + //netty 作为客户端请求 + nettyHandler = new NettyOutboundHandler(proxyServer); + filter = new HttpRequestFilterImpl(); } - + @Override public void channelReadComplete(ChannelHandlerContext ctx) { ctx.flush(); @@ -29,50 +37,13 @@ public void channelReadComplete(ChannelHandlerContext ctx) { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { try { - //logger.info("channelRead流量接口请求开始,时间为{}", startTime); FullHttpRequest fullRequest = (FullHttpRequest) msg; -// String uri = fullRequest.uri(); -// //logger.info("接收到的请求url为{}", uri); -// if (uri.contains("/test")) { -// handlerTest(fullRequest, ctx); -// } - - handler.handle(fullRequest,ctx); - - } catch(Exception e) { + filter.filter(fullRequest, ctx); + nettyHandler.handle(fullRequest, ctx); + } catch (Exception e) { e.printStackTrace(); } finally { ReferenceCountUtil.release(msg); } } - -// private void handlerTest(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { -// FullHttpResponse response = null; -// try { -// String value = "hello,kimmking"; -// response = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(value.getBytes("UTF-8"))); -// response.headers().set("Content-Type", "application/json"); -// response.headers().setInt("Content-Length", response.content().readableBytes()); -// -// } catch (Exception e) { -// logger.error("处理测试接口出错", e); -// response = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); -// } finally { -// if (fullRequest != null) { -// if (!HttpUtil.isKeepAlive(fullRequest)) { -// ctx.write(response).addListener(ChannelFutureListener.CLOSE); -// } else { -// response.headers().set(CONNECTION, KEEP_ALIVE); -// ctx.write(response); -// } -// } -// } -// } -// -// @Override -// public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { -// cause.printStackTrace(); -// ctx.close(); -// } - } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClient.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClient.java deleted file mode 100644 index 79aeb148..00000000 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClient.java +++ /dev/null @@ -1,51 +0,0 @@ -//package io.github.kimmking.gateway.outbound; -// -//import io.netty.bootstrap.Bootstrap; -//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.NioSocketChannel; -//import io.netty.handler.codec.http.HttpRequestEncoder; -//import io.netty.handler.codec.http.HttpResponseDecoder; -// -//public class NettyHttpClient { -// public void connect(String host, int port) throws Exception { -// EventLoopGroup workerGroup = new NioEventLoopGroup(); -// -// try { -// Bootstrap b = new Bootstrap(); -// b.group(workerGroup); -// b.channel(NioSocketChannel.class); -// b.option(ChannelOption.SO_KEEPALIVE, true); -// b.handler(new ChannelInitializer() { -// @Override -// public void initChannel(SocketChannel ch) throws Exception { -// // 客户端接收到的是httpResponse响应,所以要使用HttpResponseDecoder进行解码 -// ch.pipeline().addLast(new HttpResponseDecoder()); -// 客户端发送的是httprequest,所以要使用HttpRequestEncoder进行编码 -// ch.pipeline().addLast(new HttpRequestEncoder()); -// ch.pipeline().addLast(new HttpClientOutboundHandler()); -// } -// }); -// -// // Start the client. -// ChannelFuture f = b.connect(host, port).sync(); -// -// -// f.channel().write(request); -// f.channel().flush(); -// f.channel().closeFuture().sync(); -// } finally { -// workerGroup.shutdownGracefully(); -// } -// -// } -// -// public static void main(String[] args) throws Exception { -// NettyHttpClient client = new NettyHttpClient(); -// client.connect("127.0.0.1", 8844); -// } -//} \ No newline at end of file diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java deleted file mode 100644 index edc0b1ed..00000000 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.kimmking.gateway.outbound.netty4; - -import io.netty.buffer.Unpooled; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.ChannelInboundHandlerAdapter; -import io.netty.handler.codec.http.DefaultFullHttpResponse; -import io.netty.handler.codec.http.FullHttpResponse; -import io.netty.handler.codec.http.HttpResponse; - -import static io.netty.handler.codec.http.HttpResponseStatus.OK; -import static io.netty.handler.codec.http.HttpVersion.HTTP_1_1; - -public class NettyHttpClientOutboundHandler extends ChannelInboundHandlerAdapter { - - @Override - public void channelActive(ChannelHandlerContext ctx) - throws Exception { - - - } - - @Override - public void channelRead(ChannelHandlerContext ctx, Object msg) - throws Exception { - - HttpResponse response = (HttpResponse) msg; - ctx.writeAndFlush(response); - ctx.channel().closeFuture().sync(); - } -} \ No newline at end of file diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyInboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyInboundHandler.java new file mode 100644 index 00000000..94d65a45 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyInboundHandler.java @@ -0,0 +1,47 @@ +package io.github.kimmking.gateway.outbound.netty4; + +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelFutureListener; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelInboundHandlerAdapter; +import io.netty.handler.codec.http.DefaultFullHttpResponse; +import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpContent; +import io.netty.handler.codec.http.HttpVersion; +import io.netty.util.CharsetUtil; + +import static io.netty.handler.codec.http.HttpResponseStatus.OK; + +public class NettyInboundHandler extends ChannelInboundHandlerAdapter { + + private ChannelHandlerContext parentCtx; + private FullHttpRequest request; + + public NettyInboundHandler(ChannelHandlerContext ctx, FullHttpRequest fullRequest) { + this.parentCtx = ctx; + this.request = fullRequest; + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + + if (msg instanceof HttpContent) { + HttpContent content = (HttpContent) msg; + String body = content.content().toString(CharsetUtil.UTF_8); + DefaultFullHttpResponse httpResponse = new DefaultFullHttpResponse(HttpVersion.HTTP_1_1, OK, Unpooled.wrappedBuffer(body.getBytes())); + httpResponse.headers().set("Content-Type", "application/json"); + httpResponse.headers().set("Content-Length", body.length()); + parentCtx.write(httpResponse).addListener(ChannelFutureListener.CLOSE); + // 清空缓存区 + parentCtx.flush(); + // 关闭channel + ctx.close(); + } + } + + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + cause.printStackTrace(); + ctx.close(); + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundClient.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundClient.java new file mode 100644 index 00000000..cc99552c --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundClient.java @@ -0,0 +1,64 @@ +package io.github.kimmking.gateway.outbound.netty4; + +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.handler.codec.http.*; + +import java.net.URI; +import java.net.URISyntaxException; + +public class NettyOutboundClient { + + private String proxyServer; + + private String host; + private int port; + private URI uri; + + public NettyOutboundClient(String proxyServer) { + this.proxyServer = proxyServer; + try { + uri = new URI(proxyServer); + this.host = uri.getHost(); + this.port = uri.getPort(); + } catch (URISyntaxException e) { + e.printStackTrace(); + } + } + + public void connect(ChannelHandlerContext ctx, FullHttpRequest fullRequest) { + NioEventLoopGroup group = new NioEventLoopGroup(); + try { + Bootstrap bootstrap = new Bootstrap(); + bootstrap.group(group) + .option(ChannelOption.SO_KEEPALIVE,true) + .channel(NioSocketChannel.class) + .handler(new ChannelInitializer() { + @Override + protected void initChannel(SocketChannel ch) throws Exception { + ChannelPipeline pipeline = ch.pipeline(); + pipeline.addLast(new HttpResponseDecoder()); + pipeline.addLast(new HttpRequestEncoder()); + pipeline.addLast(new NettyInboundHandler(ctx, fullRequest)); + } + }); + if (port == -1) { + port = 80; + } + ChannelFuture f = bootstrap.connect(host, port).sync(); + DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.GET, uri.toASCIIString()); + request.headers().set("Content-Length", request.content().readableBytes()); + // 将自定义的请求头加进去 + request.headers().add(fullRequest.headers()); + f.channel().writeAndFlush(request); + f.channel().closeFuture().sync(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + group.shutdownGracefully(); + } + } +} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundHandler.java new file mode 100644 index 00000000..83ea9036 --- /dev/null +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundHandler.java @@ -0,0 +1,22 @@ +package io.github.kimmking.gateway.outbound.netty4; + +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.FullHttpRequest; + +import java.net.URISyntaxException; + +public class NettyOutboundHandler { + + private String proxyServer; + private NettyOutboundClient client; + + public NettyOutboundHandler(String proxyServer) { + this.proxyServer = proxyServer; + client = new NettyOutboundClient(proxyServer); + } + + public void handle(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { + // 调用后端服务 + client.connect(ctx,fullRequest); + } +} \ No newline at end of file diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java deleted file mode 100644 index 511aa046..00000000 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyOutboundServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package io.github.kimmking.gateway.outbound.netty4; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.SocketChannel; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.handler.codec.http.DefaultFullHttpRequest; -import io.netty.handler.codec.http.FullHttpRequest; -import io.netty.handler.codec.http.HttpRequestEncoder; -import io.netty.handler.codec.http.HttpResponseDecoder; - -public class NettyOutboundServer { - - private String proxyServer; - - public NettyOutboundServer(String proxyServer) { - this.proxyServer = proxyServer; - } - - public void connect(FullHttpRequest httpRequest) throws InterruptedException { - NioEventLoopGroup group = new NioEventLoopGroup(); - try { - Bootstrap bootstrap = new Bootstrap(); - bootstrap.group(group) - .channel(NioSocketChannel.class) - .handler(new ChannelInitializer() { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - pipeline.addLast(new HttpResponseDecoder()); - pipeline.addLast(new HttpRequestEncoder()); - pipeline.addLast(new NettyHttpClientOutboundHandler()); - } - }); - - ChannelFuture f = bootstrap.connect("127.0.0.1", 8888).sync(); - httpRequest.setUri(proxyServer); - f.channel().write(httpRequest); - f.channel().flush(); - f.channel().closeFuture().sync(); - } finally { - group.shutdownGracefully(); - } - } -} diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java index ebb221e3..6435854d 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java @@ -6,6 +6,7 @@ import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.FullHttpRequest; import io.netty.handler.codec.http.HttpUtil; +import okhttp3.Call; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; @@ -30,10 +31,10 @@ public class OkhttpOutboundHandler { public OkhttpOutboundHandler(String proxyServer) { this.proxyServer = proxyServer; - client = new OkHttpClient.Builder() - .readTimeout(100, TimeUnit.MILLISECONDS) - .connectTimeout(50, TimeUnit.MILLISECONDS) - .build(); +// client = new OkHttpClient.Builder() +// .readTimeout(100, TimeUnit.MILLISECONDS) +// .connectTimeout(50, TimeUnit.MILLISECONDS) +// .build(); RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy(); int cores = Runtime.getRuntime().availableProcessors() * 2; long keepAliveTime = 1000; @@ -52,33 +53,36 @@ private void execute(ChannelHandlerContext ctx, String url, FullHttpRequest full .build(); Request request = new Request.Builder().get().url(url).build(); Response response = null; + Call call = client.newCall(request); try { - response = client.newCall(request).execute(); + response = call.execute(); handleResponse(ctx, response, fullRequest); } catch (IOException e) { e.printStackTrace(); + call.cancel(); } } private void handleResponse(ChannelHandlerContext ctx, Response response, FullHttpRequest fullRequest) throws IOException { DefaultFullHttpResponse httpResponse = null; - try { - String body = response.body().string(); - httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body.getBytes())); - httpResponse.headers().set("Content-Type", "application/json"); - httpResponse.headers().setInt("Content-Length", httpResponse.content().readableBytes()); - } catch (Exception e) { - e.printStackTrace(); - httpResponse = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); - } finally { - if (!HttpUtil.isKeepAlive(fullRequest)) { - ctx.write(httpResponse).addListener(ChannelFutureListener.CLOSE); - } else { - ctx.write(httpResponse); + if(response.isSuccessful()){ + try { + String body = response.body().string(); + httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body.getBytes())); + httpResponse.headers().set("Content-Type", "application/json"); + httpResponse.headers().setInt("Content-Length", httpResponse.content().readableBytes()); + } catch (Exception e) { + e.printStackTrace(); + httpResponse = new DefaultFullHttpResponse(HTTP_1_1, NO_CONTENT); + } finally { + if (!HttpUtil.isKeepAlive(fullRequest)) { + ctx.write(httpResponse).addListener(ChannelFutureListener.CLOSE); + } else { + ctx.write(httpResponse); + } + ctx.flush(); } - ctx.flush(); } - } public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { From e16d7bbc7712012064dcd17c495c7f676aa9ce77 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Tue, 10 Nov 2020 17:20:50 +0800 Subject: [PATCH 03/22] finish homework of week_04 --- 03concurrency/01thread/pom.xml | 20 ++ .../java/com/github/thread/Homework03.java | 176 ++++++++++++++++++ 2 files changed, 196 insertions(+) create mode 100644 03concurrency/01thread/pom.xml create mode 100644 03concurrency/01thread/src/main/java/com/github/thread/Homework03.java diff --git a/03concurrency/01thread/pom.xml b/03concurrency/01thread/pom.xml new file mode 100644 index 00000000..1c907bb7 --- /dev/null +++ b/03concurrency/01thread/pom.xml @@ -0,0 +1,20 @@ + + + 4.0.0 + + com.github.concurrency + con-thread + 1.0-SNAPSHOT + + + + junit + junit + 4.12 + + + + + \ No newline at end of file diff --git a/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java b/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java new file mode 100644 index 00000000..496b2817 --- /dev/null +++ b/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java @@ -0,0 +1,176 @@ +package com.github.thread; + +import org.junit.Test; + +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 本周作业:(必做)思考有多少种方式,在main函数启动一个新线程或线程池, + * 异步运行一个方法,拿到这个方法的返回值后,退出主线程? + * 写出你的方法,越多越好,提交到github。 + *

+ * 一个简单的代码参考: + */ +public class Homework03 { + + public static void main(String[] args) { + + long start = System.currentTimeMillis(); + // 在这里创建一个线程或线程池, + new Thread(new Runnable() { + @Override + public void run() { + } + }).start(); + // 异步执行 下面方法 + int result = sum(); //这是得到的返回值 + + // 确保 拿到result 并输出 + System.out.println("异步计算结果为:" + result); + + System.out.println("使用时间:" + (System.currentTimeMillis() - start) + " ms"); + + // 然后退出main线程 + + } + + /** + * 使用join,子线程通过join确保执行 + */ + @Test + public void test01() { + AtomicInteger integer = new AtomicInteger(); + + Thread thread = new Thread(() -> integer.set(sum())); + thread.start(); + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + // 确保 拿到result 并输出 + System.out.println("异步计算结果为:" + integer.get()); + } + + // 主线程sleep 1秒钟,把cpu让给子线程执行 + @Test + public void test02() { + AtomicInteger integer = new AtomicInteger(); + + Thread thread = new Thread(() -> integer.set(sum())); + thread.start(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + // 确保 拿到result 并输出 + System.out.println("异步计算结果为:" + integer.get()); + } + + // futureTask,获取线程返回值,但是会阻塞 + @Test + public void test03() { + int result = 0; + FutureTask futureTask = new FutureTask<>(new Callable() { + @Override + public Integer call() throws Exception { + return sum(); + } + }); + + Thread thread = new Thread(futureTask); + thread.start(); + try { + // futureTask.get()会阻塞 + result = futureTask.get(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + System.out.println("异步计算结果为:" + result); + } + + // 主线程wait让给子线程执行,完了之后再唤醒 + @Test + public void test04() { + AtomicInteger atomicInteger = new AtomicInteger(); + new Thread(() -> atomicInteger.set(sum())).start(); + synchronized (this) { + try { + this.wait(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + System.out.println("异步计算结果为:" + atomicInteger.get()); + synchronized (this) { + this.notify(); + } + } + + //CountDownLatch + @Test + public void test05() { + AtomicInteger atomicInteger = new AtomicInteger(); + CountDownLatch countDownLatch = new CountDownLatch(1); + new Thread(() -> { + atomicInteger.set(sum()); + countDownLatch.countDown(); + }).start(); + + try { + countDownLatch.await(1000, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + } + System.out.println("异步计算结果为:" + atomicInteger.get()); + + } + + //CyclicBarrier + @Test + public void test06() { + AtomicInteger atomicInteger = new AtomicInteger(); + CyclicBarrier barrier = new CyclicBarrier(2); + new Thread(() -> { + atomicInteger.set(sum()); + try { + barrier.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (BrokenBarrierException e) { + e.printStackTrace(); + } + }).start(); + + try { + barrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } finally { + } + System.out.println("异步计算结果为:" + atomicInteger.get()); + + } + + //CyclicBarrier + @Test + public void test07() { + + } + + private static int sum() { + return fibo(36); + } + + private static int fibo(int a) { + if (a < 2) + return 1; + return fibo(a - 1) + fibo(a - 2); + } +} From b7ade7545dd067ad72d160799c97816df391b28c Mon Sep 17 00:00:00 2001 From: wangyibing Date: Sat, 14 Nov 2020 08:47:10 +0800 Subject: [PATCH 04/22] Merge branch 'master' into main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # 01jvm/GCLogAnalysis.java # 01jvm/环境准备.txt # 02nio/nio01/src/main/java/java0/nio01/HttpServer02.java # 02nio/nio01/src/main/java/java0/nio01/HttpServer03.java # 02nio/nio02/pom.xml # 02nio/nio02/src/main/java/io/github/kimmking/gateway/NettyServerApplication.java # 02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilter.java # 02nio/nio02/src/main/java/io/github/kimmking/gateway/inbound/HttpInboundHandler.java # 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/netty4/NettyHttpClientOutboundHandler.java # 02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java --- .../okhttp/OkhttpOutboundHandler.java | 14 +-- .../java/com/github/thread/Homework03.java | 101 +++++++++++++----- 03concurrency/threadpool/01threadpool/pom.xml | 18 ++++ .../github/threadpool/FairAndUnfairTest.java | 57 ++++++++++ .../java/com/github/threadpool/Singleton.java | 20 ++++ .../com/github/threadpool/ThreadPool01.java | 46 ++++++++ .../com/github/threadpool/VolatileTest.java | 31 ++++++ 7 files changed, 251 insertions(+), 36 deletions(-) create mode 100644 03concurrency/threadpool/01threadpool/pom.xml create mode 100644 03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/FairAndUnfairTest.java create mode 100644 03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/Singleton.java create mode 100644 03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/ThreadPool01.java create mode 100644 03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/VolatileTest.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java index 6435854d..80daca82 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java @@ -31,10 +31,6 @@ public class OkhttpOutboundHandler { public OkhttpOutboundHandler(String proxyServer) { this.proxyServer = proxyServer; -// client = new OkHttpClient.Builder() -// .readTimeout(100, TimeUnit.MILLISECONDS) -// .connectTimeout(50, TimeUnit.MILLISECONDS) -// .build(); RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy(); int cores = Runtime.getRuntime().availableProcessors() * 2; long keepAliveTime = 1000; @@ -49,6 +45,7 @@ public void handle(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { } private void execute(ChannelHandlerContext ctx, String url, FullHttpRequest fullRequest) { +// 创建OkHttpClient client = new OkHttpClient.Builder() .build(); Request request = new Request.Builder().get().url(url).build(); @@ -68,6 +65,7 @@ private void handleResponse(ChannelHandlerContext ctx, Response response, FullHt if(response.isSuccessful()){ try { String body = response.body().string(); +// 设置响应头 httpResponse = new DefaultFullHttpResponse(HTTP_1_1, OK, Unpooled.wrappedBuffer(body.getBytes())); httpResponse.headers().set("Content-Type", "application/json"); httpResponse.headers().setInt("Content-Length", httpResponse.content().readableBytes()); @@ -81,14 +79,8 @@ private void handleResponse(ChannelHandlerContext ctx, Response response, FullHt ctx.write(httpResponse); } ctx.flush(); + ctx.close(); } } } - - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - - } diff --git a/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java b/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java index 496b2817..d540be1a 100644 --- a/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java +++ b/03concurrency/01thread/src/main/java/com/github/thread/Homework03.java @@ -4,37 +4,17 @@ import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.LockSupport; +import java.util.concurrent.locks.ReentrantLock; /** * 本周作业:(必做)思考有多少种方式,在main函数启动一个新线程或线程池, * 异步运行一个方法,拿到这个方法的返回值后,退出主线程? * 写出你的方法,越多越好,提交到github。 - *

- * 一个简单的代码参考: */ public class Homework03 { - public static void main(String[] args) { - - long start = System.currentTimeMillis(); - // 在这里创建一个线程或线程池, - new Thread(new Runnable() { - @Override - public void run() { - } - }).start(); - // 异步执行 下面方法 - int result = sum(); //这是得到的返回值 - - // 确保 拿到result 并输出 - System.out.println("异步计算结果为:" + result); - - System.out.println("使用时间:" + (System.currentTimeMillis() - start) + " ms"); - - // 然后退出main线程 - - } - /** * 使用join,子线程通过join确保执行 */ @@ -152,16 +132,87 @@ public void test06() { barrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); - } finally { } System.out.println("异步计算结果为:" + atomicInteger.get()); } - //CyclicBarrier + //LockSupport 阻塞1s @Test public void test07() { + AtomicInteger atomicInteger = new AtomicInteger(); + Thread thread = new Thread(() -> { + atomicInteger.set(sum()); + }); + thread.start(); + LockSupport.parkNanos(TimeUnit.MILLISECONDS.toNanos(1000)); + System.out.println("异步计算结果为:" + atomicInteger.get()); + } + + //Condition 的等待通知方法 + @Test + public void test08() { + AtomicInteger atomicInteger = new AtomicInteger(); + ReentrantLock lock = new ReentrantLock(); + Condition condition = lock.newCondition(); + Thread thread = new Thread(() -> { + lock.lock(); + atomicInteger.set(sum()); + try { + condition.signal(); + } finally { + lock.unlock(); + } + }); + thread.start(); + lock.lock(); + try { + condition.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("异步计算结果为:" + atomicInteger.get()); + lock.unlock(); + } + //线程池+Future ,阻塞等待返回 + @Test + public void test09() { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + Future future = executorService.submit(new Callable() { + @Override + public Integer call() throws Exception { + return sum(); + } + }); + try { + System.out.println("异步计算结果为:" + future.get()); + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + executorService.shutdown(); + } + + + //semaphore 阻塞主线程,等待子线程执行完成释放 + @Test + public void test10() { + Semaphore semaphore = new Semaphore(0); + AtomicInteger integer = new AtomicInteger(); + new Thread(() -> { + integer.set(sum()); + // 子线程执行完成,释放 + semaphore.release(); + }).start(); + try { + // 信号量为0,阻塞 + semaphore.acquire(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("异步计算结果为:" + integer.get()); } private static int sum() { diff --git a/03concurrency/threadpool/01threadpool/pom.xml b/03concurrency/threadpool/01threadpool/pom.xml new file mode 100644 index 00000000..20eea7a3 --- /dev/null +++ b/03concurrency/threadpool/01threadpool/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + org.github + 01threadpool + 1.0-SNAPSHOT + + + junit + junit + 4.12 + + + + \ No newline at end of file diff --git a/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/FairAndUnfairTest.java b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/FairAndUnfairTest.java new file mode 100644 index 00000000..aba5b360 --- /dev/null +++ b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/FairAndUnfairTest.java @@ -0,0 +1,57 @@ +package com.github.threadpool; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class FairAndUnfairTest { + private static Lock fairLock = new ReentrantLock2(true); + private static Lock unfairLock = new ReentrantLock2(false); + + @Test + public void fair(){ + testLock(fairLock); + } + + @Test + public void unfair(){ + testLock(unfairLock); + } + + private void testLock(Lock lock){ + for (int i = 0; i < 5; i++) { + new Job(lock).start(); + } + } + private static class Job extends Thread{ + private ReentrantLock2 lock; + public Job(Lock lock){ + this.lock = (ReentrantLock2) lock; + } + + @Override + public void run() { + lock.lock(); + System.out.println(Thread.currentThread().getName()+","+lock.getQueuedTreads()); + System.out.println(Thread.currentThread().getName()+","+lock.getQueuedTreads()); + lock.unlock(); + } + } + + private static class ReentrantLock2 extends ReentrantLock{ + public ReentrantLock2(boolean fair){ + super(fair); + } + + public Collection getQueuedTreads(){ + List arrayList = new ArrayList(super.getQueuedThreads()); + Collections.reverse(arrayList); + return arrayList; + } + } +} diff --git a/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/Singleton.java b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/Singleton.java new file mode 100644 index 00000000..3c051cd6 --- /dev/null +++ b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/Singleton.java @@ -0,0 +1,20 @@ +package com.github.threadpool; + +public class Singleton { + private volatile static Singleton instance; + + public static Singleton getInstance() { + if (instance == null) { + synchronized (Singleton.class) { + if (instance == null) { + instance = new Singleton(); + } + } + } + return instance; + } + + public static void main(String[] args) { + Singleton.getInstance(); + } +} diff --git a/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/ThreadPool01.java b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/ThreadPool01.java new file mode 100644 index 00000000..34990a90 --- /dev/null +++ b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/ThreadPool01.java @@ -0,0 +1,46 @@ +package com.github.threadpool; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +public class ThreadPool01 { + public static void main(String[] args) { + ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(5, + 6, + 0, + TimeUnit.MILLISECONDS, + new ArrayBlockingQueue(1), + new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r); + } + }, + new ThreadPoolExecutor.AbortPolicy()); + MyTask task = new MyTask(); + for (int i = 0; i < 100; i++) { + try { + poolExecutor.execute(task); + } catch (Exception e) { + e.printStackTrace(); + poolExecutor.shutdown(); + } + } + poolExecutor.shutdown(); + } + +} + +class MyTask implements Runnable { + private int count = 0; + private static final int MAXVALUE = 1000; + + @Override + public void run() { + for (int i = 0; i < MAXVALUE; i++) { + System.out.println(++count); + } + } +} diff --git a/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/VolatileTest.java b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/VolatileTest.java new file mode 100644 index 00000000..c7687332 --- /dev/null +++ b/03concurrency/threadpool/01threadpool/src/main/java/com/github/threadpool/VolatileTest.java @@ -0,0 +1,31 @@ +package com.github.threadpool; + +/*** volatile变量自增运算测试 ** @author zzm */ +public class VolatileTest { + public static volatile int race = 0; + + public static void increase() { + race++; + } + + private static final int THREADS_COUNT = 20; + + public static void main(String[] args) { + Thread[] threads = new Thread[THREADS_COUNT]; + for (int i = 0; i < THREADS_COUNT; i++) { + threads[i] = new Thread(new Runnable() { + @Override + public void run() { + for (int i = 0; i < 10000; i++) { + increase(); + } + } + }); + threads[i].start(); + } + // 等待所有累加线程都结束 + while (Thread.activeCount() > 1) + Thread.yield(); + System.out.println(race); + } +} From 4a436d45f66b6372bd81bf104598a6404cd80db8 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 18 Nov 2020 17:37:03 +0800 Subject: [PATCH 05/22] doing homework --- .../okhttp/OkhttpOutboundHandler.java | 10 +--- .../META-INF/netty-gateway.kotlin_module | Bin 0 -> 16 bytes .../classes/META-INF/01thread.kotlin_module | Bin 0 -> 16 bytes 04spring/example-spring-boot-starter/pom.xml | 39 +++++++++++++ .../starter/StudentAutoConfiguration.java | 29 ++++++++++ .../springboot/starter/StudentProperties.java | 25 +++++++++ .../springboot/starter/service/Student.java | 29 ++++++++++ .../main/resources/META-INF/spring.factories | 2 + .../target/classes/META-INF/spring.factories | 2 + .../target/maven-archiver/pom.properties | 5 ++ .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 3 + .../default-testCompile/inputFiles.lst | 0 04spring/jdbc/pom.xml | 18 ++++++ .../java/com/github/yibing/jdbc/JdbcDemo.java | 31 ++++++++++ 04spring/spring01/pom.xml | 32 +++++++++++ .../yibing/spring/ioc/annotation/Super.java | 11 ++++ .../yibing/spring/ioc/autowire/AppConfig.java | 15 +++++ .../spring/ioc/autowire/InstantiateDemo.java | 26 +++++++++ .../yibing/spring/ioc/autowire/Student.java | 44 +++++++++++++++ .../yibing/spring/ioc/autowire/Teacher.java | 41 ++++++++++++++ .../yibing/spring/ioc/domain/SuperUser.java | 21 +++++++ .../github/yibing/spring/ioc/domain/User.java | 30 ++++++++++ .../ioc/lookup/DependencyLookupDemo.java | 53 ++++++++++++++++++ .../src/main/resources/applicationContext.xml | 18 ++++++ .../src/main/resources/instantiate-type.xml | 30 ++++++++++ .../classes/META-INF/spring01.kotlin_module | Bin 0 -> 16 bytes .../target/classes/application.properties | 2 + .../target/classes/applicationContext.xml | 18 ++++++ .../target/classes/instantiate-type.xml | 30 ++++++++++ 04spring/springboot01/.gitignore | 33 +++++++++++ 04spring/springboot01/pom.xml | 53 ++++++++++++++++++ .../springboot01/Springboot01Application.java | 23 ++++++++ .../src/main/resources/application.properties | 2 + .../Springboot01ApplicationTests.java | 13 +++++ 35 files changed, 683 insertions(+), 8 deletions(-) create mode 100644 02nio/nio02/target/classes/META-INF/netty-gateway.kotlin_module create mode 100644 03concurrency/01thread/target/classes/META-INF/01thread.kotlin_module create mode 100644 04spring/example-spring-boot-starter/pom.xml create mode 100644 04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java create mode 100644 04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java create mode 100644 04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java create mode 100644 04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories create mode 100644 04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories create mode 100644 04spring/example-spring-boot-starter/target/maven-archiver/pom.properties create mode 100644 04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 04spring/jdbc/pom.xml create mode 100644 04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java create mode 100644 04spring/spring01/pom.xml create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java create mode 100644 04spring/spring01/src/main/resources/applicationContext.xml create mode 100644 04spring/spring01/src/main/resources/instantiate-type.xml create mode 100644 04spring/spring01/target/classes/META-INF/spring01.kotlin_module create mode 100644 04spring/spring01/target/classes/application.properties create mode 100644 04spring/spring01/target/classes/applicationContext.xml create mode 100644 04spring/spring01/target/classes/instantiate-type.xml create mode 100644 04spring/springboot01/.gitignore create mode 100644 04spring/springboot01/pom.xml create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/Springboot01Application.java create mode 100644 04spring/springboot01/src/main/resources/application.properties create mode 100644 04spring/springboot01/src/test/java/com/github/yibing/springboot01/Springboot01ApplicationTests.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java index 6435854d..d526eeb3 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java @@ -35,7 +35,7 @@ public OkhttpOutboundHandler(String proxyServer) { // .readTimeout(100, TimeUnit.MILLISECONDS) // .connectTimeout(50, TimeUnit.MILLISECONDS) // .build(); - RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy(); + RejectedExecutionHandler policy = new ThreadPoolExecutor.AbortPolicy(); int cores = Runtime.getRuntime().availableProcessors() * 2; long keepAliveTime = 1000; int queueSize = 2048; @@ -81,14 +81,8 @@ private void handleResponse(ChannelHandlerContext ctx, Response response, FullHt ctx.write(httpResponse); } ctx.flush(); + ctx.close(); } } } - - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - - } diff --git a/02nio/nio02/target/classes/META-INF/netty-gateway.kotlin_module b/02nio/nio02/target/classes/META-INF/netty-gateway.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..2983af70661ad375cc499ebc4da5a68ca46c532e GIT binary patch literal 16 RcmZQzU|?ooU|@t|egFVe02KfL literal 0 HcmV?d00001 diff --git a/03concurrency/01thread/target/classes/META-INF/01thread.kotlin_module b/03concurrency/01thread/target/classes/META-INF/01thread.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..2983af70661ad375cc499ebc4da5a68ca46c532e GIT binary patch literal 16 RcmZQzU|?ooU|@t|egFVe02KfL literal 0 HcmV?d00001 diff --git a/04spring/example-spring-boot-starter/pom.xml b/04spring/example-spring-boot-starter/pom.xml new file mode 100644 index 00000000..fccc9ec9 --- /dev/null +++ b/04spring/example-spring-boot-starter/pom.xml @@ -0,0 +1,39 @@ + + + 4.0.0 + + example.springboot + example-spring-boot-starter + 1.0-SNAPSHOT + + + 4.3.29.RELEASE + UTF-8 + UTF-8 + + + + org.projectlombok + lombok + 1.18.12 + + + org.springframework + spring-context + ${spring-version} + + + org.springframework + spring-core + ${spring-version} + + + org.springframework.boot + spring-boot-autoconfigure + 2.3.5.RELEASE + compile + + + \ No newline at end of file diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java new file mode 100644 index 00000000..23c6c200 --- /dev/null +++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentAutoConfiguration.java @@ -0,0 +1,29 @@ +package example.springboot.starter; + +import example.springboot.starter.service.Student; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ConditionalOnClass(Student.class) +@EnableConfigurationProperties(StudentProperties.class) +@ConditionalOnProperty(prefix = "example.student", value = "enabled", matchIfMissing = true) +public class StudentAutoConfiguration { + + @Autowired + private StudentProperties studentProperties; + + @Bean + @ConditionalOnMissingBean(Student.class) + public Student student() { + Student student = new Student(); + student.setId(studentProperties.getId()); + student.setName(studentProperties.getName()); + return student; + } +} diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java new file mode 100644 index 00000000..d34cf22e --- /dev/null +++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/StudentProperties.java @@ -0,0 +1,25 @@ +package example.springboot.starter; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "example.student") +public class StudentProperties { + private int id; + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java new file mode 100644 index 00000000..7a93fa94 --- /dev/null +++ b/04spring/example-spring-boot-starter/src/main/java/example/springboot/starter/service/Student.java @@ -0,0 +1,29 @@ +package example.springboot.starter.service; + + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.io.Serializable; + + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString + +public class Student implements Serializable { + + private int id; + private String name; + + public void init(){ + System.out.println("hello..........."); + } + + public Student create(){ + return new Student(101,"KK101"); + } +} diff --git a/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories b/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..0dce1c63 --- /dev/null +++ b/04spring/example-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + example.springboot.starter.StudentAutoConfiguration \ No newline at end of file diff --git a/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories b/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories new file mode 100644 index 00000000..0dce1c63 --- /dev/null +++ b/04spring/example-spring-boot-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + example.springboot.starter.StudentAutoConfiguration \ No newline at end of file diff --git a/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties b/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties new file mode 100644 index 00000000..1d3dde19 --- /dev/null +++ b/04spring/example-spring-boot-starter/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Wed Nov 18 16:02:42 GMT+08:00 2020 +version=1.0-SNAPSHOT +groupId=example.springboot +artifactId=example-spring-boot-starter diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..aed12f76 --- /dev/null +++ b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,3 @@ +example\springboot\starter\service\Student.class +example\springboot\starter\StudentProperties.class +example\springboot\starter\StudentAutoConfiguration.class diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..f89d2be7 --- /dev/null +++ b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\service\Student.java +D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\StudentAutoConfiguration.java +D:\wangyibing\JavaCourseCodes\04spring\example-spring-boot-starter\src\main\java\example\springboot\starter\StudentProperties.java diff --git a/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/04spring/example-spring-boot-starter/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 00000000..e69de29b diff --git a/04spring/jdbc/pom.xml b/04spring/jdbc/pom.xml new file mode 100644 index 00000000..fd8f8547 --- /dev/null +++ b/04spring/jdbc/pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + jdbc + jdbc-demo + 1.0-SNAPSHOT + + + mysql + mysql-connector-java + 8.0.16 + + + + \ No newline at end of file diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java new file mode 100644 index 00000000..349183c2 --- /dev/null +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java @@ -0,0 +1,31 @@ +package com.github.yibing.jdbc; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class JdbcDemo { + private static String driver = "com.mysql.jdbc.Driver"; + private static String url = "jdbc:mysql://localhost:3306/student"; + private static String username = "root"; + private static String password = "123456"; + private static Connection connection = null; + + public static void main(String[] args) { + try { + Class.forName("com.mysql.jdbc.Driver"); + connection = DriverManager.getConnection(url, username, password); + System.out.println(connection); + } catch (ClassNotFoundException | SQLException e) { + e.printStackTrace(); + } finally { + try { + if (connection != null) { + connection.close(); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + } +} diff --git a/04spring/spring01/pom.xml b/04spring/spring01/pom.xml new file mode 100644 index 00000000..5512bb6a --- /dev/null +++ b/04spring/spring01/pom.xml @@ -0,0 +1,32 @@ + + + 4.0.0 + + org.github.yibing + springioc + 1.0-SNAPSHOT + + + 4.3.29.RELEASE + + + + + org.springframework + spring-context + ${spring-version} + + + org.springframework.boot + spring-boot-starter + 2.3.5.RELEASE + + + example.springboot + example-spring-boot-starter + 1.0-SNAPSHOT + + + \ No newline at end of file diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java new file mode 100644 index 00000000..4758ac56 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/annotation/Super.java @@ -0,0 +1,11 @@ +package org.github.yibing.spring.ioc.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface Super { +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java new file mode 100644 index 00000000..bd0a608d --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/AppConfig.java @@ -0,0 +1,15 @@ +package org.github.yibing.spring.ioc.autowire; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("org.github.yibing.spring.ioc.autowire") +public class AppConfig { + +// @Bean +// public Student student() { +// return new Student(); +// } + +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java new file mode 100644 index 00000000..bce77baa --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/InstantiateDemo.java @@ -0,0 +1,26 @@ +package org.github.yibing.spring.ioc.autowire; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class InstantiateDemo { + + public static void main(String[] args) { +// javaconfig(); +// xmlconfig(); + } + + + private static void xmlconfig() { + BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:instantiate-type.xml"); + Teacher teacher = (Teacher) beanFactory.getBean("teacher"); + System.out.println(teacher); + } + + private static void javaconfig() { + BeanFactory beanFactory = new AnnotationConfigApplicationContext(AppConfig.class); + Student student = (Student) beanFactory.getBean("student"); + System.out.println(student); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java new file mode 100644 index 00000000..d402a6ae --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java @@ -0,0 +1,44 @@ +package org.github.yibing.spring.ioc.autowire; + +import org.springframework.stereotype.Component; + +@Component("student") + +public class Student { + private String id; + private String name; + + public Student(String id, String name) { + this.id = id; + this.name = name; + } + + public void init() { + System.out.println("hello..........."+this.name); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "Student{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + '}'; + } +} + diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java new file mode 100644 index 00000000..f6425a61 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Teacher.java @@ -0,0 +1,41 @@ +package org.github.yibing.spring.ioc.autowire; + +public class Teacher { + private String subject; + private String id; + // 依赖Student类 + private Student student; + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Student getStudent() { + return student; + } + + public void setStudent(Student student) { + this.student = student; + } + + @Override + public String toString() { + return "Teacher{" + + "subject='" + subject + '\'' + + ", id='" + id + '\'' + + ", student=" + student + + '}'; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java new file mode 100644 index 00000000..f184958c --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/SuperUser.java @@ -0,0 +1,21 @@ +package org.github.yibing.spring.ioc.domain; + +import org.github.yibing.spring.ioc.annotation.Super; + +@Super +public class SuperUser extends User { + private String address; + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + @Override + public String toString() { + return "SuperUser{} " + super.toString(); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java new file mode 100644 index 00000000..1ce7ddb9 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/domain/User.java @@ -0,0 +1,30 @@ +package org.github.yibing.spring.ioc.domain; + +public class User { + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public String toString() { + return "User{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java new file mode 100644 index 00000000..5b3e2227 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java @@ -0,0 +1,53 @@ +package org.github.yibing.spring.ioc.lookup; + +import org.github.yibing.spring.ioc.annotation.Super; +import org.github.yibing.spring.ioc.domain.User; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.ListableBeanFactory; +import org.springframework.beans.factory.ObjectFactory; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.util.Map; + +public class DependencyLookupDemo { + public static void main(String[] args) { + BeanFactory context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); +// lookupInRealTime(context); +// lookupInLazy(context); +// lookupByType(context); +// lookupCollectionByType(context); + lookupByAnnotation(context); + } + + private static void lookupByAnnotation(BeanFactory context) { + if(context instanceof ListableBeanFactory){ + ListableBeanFactory listableBeanFactory = (ListableBeanFactory) context; + Map users = listableBeanFactory.getBeansWithAnnotation(Super.class); + System.out.println("按注解查找集合:"+users); + } + } + + private static void lookupCollectionByType(BeanFactory context) { + if(context instanceof ListableBeanFactory){ + ListableBeanFactory listableBeanFactory = (ListableBeanFactory) context; + Map users = listableBeanFactory.getBeansOfType(User.class); + System.out.println("按类型查找集合:"+users); + } + } + + private static void lookupByType(BeanFactory context) { + User user = context.getBean(User.class); + System.out.println("按类型查找:"+user); + } + + private static void lookupInLazy(BeanFactory context) { + ObjectFactory objectFactory = (ObjectFactory) context.getBean("objectFactory"); + User user = objectFactory.getObject(); + System.out.println("延迟查找:"+user); + } + + private static void lookupInRealTime(BeanFactory context) { + User user = (User) context.getBean("user"); + System.out.println("实时查找:"+user); + } +} diff --git a/04spring/spring01/src/main/resources/applicationContext.xml b/04spring/spring01/src/main/resources/applicationContext.xml new file mode 100644 index 00000000..3b369fc8 --- /dev/null +++ b/04spring/spring01/src/main/resources/applicationContext.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/04spring/spring01/src/main/resources/instantiate-type.xml b/04spring/spring01/src/main/resources/instantiate-type.xml new file mode 100644 index 00000000..ed56a6b1 --- /dev/null +++ b/04spring/spring01/src/main/resources/instantiate-type.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/04spring/spring01/target/classes/META-INF/spring01.kotlin_module b/04spring/spring01/target/classes/META-INF/spring01.kotlin_module new file mode 100644 index 0000000000000000000000000000000000000000..2983af70661ad375cc499ebc4da5a68ca46c532e GIT binary patch literal 16 RcmZQzU|?ooU|@t|egFVe02KfL literal 0 HcmV?d00001 diff --git a/04spring/spring01/target/classes/application.properties b/04spring/spring01/target/classes/application.properties new file mode 100644 index 00000000..9e2e9c98 --- /dev/null +++ b/04spring/spring01/target/classes/application.properties @@ -0,0 +1,2 @@ +example.student.id = 1 +example.student.name= \ No newline at end of file diff --git a/04spring/spring01/target/classes/applicationContext.xml b/04spring/spring01/target/classes/applicationContext.xml new file mode 100644 index 00000000..3b369fc8 --- /dev/null +++ b/04spring/spring01/target/classes/applicationContext.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/04spring/spring01/target/classes/instantiate-type.xml b/04spring/spring01/target/classes/instantiate-type.xml new file mode 100644 index 00000000..308cbaac --- /dev/null +++ b/04spring/spring01/target/classes/instantiate-type.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/04spring/springboot01/.gitignore b/04spring/springboot01/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/04spring/springboot01/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/04spring/springboot01/pom.xml b/04spring/springboot01/pom.xml new file mode 100644 index 00000000..63156d4f --- /dev/null +++ b/04spring/springboot01/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.0 + + + com.github.yibing + springboot01 + 0.0.1-SNAPSHOT + springboot01 + Demo project for Spring Boot + + + 1.8 + + + + + example.springboot + example-spring-boot-starter + 1.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/Springboot01Application.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/Springboot01Application.java new file mode 100644 index 00000000..f3fb9a1a --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/Springboot01Application.java @@ -0,0 +1,23 @@ +package com.github.yibing.springboot01; + +import example.springboot.starter.service.Student; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Springboot01Application implements CommandLineRunner { + + @Autowired + private Student student; + public static void main(String[] args) { + SpringApplication.run(Springboot01Application.class, args); + } + + @Override + public void run(String... args) throws Exception { + student.init(); + System.out.println(student.getId()); + } +} diff --git a/04spring/springboot01/src/main/resources/application.properties b/04spring/springboot01/src/main/resources/application.properties new file mode 100644 index 00000000..94f0a320 --- /dev/null +++ b/04spring/springboot01/src/main/resources/application.properties @@ -0,0 +1,2 @@ +example.student.id=1 +example.student.name=张三 diff --git a/04spring/springboot01/src/test/java/com/github/yibing/springboot01/Springboot01ApplicationTests.java b/04spring/springboot01/src/test/java/com/github/yibing/springboot01/Springboot01ApplicationTests.java new file mode 100644 index 00000000..986c5174 --- /dev/null +++ b/04spring/springboot01/src/test/java/com/github/yibing/springboot01/Springboot01ApplicationTests.java @@ -0,0 +1,13 @@ +package com.github.yibing.springboot01; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class Springboot01ApplicationTests { + + @Test + void contextLoads() { + } + +} From 47ccab151521a032712499c8bdcba728e681c650 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 18 Nov 2020 21:47:53 +0800 Subject: [PATCH 06/22] week_05 homework --- 04spring/jdbc/pom.xml | 31 ++++- .../java/com/github/yibing/jdbc/DBUtils.java | 67 +++++++++ .../java/com/github/yibing/jdbc/JdbcDemo.java | 130 ++++++++++++++++-- .../github/yibing/jdbc/domain/Student.java | 19 +++ 4 files changed, 225 insertions(+), 22 deletions(-) create mode 100644 04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java create mode 100644 04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java diff --git a/04spring/jdbc/pom.xml b/04spring/jdbc/pom.xml index fd8f8547..2c4ff10c 100644 --- a/04spring/jdbc/pom.xml +++ b/04spring/jdbc/pom.xml @@ -7,12 +7,29 @@ jdbc jdbc-demo 1.0-SNAPSHOT - - - mysql - mysql-connector-java - 8.0.16 - - + + + mysql + mysql-connector-java + 8.0.16 + + + junit + junit + 4.12 + + + org.projectlombok + lombok + 1.18.12 + + + com.zaxxer + HikariCP + 3.4.5 + + + + \ No newline at end of file diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java new file mode 100644 index 00000000..19199070 --- /dev/null +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java @@ -0,0 +1,67 @@ +package com.github.yibing.jdbc; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; + +import java.sql.*; + +public class DBUtils { + private static final String driver = "com.mysql.jdbc.Driver"; + private static final String url = "jdbc:mysql://localhost:3306/student?&serverTimezone=Asia/Shanghai"; + private static final String username = "root"; + private static final String password = "123456"; + private static Connection connection = null; + + public static Connection getConnection() { + try { + Class.forName("com.mysql.jdbc.Driver"); + connection = DriverManager.getConnection(url, username, password); + } catch (ClassNotFoundException | SQLException e) { + e.printStackTrace(); + } + return connection; + } + + public static Connection getHikariConnection() { + HikariConfig config = new HikariConfig(); + config.setJdbcUrl(url); + config.setUsername(username); + config.setPassword(password); + HikariDataSource dataSource = new HikariDataSource(config); + try { + connection = dataSource.getConnection(); + } catch (SQLException throwables) { + throwables.printStackTrace(); + } + return connection; + } + + public static void closeConnection(Connection connection, Statement statement) { + try { + if (connection != null) { + connection.close(); + } + if (statement != null) { + statement.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void closeConnection(Connection connection, Statement statement, ResultSet resultSet) { + try { + if (connection != null) { + connection.close(); + } + if (statement != null) { + statement.close(); + } + if (resultSet != null) { + resultSet.close(); + } + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java index 349183c2..10e6bd09 100644 --- a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java @@ -1,31 +1,131 @@ package com.github.yibing.jdbc; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import com.github.yibing.jdbc.domain.Student; +import org.junit.Test; + +import java.sql.*; +import java.util.ArrayList; public class JdbcDemo { - private static String driver = "com.mysql.jdbc.Driver"; - private static String url = "jdbc:mysql://localhost:3306/student"; - private static String username = "root"; - private static String password = "123456"; private static Connection connection = null; public static void main(String[] args) { + + } + + // 查询 + @Test + public void queryStudent() { + String sql = "select * from student"; + connection = DBUtils.getConnection(); + ResultSet resultSet = null; + Statement statement = null; try { - Class.forName("com.mysql.jdbc.Driver"); - connection = DriverManager.getConnection(url, username, password); - System.out.println(connection); - } catch (ClassNotFoundException | SQLException e) { - e.printStackTrace(); + statement = connection.createStatement(); + resultSet = statement.executeQuery(sql); + while (resultSet.next()) { + System.out.println("id = " + resultSet.getString("id")); + System.out.println("name = " + resultSet.getString("name")); + } + } catch (SQLException throwables) { + throwables.printStackTrace(); } finally { - try { - if (connection != null) { - connection.close(); + DBUtils.closeConnection(connection, statement, resultSet); + } + } + // 插入 + @Test + public void insertOne() { + Student student = new Student(3, "李华"); + Connection connection = DBUtils.getConnection(); + PreparedStatement psmt = null; + try { + psmt = connection.prepareStatement("insert into student values(?,?)"); + psmt.setInt(1, student.getId()); + psmt.setString(2, student.getName()); + int i = psmt.executeUpdate(); + if (i > 0) { + System.out.println("成功----" + i); + } + } catch (SQLException throwables) { + throwables.printStackTrace(); + } finally { + DBUtils.closeConnection(connection, psmt); + } + + } + // 删除一个 + @Test + public void deleteOne() { + Connection connection = DBUtils.getConnection(); + PreparedStatement psmt = null; + try { + psmt = connection.prepareStatement("delete from student where id = ?"); + psmt.setInt(1, 3); + int i = psmt.executeUpdate(); + if (i > 0) { + System.out.println("删除成功--" + i + "条"); + } + } catch (SQLException throwables) { + throwables.printStackTrace(); + } finally { + DBUtils.closeConnection(connection, psmt); + } + } + // 修改 + @Test + public void updateOne() { + Student student = new Student(1, "小明"); + Connection connection = DBUtils.getConnection(); + PreparedStatement psmt = null; + + try { + psmt = connection.prepareStatement("update student set name = ? where id = ?"); + int i = psmt.executeUpdate(); + if (i > 0) { + System.out.println("已修改" + i + "条"); + } + } catch (SQLException throwables) { + throwables.printStackTrace(); + } finally { + DBUtils.closeConnection(connection, psmt); + } + + } + // 批量插入 + @Test + public void batchInsert() { + ArrayList list = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + list.add(new Student("student" + i)); + } + // 使用 JDBC +// Connection connection = DBUtils.getConnection(); + // 使用 Hikari连接池 + Connection connection = DBUtils.getHikariConnection(); + String sql = "insert into student (name) values (?)"; + PreparedStatement psmt = null; + try { + psmt = connection.prepareStatement(sql); + connection.setAutoCommit(false); + for (int i = 0; i < list.size(); i++) { + if (i == 5) { + psmt.setString(1, "sssssssssssssssssssssssssssssssssssssssssssssssssssssss"); + } else { + psmt.setString(1, list.get(i).getName()); } + psmt.executeUpdate(); + } + connection.commit(); + } catch (SQLException throwables) { + throwables.printStackTrace(); + try { + connection.rollback(); } catch (SQLException e) { e.printStackTrace(); } + } finally { + DBUtils.closeConnection(connection, psmt); } } } diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java new file mode 100644 index 00000000..55de5233 --- /dev/null +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/domain/Student.java @@ -0,0 +1,19 @@ +package com.github.yibing.jdbc.domain; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class Student { + private int id; + private String name; + + public Student(String name) { + this.name = name; + } +} From b3bf3b33e671d2ed093307972b8de70e24a34198 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Mon, 23 Nov 2020 16:46:24 +0800 Subject: [PATCH 07/22] update --- .../gateway/filter/HttpRequestFilterImpl.java | 11 +++++++++- .../okhttp/OkhttpOutboundHandler.java | 2 +- .../yibing/spring/aop/jdkproxy/Animal.java | 5 +++++ .../yibing/spring/aop/jdkproxy/Bird.java | 8 +++++++ .../yibing/spring/aop/jdkproxy/BirdProxy.java | 21 +++++++++++++++++++ .../spring/aop/jdkproxy/JdkProxyDemo.java | 13 ++++++++++++ 6 files changed, 58 insertions(+), 2 deletions(-) create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java index df2acd44..63e8649a 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/filter/HttpRequestFilterImpl.java @@ -1,11 +1,20 @@ package io.github.kimmking.gateway.filter; import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.http.DefaultHttpHeaders; import io.netty.handler.codec.http.FullHttpRequest; +import io.netty.handler.codec.http.HttpHeaders; public class HttpRequestFilterImpl implements HttpRequestFilter { @Override public void filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx) { - fullRequest.headers().set("nio","wangyibing"); + String uri = fullRequest.uri(); + System.out.println("filter(FullHttpRequest fullRequest, ChannelHandlerContext ctx)接收到的请求,url:" + uri); + HttpHeaders headers = fullRequest.headers(); + if (headers == null) { + headers = new DefaultHttpHeaders(); + } + headers.add("nio", "wangyibing"); + fullRequest.headers().set(headers); } } diff --git a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java index 80daca82..69db865a 100644 --- a/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java +++ b/02nio/nio02/src/main/java/io/github/kimmking/gateway/outbound/okhttp/OkhttpOutboundHandler.java @@ -31,7 +31,7 @@ public class OkhttpOutboundHandler { public OkhttpOutboundHandler(String proxyServer) { this.proxyServer = proxyServer; - RejectedExecutionHandler policy = new ThreadPoolExecutor.CallerRunsPolicy(); + RejectedExecutionHandler policy = new ThreadPoolExecutor.AbortPolicy(); int cores = Runtime.getRuntime().availableProcessors() * 2; long keepAliveTime = 1000; int queueSize = 2048; diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java new file mode 100644 index 00000000..e2bdc78d --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Animal.java @@ -0,0 +1,5 @@ +package org.github.yibing.spring.aop.jdkproxy; + +public interface Animal { + void breathe(); +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java new file mode 100644 index 00000000..528ad26d --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/Bird.java @@ -0,0 +1,8 @@ +package org.github.yibing.spring.aop.jdkproxy; + +public class Bird implements Animal { + @Override + public void breathe() { + System.out.println("animal can breathe.."); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java new file mode 100644 index 00000000..546d2b7e --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/BirdProxy.java @@ -0,0 +1,21 @@ +package org.github.yibing.spring.aop.jdkproxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +public class BirdProxy implements InvocationHandler { + + private Animal bird; + + public BirdProxy(Animal bird) { + this.bird = bird; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + System.out.println("before invoke ........"); + Object obj = method.invoke(bird, args); + System.out.println("after invoke ...."); + return obj; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java new file mode 100644 index 00000000..452a0a47 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/aop/jdkproxy/JdkProxyDemo.java @@ -0,0 +1,13 @@ +package org.github.yibing.spring.aop.jdkproxy; + +import java.lang.reflect.Proxy; + +public class JdkProxyDemo { + public static void main(String[] args) { + Animal bird = new Bird(); + BirdProxy birdProxy = new BirdProxy(bird); + Animal instance = (Animal) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(), birdProxy); + System.out.println("代理的类型:" + bird.getClass().getName()); + instance.breathe(); + } +} From 9ca6e233fc364710e4eb28c78215a4146b2530f7 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Thu, 26 Nov 2020 17:29:41 +0800 Subject: [PATCH 08/22] add cyclic di code --- 04spring/spring01/pom.xml | 28 +++++++++++++------ .../yibing/spring/Spring01Application.java | 11 ++++++++ .../yibing/spring/ioc/autowire/Student.java | 5 ---- .../github/yibing/spring/ioc/cycleDI/A.java | 9 ++++++ .../github/yibing/spring/ioc/cycleDI/B.java | 9 ++++++ .../github/yibing/spring/ioc/cycleDI/C.java | 9 ++++++ .../ioc/lookup/DependencyLookupDemo.java | 4 +-- .../src/main/resources/application.properties | 0 .../src/main/resources/applicationContext.xml | 5 +++- .../target/classes/application.properties | 2 -- .../target/classes/applicationContext.xml | 5 +++- .../target/classes/instantiate-type.xml | 10 +++---- 12 files changed, 72 insertions(+), 25 deletions(-) create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java create mode 100644 04spring/spring01/src/main/resources/application.properties diff --git a/04spring/spring01/pom.xml b/04spring/spring01/pom.xml index 5512bb6a..1d12d6cf 100644 --- a/04spring/spring01/pom.xml +++ b/04spring/spring01/pom.xml @@ -3,7 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + + org.springframework.boot + spring-boot-starter-parent + 2.4.0 + + org.github.yibing springioc 1.0-SNAPSHOT @@ -16,17 +21,22 @@ org.springframework spring-context - ${spring-version} org.springframework.boot spring-boot-starter - 2.3.5.RELEASE - - - example.springboot - example-spring-boot-starter - 1.0-SNAPSHOT - \ No newline at end of file + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java b/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java new file mode 100644 index 00000000..5702b527 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/Spring01Application.java @@ -0,0 +1,11 @@ +package org.github.yibing.spring; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Spring01Application { + public static void main(String[] args) { + SpringApplication.run(Spring01Application.class, args); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java index d402a6ae..638f1d16 100644 --- a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/autowire/Student.java @@ -8,11 +8,6 @@ public class Student { private String id; private String name; - public Student(String id, String name) { - this.id = id; - this.name = name; - } - public void init() { System.out.println("hello..........."+this.name); } diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java new file mode 100644 index 00000000..7000c332 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/A.java @@ -0,0 +1,9 @@ +package org.github.yibing.spring.ioc.cycleDI; + +import org.springframework.stereotype.Service; + +@Service +public class A { + public A(B b) { + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java new file mode 100644 index 00000000..440e6654 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/B.java @@ -0,0 +1,9 @@ +package org.github.yibing.spring.ioc.cycleDI; + +import org.springframework.stereotype.Service; + +@Service +public class B { + public B(C c) { + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java new file mode 100644 index 00000000..1668c512 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/cycleDI/C.java @@ -0,0 +1,9 @@ +package org.github.yibing.spring.ioc.cycleDI; + +import org.springframework.stereotype.Service; + +@Service +public class C { + public C(A a) { + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java index 5b3e2227..57b5b5b9 100644 --- a/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/ioc/lookup/DependencyLookupDemo.java @@ -12,11 +12,11 @@ public class DependencyLookupDemo { public static void main(String[] args) { BeanFactory context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); -// lookupInRealTime(context); + lookupInRealTime(context); // lookupInLazy(context); // lookupByType(context); // lookupCollectionByType(context); - lookupByAnnotation(context); +// lookupByAnnotation(context); } private static void lookupByAnnotation(BeanFactory context) { diff --git a/04spring/spring01/src/main/resources/application.properties b/04spring/spring01/src/main/resources/application.properties new file mode 100644 index 00000000..e69de29b diff --git a/04spring/spring01/src/main/resources/applicationContext.xml b/04spring/spring01/src/main/resources/applicationContext.xml index 3b369fc8..f1c9bb52 100644 --- a/04spring/spring01/src/main/resources/applicationContext.xml +++ b/04spring/spring01/src/main/resources/applicationContext.xml @@ -1,7 +1,8 @@ + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> @@ -15,4 +16,6 @@ + + \ No newline at end of file diff --git a/04spring/spring01/target/classes/application.properties b/04spring/spring01/target/classes/application.properties index 9e2e9c98..e69de29b 100644 --- a/04spring/spring01/target/classes/application.properties +++ b/04spring/spring01/target/classes/application.properties @@ -1,2 +0,0 @@ -example.student.id = 1 -example.student.name= \ No newline at end of file diff --git a/04spring/spring01/target/classes/applicationContext.xml b/04spring/spring01/target/classes/applicationContext.xml index 3b369fc8..f1c9bb52 100644 --- a/04spring/spring01/target/classes/applicationContext.xml +++ b/04spring/spring01/target/classes/applicationContext.xml @@ -1,7 +1,8 @@ + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> @@ -15,4 +16,6 @@ + + \ No newline at end of file diff --git a/04spring/spring01/target/classes/instantiate-type.xml b/04spring/spring01/target/classes/instantiate-type.xml index 308cbaac..ed56a6b1 100644 --- a/04spring/spring01/target/classes/instantiate-type.xml +++ b/04spring/spring01/target/classes/instantiate-type.xml @@ -4,27 +4,27 @@ xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> - + - + - + - + - + \ No newline at end of file From 5f4305b835a1136cd2d3be2ce4c3f8eea44add7f Mon Sep 17 00:00:00 2001 From: wangyibing Date: Mon, 30 Nov 2020 17:34:32 +0800 Subject: [PATCH 09/22] add seventh time homework --- .../datademo/controller/OrderController.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java new file mode 100644 index 00000000..88b08cde --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java @@ -0,0 +1,21 @@ +package com.github.yibing.data.datademo.controller; + +import com.github.yibing.data.datademo.entity.Order; +import com.github.yibing.data.datademo.service.OrderService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +public class OrderController { + + @Autowired + private OrderService orderService; + + @GetMapping("/order/query") + public List gerOrderList() { + return orderService.queryOrder(); + } +} From 7b6b50a1297fccb7e6544d25584fc15802a7f449 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Mon, 30 Nov 2020 20:16:01 +0800 Subject: [PATCH 10/22] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../github/thread/lock/ReadWriteLockDemo.java | 36 +++++ .../github/thread/lock/ReentrantLockDemo.java | 25 ++++ 04spring/spring01/pom.xml | 7 + .../github/yibing/spring/stream/Employee.java | 18 +++ .../yibing/spring/stream/StreamDemo.java | 125 ++++++++++++++++++ .../target/classes/application.properties | 2 - 6 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 03concurrency/thread/src/main/java/com/github/thread/lock/ReadWriteLockDemo.java create mode 100644 03concurrency/thread/src/main/java/com/github/thread/lock/ReentrantLockDemo.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java delete mode 100644 04spring/spring01/target/classes/application.properties diff --git a/03concurrency/thread/src/main/java/com/github/thread/lock/ReadWriteLockDemo.java b/03concurrency/thread/src/main/java/com/github/thread/lock/ReadWriteLockDemo.java new file mode 100644 index 00000000..396b89c1 --- /dev/null +++ b/03concurrency/thread/src/main/java/com/github/thread/lock/ReadWriteLockDemo.java @@ -0,0 +1,36 @@ +package com.github.thread.lock; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantReadWriteLock; + +public class ReadWriteLockDemo { + public static void main(String[] args) { + ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); + ReentrantReadWriteLock.ReadLock readLock = lock.readLock(); + ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock(); + Task02 task02 = new Task02(readLock); + Task02 task03 = new Task02(writeLock); + for (int i = 0; i < 5; i++) { +// new Thread(task02).start(); + new Thread(task03).start(); + } + + } +} + +class Task02 implements Runnable { + + Lock lock; + + public Task02(Lock lock) { + this.lock = lock; + } + + @Override + public void run() { + lock.lock(); + System.out.println(lock.getClass().getName() + " " + Thread.currentThread().getName()); + lock.unlock(); + } +} + diff --git a/03concurrency/thread/src/main/java/com/github/thread/lock/ReentrantLockDemo.java b/03concurrency/thread/src/main/java/com/github/thread/lock/ReentrantLockDemo.java new file mode 100644 index 00000000..67e0364f --- /dev/null +++ b/03concurrency/thread/src/main/java/com/github/thread/lock/ReentrantLockDemo.java @@ -0,0 +1,25 @@ +package com.github.thread.lock; + +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; + +public class ReentrantLockDemo { + public static void main(String[] args) { + Task01 task01 = new Task01(); + new Thread(task01).start(); + new Thread(task01).start(); + } +} + +class Task01 implements Runnable { + Lock lock = new ReentrantLock(); + + @Override + public void run() { + lock.lock(); + for (int i = 0; i < 10; i++) { + System.out.println(Thread.currentThread().getName() + "运行 ------------" + i); + } + lock.unlock(); + } +} diff --git a/04spring/spring01/pom.xml b/04spring/spring01/pom.xml index 5512bb6a..f72c9441 100644 --- a/04spring/spring01/pom.xml +++ b/04spring/spring01/pom.xml @@ -28,5 +28,12 @@ example-spring-boot-starter 1.0-SNAPSHOT + + junit + junit + 4.12 + + + \ No newline at end of file diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java new file mode 100644 index 00000000..6f7ec1d2 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/Employee.java @@ -0,0 +1,18 @@ +package org.github.yibing.spring.stream; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.ToString; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@ToString +public class Employee { + private int id; + private String name; + private int age; + private Double salary; + +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java new file mode 100644 index 00000000..412a7d47 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo.java @@ -0,0 +1,125 @@ +package org.github.yibing.spring.stream; + +import org.junit.Test; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class StreamDemo { + List emps = Arrays.asList(new Employee(101, "张三", 28, 9999d), + new Employee(101, "李四", 49, 666d), + new Employee(102, "王五", 38, 333d), + new Employee(103, "赵六", 12, 7777d), + new Employee(104, "田七", 6, 222d) + ); + + public static void main(String[] args) { + /** + * stream 的创建方式 + */ + + // 集合创建 + ArrayList list = new ArrayList<>(); + Stream stream = list.stream(); + // 数组创建 + Integer[] integers = new Integer[10]; + Stream stream1 = Arrays.stream(integers); + // Stream静态方法传概念 + Stream stream2 = Stream.of(1, 2, 3, 4, 5, 6); + // 创建无线流 + Stream stream3 = Stream.iterate(0, (x) -> x + 1); + + + } + + // 中间操作-过滤 + @Test + public void test1() { + emps.stream() + .filter((e) -> e.getAge() > 20) + .limit(2) // limit(long n) :截取前面 n 条 , skip(long n):跳过前面 n 条 + .forEach(System.out::println); + } + + // 中间操作-映射 + @Test + public void test2() { + List strList = Arrays.asList("aaa", "bbb", "ccc", "ddd", "eee"); + Stream stream = strList.stream().map(String::toUpperCase); + stream.forEach(System.out::println); + +// Stream> stream1 = strList.stream().map(StreamDemo::filterCharacter); +// stream1.forEach((sm) -> { +// sm.forEach(System.out::print); +// }); + Stream stream2 = strList.stream().flatMap(StreamDemo::filterCharacter); + stream2.forEach(System.out::print); + + } + + // 中间操作-排序 + @Test + public void test3() { + emps.stream() + .map(Employee::getName) + .sorted() // 排序 + .forEach(System.out::println); + + emps.stream() + .sorted((x, y) -> { + if (x.getAge() == y.getAge()) { + return x.getName().compareTo(y.getName()); + } else { + return Integer.compare(x.getAge(), y.getAge()); + } + }) // 排序 + .forEach(System.out::println); + } + + // 查找与匹配 + @Test + public void test4() { + // 查看每个名字中是否都包含"五" ,这里返回false + boolean b = emps.stream().allMatch((e) -> e.getName().contains("五")); + System.out.println(b); + // 返回第一个 + Optional first = emps.stream().findFirst(); + System.out.println(first.get()); + } + + // 归约 + @Test + public void test5() { + // 从0开始加 ,加到10 + List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); + Integer sum = list.stream().reduce(0, (x, y) -> x + y); + System.out.println(sum); + + // 求所有员工的薪水总和 + Optional op = emps.stream().map(Employee::getSalary).reduce(Double::sum); + System.out.println(op.get()); + } + + //收集 : 将流转换成其他形式,collect(Collectors.()) + @Test + public void test6() { + List list = emps.stream().map(Employee::getName).collect(Collectors.toList()); + list.forEach(System.out::println); + Set set = emps.stream().map(Employee::getName).collect(Collectors.toSet()); + set.forEach(System.out::println); + + // 薪水求和 + Double sum = emps.stream().collect(Collectors.summingDouble(Employee::getSalary)); + //求平均薪水 + Double avg = emps.stream().collect(Collectors.averagingDouble(Employee::getSalary)); + } + + public static Stream filterCharacter(String str) { + ArrayList list = new ArrayList<>(); + for (Character ch : str.toCharArray()) { + list.add(ch); + } + return list.stream(); + } +} diff --git a/04spring/spring01/target/classes/application.properties b/04spring/spring01/target/classes/application.properties deleted file mode 100644 index 9e2e9c98..00000000 --- a/04spring/spring01/target/classes/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -example.student.id = 1 -example.student.name= \ No newline at end of file From d2df85565d47b09211a1bba9b9fa54d00be539db Mon Sep 17 00:00:00 2001 From: wangyibing Date: Mon, 30 Nov 2020 20:24:32 +0800 Subject: [PATCH 11/22] =?UTF-8?q?'=E5=88=A0=E9=99=A4target=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=A4=B9'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../classes/META-INF/spring01.kotlin_module | Bin 16 -> 0 bytes .../target/classes/applicationContext.xml | 18 ----------- .../target/classes/instantiate-type.xml | 30 ------------------ 3 files changed, 48 deletions(-) delete mode 100644 04spring/spring01/target/classes/META-INF/spring01.kotlin_module delete mode 100644 04spring/spring01/target/classes/applicationContext.xml delete mode 100644 04spring/spring01/target/classes/instantiate-type.xml diff --git a/04spring/spring01/target/classes/META-INF/spring01.kotlin_module b/04spring/spring01/target/classes/META-INF/spring01.kotlin_module deleted file mode 100644 index 2983af70661ad375cc499ebc4da5a68ca46c532e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16 RcmZQzU|?ooU|@t|egFVe02KfL diff --git a/04spring/spring01/target/classes/applicationContext.xml b/04spring/spring01/target/classes/applicationContext.xml deleted file mode 100644 index 3b369fc8..00000000 --- a/04spring/spring01/target/classes/applicationContext.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/04spring/spring01/target/classes/instantiate-type.xml b/04spring/spring01/target/classes/instantiate-type.xml deleted file mode 100644 index 308cbaac..00000000 --- a/04spring/spring01/target/classes/instantiate-type.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From f165a9cb4f63b7163491c9b4b5d699848b1e0e32 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Tue, 1 Dec 2020 15:45:23 +0800 Subject: [PATCH 12/22] add seventh time homework --- 05data/data-demo/.gitignore | 33 +++++++++ 05data/data-demo/pom.xml | 73 +++++++++++++++++++ .../data/datademo/DataDemoApplication.java | 15 ++++ .../datademo/annotation/DataSourceAspect.java | 44 +++++++++++ .../data/datademo/annotation/ReadOnly.java | 12 +++ .../datademo/config/DataSourceConfig.java | 44 +++++++++++ .../config/DataSourceContextHolder.java | 22 ++++++ .../datademo/config/RoutingDataSource.java | 10 +++ .../datademo/controller/OrderController.java | 2 +- .../yibing/data/datademo/entity/Order.java | 17 +++++ .../data/datademo/service/OrderService.java | 14 ++++ .../datademo/service/OrderServiceImpl.java | 47 ++++++++++++ .../src/main/resources/application.properties | 9 +++ .../src/main/resources/application.yml | 0 .../datademo/DataDemoApplicationTests.java | 13 ++++ 15 files changed, 354 insertions(+), 1 deletion(-) create mode 100644 05data/data-demo/.gitignore create mode 100644 05data/data-demo/pom.xml create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/DataDemoApplication.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/DataSourceAspect.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/ReadOnly.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceConfig.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceContextHolder.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/RoutingDataSource.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/entity/Order.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderService.java create mode 100644 05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderServiceImpl.java create mode 100644 05data/data-demo/src/main/resources/application.properties create mode 100644 05data/data-demo/src/main/resources/application.yml create mode 100644 05data/data-demo/src/test/java/com/github/yibing/data/datademo/DataDemoApplicationTests.java diff --git a/05data/data-demo/.gitignore b/05data/data-demo/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/05data/data-demo/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/05data/data-demo/pom.xml b/05data/data-demo/pom.xml new file mode 100644 index 00000000..47268ff2 --- /dev/null +++ b/05data/data-demo/pom.xml @@ -0,0 +1,73 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.6.RELEASE + + + com.github.yibing.data + data-demo + 0.0.1-SNAPSHOT + data-demo + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + org.springframework.boot + spring-boot-starter-web + + + + mysql + mysql-connector-java + 8.0.15 + + + org.aspectj + aspectjweaver + 1.9.6 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/DataDemoApplication.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/DataDemoApplication.java new file mode 100644 index 00000000..0b5d05e2 --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/DataDemoApplication.java @@ -0,0 +1,15 @@ +package com.github.yibing.data.datademo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.EnableAspectJAutoProxy; + +@SpringBootApplication +@EnableAspectJAutoProxy +public class DataDemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DataDemoApplication.class, args); + } + +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/DataSourceAspect.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/DataSourceAspect.java new file mode 100644 index 00000000..e283c65a --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/DataSourceAspect.java @@ -0,0 +1,44 @@ +package com.github.yibing.data.datademo.annotation; + +import com.github.yibing.data.datademo.config.DataSourceContextHolder; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.Signature; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.aspectj.lang.annotation.Pointcut; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.jdbc.datasource.AbstractDataSource; +import org.springframework.stereotype.Component; + +import java.lang.annotation.Annotation; +import java.lang.reflect.AnnotatedType; +import java.lang.reflect.Method; +import java.sql.Connection; +import java.sql.SQLException; + +@Aspect +@Component +public class DataSourceAspect { + + @Pointcut("@annotation(com.github.yibing.data.datademo.annotation.ReadOnly)") + public void pointcut() { + + } + + @Before("pointcut()") + public void before(JoinPoint joinPoint) { + Method method = ((MethodSignature) joinPoint.getSignature()).getMethod(); + ReadOnly annotation = method.getAnnotation(ReadOnly.class); + if (annotation != null) { + DataSourceContextHolder.switchDataSource(annotation.name()); + } + Annotation[] annotations = joinPoint.getTarget().getClass().getAnnotations(); + System.out.println(annotations); + } + + @After("pointcut()") + public void after() { + DataSourceContextHolder.clear(); + } +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/ReadOnly.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/ReadOnly.java new file mode 100644 index 00000000..4521bf2a --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/annotation/ReadOnly.java @@ -0,0 +1,12 @@ +package com.github.yibing.data.datademo.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface ReadOnly { + String name() default "slave"; +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceConfig.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceConfig.java new file mode 100644 index 00000000..8382c5e3 --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceConfig.java @@ -0,0 +1,44 @@ +package com.github.yibing.data.datademo.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.jdbc.DataSourceBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; + +import javax.sql.DataSource; +import java.util.HashMap; +import java.util.Map; + +@Configuration +public class DataSourceConfig { + + @Bean("master") + @ConfigurationProperties("spring.datasource.master") + public DataSource masterDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean("slave") + @ConfigurationProperties("spring.datasource.slave") + public DataSource slaveDataSource() { + return DataSourceBuilder.create().build(); + } + + @Bean + public RoutingDataSource routingDataSource() { + Map dataSources = new HashMap<>(); + dataSources.put("master", masterDataSource()); + dataSources.put("slave", slaveDataSource()); + RoutingDataSource routingDataSource = new RoutingDataSource(); + routingDataSource.setTargetDataSources(dataSources); + routingDataSource.setDefaultTargetDataSource(dataSources.get("master")); + return routingDataSource; + } + + @Bean + public JdbcTemplate jdbcTemplate() { + return new JdbcTemplate(routingDataSource()); + } + +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceContextHolder.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceContextHolder.java new file mode 100644 index 00000000..2cb7909a --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/DataSourceContextHolder.java @@ -0,0 +1,22 @@ +package com.github.yibing.data.datademo.config; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class DataSourceContextHolder { + + private static ThreadLocal dataSourceContext = new ThreadLocal<>(); + + public static void switchDataSource(String source) { + log.info("切换数据源为:" + source); + dataSourceContext.set(source); + } + + public static String getDataSource() { + return dataSourceContext.get(); + } + + public static void clear() { + dataSourceContext.remove(); + } +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/RoutingDataSource.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/RoutingDataSource.java new file mode 100644 index 00000000..9bae2ccd --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/config/RoutingDataSource.java @@ -0,0 +1,10 @@ +package com.github.yibing.data.datademo.config; + +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +public class RoutingDataSource extends AbstractRoutingDataSource { + @Override + protected Object determineCurrentLookupKey() { + return DataSourceContextHolder.getDataSource(); + } +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java index 88b08cde..d5e62fdb 100644 --- a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/controller/OrderController.java @@ -15,7 +15,7 @@ public class OrderController { private OrderService orderService; @GetMapping("/order/query") - public List gerOrderList() { + public List getOrderList() { return orderService.queryOrder(); } } diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/entity/Order.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/entity/Order.java new file mode 100644 index 00000000..36e19aed --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/entity/Order.java @@ -0,0 +1,17 @@ +package com.github.yibing.data.datademo.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class Order { + private String orderId; + private String userId; + private String address; + private double amount; + private int status; + private Date createTime; + private Date updateTime; + private String comment; +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderService.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderService.java new file mode 100644 index 00000000..a35f8b26 --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderService.java @@ -0,0 +1,14 @@ +package com.github.yibing.data.datademo.service; + + +import com.github.yibing.data.datademo.entity.Order; + +import java.util.List; + +public interface OrderService { + + int insertOneOrder(Order order); + int deleteOrder(Order order); + List queryOrder(); + +} diff --git a/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderServiceImpl.java b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderServiceImpl.java new file mode 100644 index 00000000..140d320f --- /dev/null +++ b/05data/data-demo/src/main/java/com/github/yibing/data/datademo/service/OrderServiceImpl.java @@ -0,0 +1,47 @@ +package com.github.yibing.data.datademo.service; + +import com.github.yibing.data.datademo.annotation.ReadOnly; +import com.github.yibing.data.datademo.entity.Order; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class OrderServiceImpl implements OrderService { + + @Autowired + private JdbcTemplate jdbcTemplate; + + + @Override + public int insertOneOrder(Order order) { + return 0; + } + + @Override + public int deleteOrder(Order order) { + return 0; + } + + @Override + @ReadOnly + public List queryOrder() { + String sql = "select * from order_memory limit 10"; + List maps = jdbcTemplate.query(sql, (rs, rowNum) -> { + Order o = new Order(); + o.setOrderId(rs.getString("order_id")); + o.setUserId(rs.getString("user_id")); + o.setAddress(rs.getString("address")); + o.setAmount(rs.getDouble("amount")); + o.setStatus(rs.getInt("status")); + o.setComment(rs.getString("comment")); + o.setCreateTime(rs.getDate("create_time")); + o.setUpdateTime(rs.getDate("update_time")); + return o; + }); + return maps; + } +} diff --git a/05data/data-demo/src/main/resources/application.properties b/05data/data-demo/src/main/resources/application.properties new file mode 100644 index 00000000..10f987af --- /dev/null +++ b/05data/data-demo/src/main/resources/application.properties @@ -0,0 +1,9 @@ +# master datasource +spring.datasource.master.jdbcUrl = jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&useSSL=false +spring.datasource.master.driver-class-name =com.mysql.cj.jdbc.Driver +spring.datasource.master.username=root + +# slave datasource +spring.datasource.slave.jdbcUrl = jdbc:mysql://localhost:3316/mall?useUnicode=true&characterEncoding=utf8&useSSL=false +spring.datasource.slave.driver-class-name= com.mysql.cj.jdbc.Driver +spring.datasource.slave.username=root diff --git a/05data/data-demo/src/main/resources/application.yml b/05data/data-demo/src/main/resources/application.yml new file mode 100644 index 00000000..e69de29b diff --git a/05data/data-demo/src/test/java/com/github/yibing/data/datademo/DataDemoApplicationTests.java b/05data/data-demo/src/test/java/com/github/yibing/data/datademo/DataDemoApplicationTests.java new file mode 100644 index 00000000..c607ba0c --- /dev/null +++ b/05data/data-demo/src/test/java/com/github/yibing/data/datademo/DataDemoApplicationTests.java @@ -0,0 +1,13 @@ +package com.github.yibing.data.datademo; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DataDemoApplicationTests { + + @Test + void contextLoads() { + } + +} From 8f67bcde86245415deb7ddff05a7bffeb2151164 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 2 Dec 2020 06:36:52 +0800 Subject: [PATCH 13/22] =?UTF-8?q?=E3=80=82=E3=80=82=E3=80=82=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 05data/data-demo/pom.xml | 12 +++++++ .../src/main/resources/application.yml | 33 +++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/05data/data-demo/pom.xml b/05data/data-demo/pom.xml index 47268ff2..1d841c98 100644 --- a/05data/data-demo/pom.xml +++ b/05data/data-demo/pom.xml @@ -44,6 +44,18 @@ org.springframework.boot spring-boot-starter-jdbc + + + org.apache.shardingsphere + sharding-jdbc-spring-boot-starter + 4.1.1 + + + + org.apache.shardingsphere + sharding-jdbc-spring-namespace + 4.1.1 + org.springframework.boot spring-boot-starter-web diff --git a/05data/data-demo/src/main/resources/application.yml b/05data/data-demo/src/main/resources/application.yml index e69de29b..73358f78 100644 --- a/05data/data-demo/src/main/resources/application.yml +++ b/05data/data-demo/src/main/resources/application.yml @@ -0,0 +1,33 @@ +spring: + shardingsphere: + props: + sql: + show: true + masterslave: + name: + master-data-source-name: + slave-data-source-names: + load-balance-algorithm-type: random + datasource: + names: master,slave0,slave1 + master: + driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/ds_master + username: root + password: + type: org.apache.commons.dbcp.BasicDataSource + + slave1: + driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3316/ds_master + username: root + password: + type: org.apache.commons.dbcp.BasicDataSource + + slave2: + driverClassName: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/ds_master + username: root + password: + type: org.apache.commons.dbcp.BasicDataSource + From f867bab3df94e56f5107fef71563334f93d0beb7 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 2 Dec 2020 17:37:04 +0800 Subject: [PATCH 14/22] add seventh time homework --- 04spring/spring01/pom.xml | 4 ++ 05data/data-demo/pom.xml | 24 +++---- .../src/main/resources/application.properties | 4 +- .../src/main/resources/application.yml | 33 --------- 05data/data-demo2/.gitignore | 33 +++++++++ 05data/data-demo2/pom.xml | 72 +++++++++++++++++++ .../data/datademo2/DataDemo2Application.java | 15 ++++ .../controller/ProductController.java | 24 +++++++ .../data/datademo2/dao/ProductMapper.java | 13 ++++ .../yibing/data/datademo2/entity/Product.java | 17 +++++ .../datademo2/service/ProductService.java | 12 ++++ .../datademo2/service/ProductServiceImpl.java | 25 +++++++ .../src/main/resources/application.yml | 38 ++++++++++ .../src/main/resources/dao/ProcuctMapper.xml | 13 ++++ .../datademo2/DataDemo2ApplicationTests.java | 13 ++++ com.github.yibing.data.datademo2 | 16 +++++ 16 files changed, 309 insertions(+), 47 deletions(-) delete mode 100644 05data/data-demo/src/main/resources/application.yml create mode 100644 05data/data-demo2/.gitignore create mode 100644 05data/data-demo2/pom.xml create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/DataDemo2Application.java create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/controller/ProductController.java create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/dao/ProductMapper.java create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/entity/Product.java create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductService.java create mode 100644 05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductServiceImpl.java create mode 100644 05data/data-demo2/src/main/resources/application.yml create mode 100644 05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml create mode 100644 05data/data-demo2/src/test/java/com/github/yibing/data/datademo2/DataDemo2ApplicationTests.java create mode 100644 com.github.yibing.data.datademo2 diff --git a/04spring/spring01/pom.xml b/04spring/spring01/pom.xml index 891e5cfa..dcb8099d 100644 --- a/04spring/spring01/pom.xml +++ b/04spring/spring01/pom.xml @@ -31,6 +31,10 @@ junit 4.12 + + org.projectlombok + lombok + diff --git a/05data/data-demo/pom.xml b/05data/data-demo/pom.xml index 1d841c98..2d4d680d 100644 --- a/05data/data-demo/pom.xml +++ b/05data/data-demo/pom.xml @@ -44,18 +44,18 @@ org.springframework.boot spring-boot-starter-jdbc - - - org.apache.shardingsphere - sharding-jdbc-spring-boot-starter - 4.1.1 - - - - org.apache.shardingsphere - sharding-jdbc-spring-namespace - 4.1.1 - + + + + + + + + + + + + org.springframework.boot spring-boot-starter-web diff --git a/05data/data-demo/src/main/resources/application.properties b/05data/data-demo/src/main/resources/application.properties index 10f987af..c19a4cea 100644 --- a/05data/data-demo/src/main/resources/application.properties +++ b/05data/data-demo/src/main/resources/application.properties @@ -1,9 +1,9 @@ # master datasource -spring.datasource.master.jdbcUrl = jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&useSSL=false +spring.datasource.master.jdbcUrl = jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.master.driver-class-name =com.mysql.cj.jdbc.Driver spring.datasource.master.username=root # slave datasource -spring.datasource.slave.jdbcUrl = jdbc:mysql://localhost:3316/mall?useUnicode=true&characterEncoding=utf8&useSSL=false +spring.datasource.slave.jdbcUrl = jdbc:mysql://localhost:3316/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai spring.datasource.slave.driver-class-name= com.mysql.cj.jdbc.Driver spring.datasource.slave.username=root diff --git a/05data/data-demo/src/main/resources/application.yml b/05data/data-demo/src/main/resources/application.yml deleted file mode 100644 index 73358f78..00000000 --- a/05data/data-demo/src/main/resources/application.yml +++ /dev/null @@ -1,33 +0,0 @@ -spring: - shardingsphere: - props: - sql: - show: true - masterslave: - name: - master-data-source-name: - slave-data-source-names: - load-balance-algorithm-type: random - datasource: - names: master,slave0,slave1 - master: - driverClassName: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/ds_master - username: root - password: - type: org.apache.commons.dbcp.BasicDataSource - - slave1: - driverClassName: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3316/ds_master - username: root - password: - type: org.apache.commons.dbcp.BasicDataSource - - slave2: - driverClassName: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/ds_master - username: root - password: - type: org.apache.commons.dbcp.BasicDataSource - diff --git a/05data/data-demo2/.gitignore b/05data/data-demo2/.gitignore new file mode 100644 index 00000000..549e00a2 --- /dev/null +++ b/05data/data-demo2/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/05data/data-demo2/pom.xml b/05data/data-demo2/pom.xml new file mode 100644 index 00000000..f612dce8 --- /dev/null +++ b/05data/data-demo2/pom.xml @@ -0,0 +1,72 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.4.0 + + + com.github.yibing.data + data-demo2 + 0.0.1-SNAPSHOT + data-demo2 + Demo project for Spring Boot + + + 1.8 + 4.1.1 + + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + mysql + mysql-connector-java + 5.1.49 + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.apache.shardingsphere + sharding-jdbc-spring-boot-starter + ${sharding-sphere.version} + + + + + org.apache.shardingsphere + sharding-jdbc-spring-namespace + ${sharding-sphere.version} + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/DataDemo2Application.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/DataDemo2Application.java new file mode 100644 index 00000000..a6714d31 --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/DataDemo2Application.java @@ -0,0 +1,15 @@ +package com.github.yibing.data.datademo2; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan("com.github.yibing.data.datademo2.dao") +public class DataDemo2Application { + + public static void main(String[] args) { + SpringApplication.run(DataDemo2Application.class, args); + } + +} diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/controller/ProductController.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/controller/ProductController.java new file mode 100644 index 00000000..bb0dbbca --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/controller/ProductController.java @@ -0,0 +1,24 @@ +package com.github.yibing.data.datademo2.controller; + +import com.github.yibing.data.datademo2.entity.Product; +import com.github.yibing.data.datademo2.service.ProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class ProductController { + @Autowired + private ProductService productService; + + @GetMapping("/product/queryAll") + public List listProducts(){ + return productService.listProducts(); + } + + @PostMapping("/product/save") + public int saveProduct(@RequestBody Product product){ + return productService.save(product); + } +} diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/dao/ProductMapper.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/dao/ProductMapper.java new file mode 100644 index 00000000..8196866e --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/dao/ProductMapper.java @@ -0,0 +1,13 @@ +package com.github.yibing.data.datademo2.dao; + +import com.github.yibing.data.datademo2.entity.Product; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface ProductMapper { + List listProducts(); + + int insert(Product product); +} diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/entity/Product.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/entity/Product.java new file mode 100644 index 00000000..acdcdbb4 --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/entity/Product.java @@ -0,0 +1,17 @@ +package com.github.yibing.data.datademo2.entity; + +import lombok.Data; + +import java.util.Date; + +@Data +public class Product { + private String productId; + private double price; + private String productName; + private Date createTime; + private Date updateTime; + private String description; + private String productType; + private Integer status; +} diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductService.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductService.java new file mode 100644 index 00000000..bc1d8bcf --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductService.java @@ -0,0 +1,12 @@ +package com.github.yibing.data.datademo2.service; + +import com.github.yibing.data.datademo2.entity.Product; + +import java.util.List; + +public interface ProductService { + + List listProducts(); + + int save(Product product); +} diff --git a/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductServiceImpl.java b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductServiceImpl.java new file mode 100644 index 00000000..7f54da21 --- /dev/null +++ b/05data/data-demo2/src/main/java/com/github/yibing/data/datademo2/service/ProductServiceImpl.java @@ -0,0 +1,25 @@ +package com.github.yibing.data.datademo2.service; + +import com.github.yibing.data.datademo2.dao.ProductMapper; +import com.github.yibing.data.datademo2.entity.Product; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class ProductServiceImpl implements ProductService { + + @Resource + private ProductMapper productMapper; + + @Override + public List listProducts() { + return productMapper.listProducts(); + } + + @Override + public int save(Product product) { + return productMapper.insert(product); + } +} diff --git a/05data/data-demo2/src/main/resources/application.yml b/05data/data-demo2/src/main/resources/application.yml new file mode 100644 index 00000000..1c0f1ad4 --- /dev/null +++ b/05data/data-demo2/src/main/resources/application.yml @@ -0,0 +1,38 @@ +spring: + shardingsphere: + datasource: + names: master,slave1 + master: + driver-class-name: com.mysql.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + jdbcUrl: jdbc:mysql://localhost:3311/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + slave1: + driver-class-name: com.mysql.jdbc.Driver + type: com.zaxxer.hikari.HikariDataSource + jdbcUrl: jdbc:mysql://localhost:3316/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai + username: root + masterslave: + master-data-source-name: master + slave-data-source-names: slave1 + load-balance-algorithm-type: random + props: + sql: + show: true + enabled: true + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + + +mybatis: + configuration: + map-underscore-to-camel-case: true + type-aliases-package: com.github.yibing.data.datademo2.entity + mapper-locations: classpath:dao/*.xml +server: + port: 8088 +logging: + level: + com.github.yibing.data.datademo2: debug + diff --git a/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml b/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml new file mode 100644 index 00000000..5da9bc52 --- /dev/null +++ b/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml @@ -0,0 +1,13 @@ + + + + + + + insert into product(product_id,price,product_name,create_time,update_time,description,product_type,status) + values(#{productId},#{price},#{productName},#{createTime},#{updateTime},#{description},#{productType},#{status}) + + + \ No newline at end of file diff --git a/05data/data-demo2/src/test/java/com/github/yibing/data/datademo2/DataDemo2ApplicationTests.java b/05data/data-demo2/src/test/java/com/github/yibing/data/datademo2/DataDemo2ApplicationTests.java new file mode 100644 index 00000000..74ceff36 --- /dev/null +++ b/05data/data-demo2/src/test/java/com/github/yibing/data/datademo2/DataDemo2ApplicationTests.java @@ -0,0 +1,13 @@ +package com.github.yibing.data.datademo2; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DataDemo2ApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/com.github.yibing.data.datademo2 b/com.github.yibing.data.datademo2 new file mode 100644 index 00000000..b599e1dd --- /dev/null +++ b/com.github.yibing.data.datademo2 @@ -0,0 +1,16 @@ +2020-12-02 17:30:17.670 ERROR 14048 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Failed to bind properties under 'logging.level' to java.util.Map: + + Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map] + +Action: + +Update your application's configuration + From c92f84afb99baf1d324607e5099c743a1b081379 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 2 Dec 2020 23:27:18 +0800 Subject: [PATCH 15/22] commit my homework for week 7 --- .../java/com/github/yibing/jdbc/DBUtils.java | 2 +- .../java/com/github/yibing/jdbc/JdbcDemo.java | 8 ++--- 05data/data-demo2/pom.xml | 23 +++++++------ .../src/main/resources/application.yml | 32 ++++++++++++------- .../src/main/resources/dao/ProcuctMapper.xml | 14 ++++++-- 5 files changed, 49 insertions(+), 30 deletions(-) diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java index 19199070..cd8c23ea 100644 --- a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/DBUtils.java @@ -9,7 +9,7 @@ public class DBUtils { private static final String driver = "com.mysql.jdbc.Driver"; private static final String url = "jdbc:mysql://localhost:3306/student?&serverTimezone=Asia/Shanghai"; private static final String username = "root"; - private static final String password = "123456"; + private static final String password = ""; private static Connection connection = null; public static Connection getConnection() { diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java index 10e6bd09..1e12a172 100644 --- a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java @@ -96,7 +96,7 @@ public void updateOne() { @Test public void batchInsert() { ArrayList list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { + for (int i = 0; i < 100000; i++) { list.add(new Student("student" + i)); } // 使用 JDBC @@ -109,11 +109,7 @@ public void batchInsert() { psmt = connection.prepareStatement(sql); connection.setAutoCommit(false); for (int i = 0; i < list.size(); i++) { - if (i == 5) { - psmt.setString(1, "sssssssssssssssssssssssssssssssssssssssssssssssssssssss"); - } else { - psmt.setString(1, list.get(i).getName()); - } + psmt.setString(1, list.get(i).getName()); psmt.executeUpdate(); } connection.commit(); diff --git a/05data/data-demo2/pom.xml b/05data/data-demo2/pom.xml index f612dce8..3e4ddc96 100644 --- a/05data/data-demo2/pom.xml +++ b/05data/data-demo2/pom.xml @@ -41,18 +41,23 @@ spring-boot-starter-test test - - - org.apache.shardingsphere - sharding-jdbc-spring-boot-starter - ${sharding-sphere.version} - + + + + + + - + + + + + + org.apache.shardingsphere - sharding-jdbc-spring-namespace - ${sharding-sphere.version} + shardingsphere-jdbc-core-spring-boot-starter + 5.0.0-alpha org.springframework.boot diff --git a/05data/data-demo2/src/main/resources/application.yml b/05data/data-demo2/src/main/resources/application.yml index 1c0f1ad4..6b3748cc 100644 --- a/05data/data-demo2/src/main/resources/application.yml +++ b/05data/data-demo2/src/main/resources/application.yml @@ -1,25 +1,33 @@ spring: shardingsphere: datasource: - names: master,slave1 - master: - driver-class-name: com.mysql.jdbc.Driver + common: type: com.zaxxer.hikari.HikariDataSource - jdbcUrl: jdbc:mysql://localhost:3311/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.jdbc.Driver username: root + names: master,slave1,slave2 + master: + jdbcUrl: jdbc:mysql://localhost:3306/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai slave1: - driver-class-name: com.mysql.jdbc.Driver - type: com.zaxxer.hikari.HikariDataSource jdbcUrl: jdbc:mysql://localhost:3316/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai - username: root - masterslave: - master-data-source-name: master - slave-data-source-names: slave1 - load-balance-algorithm-type: random + slave2: + jdbcUrl: jdbc:mysql://localhost:3317/mall?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai props: sql: show: true enabled: true + rules: + replica-query: + load-balancers: + round-robin: + type: ROUND_ROBIN + props: + workid: 123 + datasources: + ps_ds: + primary-data-source-name: master + replica-data-source-names: slave1,slave2 + load-balancer-name: round_robin jackson: time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss @@ -31,7 +39,7 @@ mybatis: type-aliases-package: com.github.yibing.data.datademo2.entity mapper-locations: classpath:dao/*.xml server: - port: 8088 + port: 8086 logging: level: com.github.yibing.data.datademo2: debug diff --git a/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml b/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml index 5da9bc52..350a62d6 100644 --- a/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml +++ b/05data/data-demo2/src/main/resources/dao/ProcuctMapper.xml @@ -1,8 +1,18 @@ - + select product_id,price,product_name,create_time,update_time,description,product_type,status from product From 8368a4ce7c7e66f4699ed5ecbe591d092f5c3973 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Wed, 9 Dec 2020 10:02:05 +0800 Subject: [PATCH 16/22] add my practice --- .../yibing/spring/strategy/Context.java | 13 ++ .../yibing/spring/strategy/OperationAdd.java | 8 + .../spring/strategy/OperationMultiply.java | 8 + .../spring/strategy/OperationSubtract.java | 8 + .../yibing/spring/strategy/Strategy.java | 5 + .../yibing/spring/strategy/StrategyDemo.java | 10 ++ .../yibing/spring/stream/StreamDemo2.java | 158 ++++++++++++++++++ 04spring/springboot01/pom.xml | 14 ++ .../springboot01/config/RabbitConfig.java | 14 ++ .../springboot01/consumer/Consumer.java | 28 ++++ .../consumer/ConsumerServiceImpl.java | 14 ++ .../consumer/ConsumerServiceImpl2.java | 14 ++ .../controller/ProducerController.java | 24 +++ .../springboot01/producer/Producer.java | 22 +++ .../springboot01/util/MqConnectionUtil.java | 30 ++++ .../src/main/resources/application.yml | 7 + 16 files changed, 377 insertions(+) create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java create mode 100644 04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/config/RabbitConfig.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/Consumer.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl2.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/controller/ProducerController.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/producer/Producer.java create mode 100644 04spring/springboot01/src/main/java/com/github/yibing/springboot01/util/MqConnectionUtil.java create mode 100644 04spring/springboot01/src/main/resources/application.yml diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java new file mode 100644 index 00000000..5401bdbd --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Context.java @@ -0,0 +1,13 @@ +package org.github.yibing.spring.strategy; + +public class Context { + private Strategy strategy; + + public Context(Strategy strategy) { + this.strategy = strategy; + } + + public int executeStrategy(int num1, int num2) { + return strategy.doOperation(num1, num2); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java new file mode 100644 index 00000000..3ce80f93 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationAdd.java @@ -0,0 +1,8 @@ +package org.github.yibing.spring.strategy; + +public class OperationAdd implements Strategy { + @Override + public int doOperation(int num1, int num2) { + return num1 + num2; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java new file mode 100644 index 00000000..d20e7de0 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationMultiply.java @@ -0,0 +1,8 @@ +package org.github.yibing.spring.strategy; + +public class OperationMultiply implements Strategy { + @Override + public int doOperation(int num1, int num2) { + return num1 * num2; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java new file mode 100644 index 00000000..153870c6 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/OperationSubtract.java @@ -0,0 +1,8 @@ +package org.github.yibing.spring.strategy; + +public class OperationSubtract implements Strategy { + @Override + public int doOperation(int num1, int num2) { + return num1 + num2; + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java new file mode 100644 index 00000000..f23e0eb5 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/Strategy.java @@ -0,0 +1,5 @@ +package org.github.yibing.spring.strategy; + +public interface Strategy { + public int doOperation(int num1, int num2); +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java new file mode 100644 index 00000000..8c2e7cc7 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/strategy/StrategyDemo.java @@ -0,0 +1,10 @@ +package org.github.yibing.spring.strategy; + +public class StrategyDemo { + public static void main(String[] args) { + Context context = new Context(new OperationAdd()); + System.out.println("10+6=" + context.executeStrategy(10, 6)); + context = new Context(new OperationSubtract()); + System.out.println("10-6=" + context.executeStrategy(10, 6)); + } +} diff --git a/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java new file mode 100644 index 00000000..698e2f40 --- /dev/null +++ b/04spring/spring01/src/main/java/org/github/yibing/spring/stream/StreamDemo2.java @@ -0,0 +1,158 @@ +package org.github.yibing.spring.stream; + +import org.junit.Test; + +import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class StreamDemo2 { + static List emps = Arrays.asList(new Employee(101, "张三", 28, 9999d), + new Employee(101, "李四", 49, 666d), + new Employee(102, "王五", 38, 333d), + new Employee(103, "赵六", 12, 7777d), + new Employee(104, "田七", 6, 222d) + ); + + public static void main(String[] args) { + /* + * 创建stream的三种方式 + */ + //1.集合 list.stream(), + Stream stream = emps.stream(); + Employee[] array = (Employee[]) emps.toArray(); + // 2.数组 Arrays.stream(array) + Stream stream1 = Arrays.stream(array); + // 3.Stream.of(T) + Stream> stream2 = Stream.of(StreamDemo2.emps); + + + } + + /** + * 中间操作: + * 筛选 filter() + * 去重 distinct() + * 取前面几条/跳过前面几条 limit()/skip() + */ + + @Test + public void test1() { + //中间操作------筛选 + emps.stream().filter((e) -> e.getAge() > 30).forEach(e -> System.out.println(e.getAge())); + // 取前面几条 + emps.stream().filter(e -> e.getId() > 101).limit(3).forEach(System.out::println); + // 需要重写hashcode()和equals 才能去重 + emps.stream().distinct().forEach(System.out::println); + } + + /** + * 中间操作: + * 映射,把集合中每个元素按照function映射为对应的类型 + */ + @Test + public void test2() { + // 把每个元素按照function转换成相应类型,输出 还有mapToInteger,mapToLong等方法 + emps.stream().mapToDouble(Employee::getId).forEach(System.out::println); + List strList = Arrays.asList("a", "b", "c", "d"); + /* + flapMap和map,传入同一个返回流的function,flatMap可以把所有流连成一个流 + */ + Stream rStream = strList.stream().flatMap(StreamDemo2::filterCharacter); + rStream.forEach(System.out::println); + + Stream> stream = strList.stream().map(StreamDemo2::filterCharacter); + stream.forEach(sm -> sm.forEach(System.out::print)); + } + + public static Stream filterCharacter(String str) { + List list = new ArrayList<>(); + for (Character ch : str.toCharArray()) { + list.add(ch); + } + return list.stream(); + } + + /** + * 中间操作: + * sorted() 默认顺序排序,引用类型要实现Comparable + * sorted(Comparator comp) 带参数,指定排序规则 + */ + @Test + public void test3() { + // 把每个emps映射为属性:name,组成一个新流,然后按name排序输出 + emps.stream().map(Employee::getName).sorted().forEach(System.out::println); + // 带参数的sorted,按照年龄排序,若相等就比较名字 + emps.stream().sorted((x, y) -> { + if (x.getAge() == y.getAge()) { + return x.getName().compareTo(y.getName()); + } else { + return Integer.compare(x.getAge(), y.getAge()); + } + }).forEach(System.out::println); + } + + + /** + * 终止操作: 查找与匹配,返回boolean + * allMatch(),所有元素都匹配才返回true + * anyMatch(),只要有一个或多个元素匹配就返回true + * noneMatch(),都不匹配就返回true,否则false + */ + @Test + public void test4() { + // 每个员工的名字都包含三 ,才返回true + boolean b = emps.stream().allMatch(e -> e.getName().contains("三")); + System.out.println(b); + boolean b1 = emps.stream().noneMatch(e -> e.getName().contains("九")); + System.out.println(b1); + + } + + /** + * 终止操作:查找与匹配:返回元素 + * findFirst:返回第一个Optional<> + * findAny:返回任意一个元素Optional<> + * count 返回元素个数 + * max 返回最大值 + * min 返回最小值 + */ + + @Test + public void test5() { + Optional first = emps.stream().findFirst(); + System.out.println(first.get()); + long count = emps.stream().count(); + System.out.println(count); + } + + + /** + * 终止操作:规约reduce,将每个元素结合起来,得到一个值 + * reduce(BinaryOperator b) + * reduce(T iden,BinaryOperator b) 返回Optional + */ + @Test + public void test6() { + // 规约,先转化成年龄集合,然后给他们求和 + Optional sum = emps.stream().map(Employee::getAge).reduce(Integer::sum); + System.out.println(sum.get()); + // 从 1 相加,相当于该集合多了一个 1求和 + Integer sum1 = emps.stream().map(Employee::getAge).reduce(1, Integer::sum); + System.out.println(sum1); + } + + /** + * 终止操作:收集 + * 转换成lit、set、Collection + * 求和,求平均数 + */ + @Test + public void test7() { + Set set = emps.stream().collect(Collectors.toSet()); + System.out.println(set); + List list = emps.stream().collect(Collectors.toList()); + Double salarySum = emps.stream().collect(Collectors.summingDouble(Employee::getSalary)); + + } +} diff --git a/04spring/springboot01/pom.xml b/04spring/springboot01/pom.xml index 63156d4f..dedb6402 100644 --- a/04spring/springboot01/pom.xml +++ b/04spring/springboot01/pom.xml @@ -39,6 +39,20 @@ spring-boot-starter-test test + + + + + + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.boot + spring-boot-starter-web + diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/config/RabbitConfig.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/config/RabbitConfig.java new file mode 100644 index 00000000..c2aeca78 --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/config/RabbitConfig.java @@ -0,0 +1,14 @@ +package com.github.yibing.springboot01.config; + +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + @Bean + public Queue queue() { + return new Queue("q_test_1"); + } +} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/Consumer.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/Consumer.java new file mode 100644 index 00000000..48a24c51 --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/Consumer.java @@ -0,0 +1,28 @@ +//package com.github.yibing.springboot01.consumer; +// +//import com.github.yibing.springboot01.util.MqConnectionUtil; +//import com.rabbitmq.client.Channel; +//import com.rabbitmq.client.Connection; +//import com.rabbitmq.client.QueueingConsumer; +// +//import java.io.IOException; +// +//public class Consumer { +// public static void main(String[] args) throws IOException, InterruptedException { +// Connection connection = MqConnectionUtil.getConnection(); +// Channel channel = connection.createChannel(); +// // 声明队列 +// channel.queueDeclare("q_test_1", false, false, false, null); +// // 创建消费队列 +// QueueingConsumer consumer = new QueueingConsumer(channel); +// // 消费消息 +// channel.basicConsume("q_test_1", consumer); +// // 转换消费的消息 +// while (true) { +// QueueingConsumer.Delivery delivery = consumer.nextDelivery(); +// String message = new String(delivery.getBody()); +// System.out.println("收到消息:" + message); +// } +// +// } +//} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl.java new file mode 100644 index 00000000..8bc43d7c --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl.java @@ -0,0 +1,14 @@ +package com.github.yibing.springboot01.consumer; + +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Service; + +@Service("service_1") +@RabbitListener(queues = "q_test_1") +public class ConsumerServiceImpl { + @RabbitHandler + public void getMessage(String message) { + System.out.println("1" + message); + } +} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl2.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl2.java new file mode 100644 index 00000000..2ec35d23 --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/consumer/ConsumerServiceImpl2.java @@ -0,0 +1,14 @@ +package com.github.yibing.springboot01.consumer; + +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Service; + +@Service("service_2") +public class ConsumerServiceImpl2 { + @RabbitListener(queues = "q_test_1") + @RabbitHandler + public void getMessage(String message) { + System.out.println("2" + message); + } +} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/controller/ProducerController.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/controller/ProducerController.java new file mode 100644 index 00000000..92dd922a --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/controller/ProducerController.java @@ -0,0 +1,24 @@ +package com.github.yibing.springboot01.controller; + +import org.springframework.amqp.core.AmqpTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.text.SimpleDateFormat; +import java.util.Date; + +@RestController +public class ProducerController { + + @Autowired + private AmqpTemplate amqpTemplate; + + @RequestMapping("/send") + public String send() { + String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + String context = "hello" + date; + amqpTemplate.convertAndSend(context); + return context; + } +} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/producer/Producer.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/producer/Producer.java new file mode 100644 index 00000000..387e2918 --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/producer/Producer.java @@ -0,0 +1,22 @@ +//package com.github.yibing.springboot01.producer; +// +//import com.github.yibing.springboot01.util.MqConnectionUtil; +//import com.rabbitmq.client.Channel; +//import com.rabbitmq.client.Connection; +// +//import java.io.IOException; +// +//public class Producer { +// public static void main(String[] args) throws IOException { +// Connection connection = MqConnectionUtil.getConnection(); +// Channel channel = connection.createChannel(); +// // 声明队列 +// channel.queueDeclare("q_test_1", false, false, false, null); +// // 发送消息 +// channel.basicPublish("", "q_test_1", null, "hello a".getBytes()); +// // 关闭通道 +// channel.close(); +// // 关闭通道 +// connection.close(); +// } +//} diff --git a/04spring/springboot01/src/main/java/com/github/yibing/springboot01/util/MqConnectionUtil.java b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/util/MqConnectionUtil.java new file mode 100644 index 00000000..33e21b63 --- /dev/null +++ b/04spring/springboot01/src/main/java/com/github/yibing/springboot01/util/MqConnectionUtil.java @@ -0,0 +1,30 @@ +package com.github.yibing.springboot01.util; + +import java.util.HashMap; + +// +//import com.rabbitmq.client.Connection; +//import com.rabbitmq.client.ConnectionFactory; +// +//import java.io.IOException; +// +public class MqConnectionUtil { +// +// public static Connection getConnection() throws IOException { +// ConnectionFactory factory = new ConnectionFactory(); +// factory.setHost("localhost"); +// factory.setPort(5672); +// factory.setUsername("guest"); +// factory.setPassword("guest"); +// factory.setVirtualHost("testHost"); +// return factory.newConnection(); +// } + + + public static void main(String[] args) { + HashMap hashMap = new HashMap<>(80); + hashMap.put("0",0); + hashMap.put("1",1); + hashMap.put("2",2); + } +} diff --git a/04spring/springboot01/src/main/resources/application.yml b/04spring/springboot01/src/main/resources/application.yml new file mode 100644 index 00000000..26aca95a --- /dev/null +++ b/04spring/springboot01/src/main/resources/application.yml @@ -0,0 +1,7 @@ +spring: + rabbitmq: + host: localhost + password: guest + username: guest + virtual-host: testHost + port: 5672 \ No newline at end of file From d51f66650514e2f813c8b327f96f2aafb28ab9c2 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Sat, 30 Jan 2021 10:58:13 +0800 Subject: [PATCH 17/22] homework week08 --- .gitignore | 3 +- .../java/com/github/yibing/jdbc/JdbcDemo.java | 2 +- 05data/data-demo3/pom.xml | 50 +++++++++++++++ .../java/org/database/demo/Application.java | 13 ++++ .../java/org/database/demo/dao/OrderDao.java | 10 +++ .../java/org/database/demo/entity/Order.java | 24 +++++++ .../org/database/demo/utils/JdbcTest.java | 62 +++++++++++++++++++ .../src/main/resources/application.properties | 8 +++ .../src/main/resources/mapper/OrderMapper.xml | 7 +++ .../src/main/resources/mybatis-config.xml | 14 +++++ .../java/org/database/demo/dao/OrderTest.java | 25 ++++++++ .../target/classes/application.properties | 8 +++ .../target/classes/mapper/OrderMapper.xml | 7 +++ .../target/classes/mybatis-config.xml | 14 +++++ 14 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 05data/data-demo3/pom.xml create mode 100644 05data/data-demo3/src/main/java/org/database/demo/Application.java create mode 100644 05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java create mode 100644 05data/data-demo3/src/main/java/org/database/demo/entity/Order.java create mode 100644 05data/data-demo3/src/main/java/org/database/demo/utils/JdbcTest.java create mode 100644 05data/data-demo3/src/main/resources/application.properties create mode 100644 05data/data-demo3/src/main/resources/mapper/OrderMapper.xml create mode 100644 05data/data-demo3/src/main/resources/mybatis-config.xml create mode 100644 05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java create mode 100644 05data/data-demo3/target/classes/application.properties create mode 100644 05data/data-demo3/target/classes/mapper/OrderMapper.xml create mode 100644 05data/data-demo3/target/classes/mybatis-config.xml diff --git a/.gitignore b/.gitignore index 966499f4..fd45e616 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* *.iml -*.idea/ \ No newline at end of file +*.idea/ +*target \ No newline at end of file diff --git a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java index 1e12a172..c8b0aefc 100644 --- a/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java +++ b/04spring/jdbc/src/main/java/com/github/yibing/jdbc/JdbcDemo.java @@ -95,7 +95,7 @@ public void updateOne() { // 批量插入 @Test public void batchInsert() { - ArrayList list = new ArrayList<>(); + ArrayList list = new ArrayList(); for (int i = 0; i < 100000; i++) { list.add(new Student("student" + i)); } diff --git a/05data/data-demo3/pom.xml b/05data/data-demo3/pom.xml new file mode 100644 index 00000000..44045834 --- /dev/null +++ b/05data/data-demo3/pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + org.example + data-demo3 + 1.0-SNAPSHOT + + + 8 + 8 + 5.0.0.RELEASE + + + + + mysql + mysql-connector-java + 5.1.49 + + + org.springframework.boot + spring-boot-starter + 2.4.0 + + + org.springframework.boot + spring-boot-starter-web + 2.4.0 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + org.projectlombok + lombok + 1.18.16 + + + org.springframework.boot + spring-boot-starter-test + 2.4.0 + + + + \ No newline at end of file diff --git a/05data/data-demo3/src/main/java/org/database/demo/Application.java b/05data/data-demo3/src/main/java/org/database/demo/Application.java new file mode 100644 index 00000000..04df661e --- /dev/null +++ b/05data/data-demo3/src/main/java/org/database/demo/Application.java @@ -0,0 +1,13 @@ +package org.database.demo; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@MapperScan(basePackages = "org.database.demo.dao") +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class,args); + } +} diff --git a/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java b/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java new file mode 100644 index 00000000..780350a2 --- /dev/null +++ b/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java @@ -0,0 +1,10 @@ +package org.database.demo.dao; + +import org.database.demo.entity.Order; +import org.springframework.stereotype.Repository; + +@Repository +public interface OrderDao { + + int insertOne(Order order); +} diff --git a/05data/data-demo3/src/main/java/org/database/demo/entity/Order.java b/05data/data-demo3/src/main/java/org/database/demo/entity/Order.java new file mode 100644 index 00000000..33c7bf61 --- /dev/null +++ b/05data/data-demo3/src/main/java/org/database/demo/entity/Order.java @@ -0,0 +1,24 @@ +package org.database.demo.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Order { + private Integer id; + private Integer userId; + private String commodities; + private Integer status; + private String deliverStatus; + private Integer totalPrice; + private Integer createTime; + private Integer updateTime; + + public Order(Integer id, Integer userId) { + this.id = id; + this.userId = userId; + } +} diff --git a/05data/data-demo3/src/main/java/org/database/demo/utils/JdbcTest.java b/05data/data-demo3/src/main/java/org/database/demo/utils/JdbcTest.java new file mode 100644 index 00000000..708548d3 --- /dev/null +++ b/05data/data-demo3/src/main/java/org/database/demo/utils/JdbcTest.java @@ -0,0 +1,62 @@ +package org.database.demo.utils; + +import java.sql.*; +import java.util.Objects; +import java.util.UUID; +import java.util.stream.IntStream; + +public class JdbcTest { + private static String driver = "com.mysql.jdbc.Driver"; + private static String url = "jdbc:mysql://localhost:3307/sharding_db?useUnicode=true&characterEncoding=utf-8&useServerPrepStmts=true&cachePrepStmts=true"; + private static String username = "root"; + private static String password = "root"; + + public static void insertUsePrepare() throws SQLException { + long start = System.currentTimeMillis(); + for (int i = 0; i < 1000; i++) { + String sql = "insert into t_order (user_id,commodities,status,deliver_status,total_price,create_time,update_time)" + + "values ("; + String[] strings = UUID.randomUUID().toString().split("-"); + sql = sql+(i)+",'"+strings[0]+"',"+(i+1)+",'"+strings[2]+"',"+(i+2)+","+(i+3)+","+(i+4)+")"; + Objects.requireNonNull(getConn()).createStatement().execute(sql); + } + long end = System.currentTimeMillis(); + System.out.println("方式一耗时:" + (end-start)); + } + + public static void insertUsePrepareBatch() throws SQLException { + long start = System.currentTimeMillis(); + String sql = "insert into orders (user_id,commodities,status,deliver_status,total_price,create_time,update_time)" + + "values (?,?,?,?,?,?,?)"; + + PreparedStatement prepareStatement = Objects.requireNonNull(getConn()).prepareStatement(sql); + for (int i = 0; i < 1000000; i++) { + String[] strings = UUID.randomUUID().toString().split("-"); + prepareStatement.setInt(1,i); + prepareStatement.setString(2,strings[0]); + prepareStatement.setInt(3,i+1); + prepareStatement.setString(4,strings[0]); + prepareStatement.setInt(5,i+2); + prepareStatement.setInt(6,i+3); + prepareStatement.setInt(7,i+4); + prepareStatement.addBatch(); + } + prepareStatement.execute(); + long end = System.currentTimeMillis(); + System.out.println("方式一耗时:" + (end-start)); + } + + private static Connection getConn() { + try { + Class.forName(driver); + return DriverManager.getConnection(url, username, password); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + public static void main(String[] args) throws SQLException { + insertUsePrepare(); + } +} diff --git a/05data/data-demo3/src/main/resources/application.properties b/05data/data-demo3/src/main/resources/application.properties new file mode 100644 index 00000000..3c87d69b --- /dev/null +++ b/05data/data-demo3/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3307/sharding_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true +spring.datasource.password=root +spring.datasource.username=root + +mybatis.mapper-locations=classpath:mapper/*.xml +mybatis.type-aliases-package=org.database.demo.entity + diff --git a/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml b/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml new file mode 100644 index 00000000..f577f47a --- /dev/null +++ b/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml @@ -0,0 +1,7 @@ + + + + + insert into t_order (id,user_id) values (#{id},#{userId}) + + \ No newline at end of file diff --git a/05data/data-demo3/src/main/resources/mybatis-config.xml b/05data/data-demo3/src/main/resources/mybatis-config.xml new file mode 100644 index 00000000..3544795f --- /dev/null +++ b/05data/data-demo3/src/main/resources/mybatis-config.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java b/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java new file mode 100644 index 00000000..2ec8a590 --- /dev/null +++ b/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java @@ -0,0 +1,25 @@ +package org.database.demo.dao; + +import org.database.demo.dao.OrderDao; +import org.database.demo.entity.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@SpringBootTest +@ExtendWith(SpringExtension.class) +@MapperScan(basePackages = "org.database.demo.dao") +public class OrderTest { + + @Autowired + private OrderDao orderDao; + + @Test + public void test(){ + Order order = new Order(1, 1); + int num = orderDao.insertOne(order); + } +} diff --git a/05data/data-demo3/target/classes/application.properties b/05data/data-demo3/target/classes/application.properties new file mode 100644 index 00000000..3c87d69b --- /dev/null +++ b/05data/data-demo3/target/classes/application.properties @@ -0,0 +1,8 @@ +spring.datasource.driver-class-name=com.mysql.jdbc.Driver +spring.datasource.url=jdbc:mysql://localhost:3307/sharding_db?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true +spring.datasource.password=root +spring.datasource.username=root + +mybatis.mapper-locations=classpath:mapper/*.xml +mybatis.type-aliases-package=org.database.demo.entity + diff --git a/05data/data-demo3/target/classes/mapper/OrderMapper.xml b/05data/data-demo3/target/classes/mapper/OrderMapper.xml new file mode 100644 index 00000000..f577f47a --- /dev/null +++ b/05data/data-demo3/target/classes/mapper/OrderMapper.xml @@ -0,0 +1,7 @@ + + + + + insert into t_order (id,user_id) values (#{id},#{userId}) + + \ No newline at end of file diff --git a/05data/data-demo3/target/classes/mybatis-config.xml b/05data/data-demo3/target/classes/mybatis-config.xml new file mode 100644 index 00000000..3544795f --- /dev/null +++ b/05data/data-demo3/target/classes/mybatis-config.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file From bc2fdb6389ad33378beae83e490adcbeb86fcd7c Mon Sep 17 00:00:00 2001 From: wangyibing Date: Sun, 7 Mar 2021 07:50:21 +0800 Subject: [PATCH 18/22] add code --- 04spring/jdbc/pom.xml | 12 +++++++++ .../java/org/database/demo/dao/OrderDao.java | 7 ++++++ .../src/main/resources/mapper/OrderMapper.xml | 25 +++++++++++++++++++ .../java/org/database/demo/dao/OrderTest.java | 15 +++++++++-- .../target/classes/mapper/OrderMapper.xml | 14 +++++++++++ 5 files changed, 71 insertions(+), 2 deletions(-) diff --git a/04spring/jdbc/pom.xml b/04spring/jdbc/pom.xml index 2c4ff10c..2f8ec41c 100644 --- a/04spring/jdbc/pom.xml +++ b/04spring/jdbc/pom.xml @@ -7,6 +7,18 @@ jdbc jdbc-demo 1.0-SNAPSHOT + + + + org.apache.maven.plugins + maven-compiler-plugin + + 7 + 7 + + + + mysql diff --git a/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java b/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java index 780350a2..04e8373d 100644 --- a/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java +++ b/05data/data-demo3/src/main/java/org/database/demo/dao/OrderDao.java @@ -3,8 +3,15 @@ import org.database.demo.entity.Order; import org.springframework.stereotype.Repository; +import java.util.HashMap; +import java.util.List; + @Repository public interface OrderDao { int insertOne(Order order); + + List> query(HashMap condition); + + int update(Order order); } diff --git a/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml b/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml index f577f47a..d3090f24 100644 --- a/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml +++ b/05data/data-demo3/src/main/resources/mapper/OrderMapper.xml @@ -1,7 +1,32 @@ + + id,user_id + insert into t_order (id,user_id) values (#{id},#{userId}) + + update t_order set + + + id = #{id} + + + and user_id = #{user_id} + + + + \ No newline at end of file diff --git a/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java b/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java index 2ec8a590..314c9422 100644 --- a/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java +++ b/05data/data-demo3/src/test/java/org/database/demo/dao/OrderTest.java @@ -4,11 +4,15 @@ import org.database.demo.entity.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.internal.matchers.Or; import org.mybatis.spring.annotation.MapperScan; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; +import java.util.HashMap; +import java.util.List; + @SpringBootTest @ExtendWith(SpringExtension.class) @MapperScan(basePackages = "org.database.demo.dao") @@ -19,7 +23,14 @@ public class OrderTest { @Test public void test(){ - Order order = new Order(1, 1); - int num = orderDao.insertOne(order); +// Order order = new Order(1, 2); +// int num = orderDao.insertOne(order); + + HashMap condition = new HashMap<>(1); + condition.put("user_id",1); + List> list = orderDao.query(condition); + list.forEach(System.out::println); + Order order = new Order(1, 3); + int num1 = orderDao.update(order); } } diff --git a/05data/data-demo3/target/classes/mapper/OrderMapper.xml b/05data/data-demo3/target/classes/mapper/OrderMapper.xml index f577f47a..4f947e67 100644 --- a/05data/data-demo3/target/classes/mapper/OrderMapper.xml +++ b/05data/data-demo3/target/classes/mapper/OrderMapper.xml @@ -1,7 +1,21 @@ + + id,user_id + insert into t_order (id,user_id) values (#{id},#{userId}) + \ No newline at end of file From 18a99a4c00afefb91c0b744da746579f4ee34263 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Sun, 7 Mar 2021 07:53:20 +0800 Subject: [PATCH 19/22] refactor --- com.github.yibing.data.datademo2 | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 com.github.yibing.data.datademo2 diff --git a/com.github.yibing.data.datademo2 b/com.github.yibing.data.datademo2 deleted file mode 100644 index b599e1dd..00000000 --- a/com.github.yibing.data.datademo2 +++ /dev/null @@ -1,16 +0,0 @@ -2020-12-02 17:30:17.670 ERROR 14048 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : - -*************************** -APPLICATION FAILED TO START -*************************** - -Description: - -Failed to bind properties under 'logging.level' to java.util.Map: - - Reason: No converter found capable of converting from type [java.lang.String] to type [java.util.Map] - -Action: - -Update your application's configuration - From c27758c6584d0508a41283d3492c7a3bef71751e Mon Sep 17 00:00:00 2001 From: wangyibing Date: Thu, 1 Apr 2021 14:19:45 +0800 Subject: [PATCH 20/22] add my dubbo-hmily homework --- dubbo-hmily-demo/dubbo-account/pom.xml | 27 ++++ .../io/dobson/account/AccountApplication.java | 14 ++ .../io/dobson/account/entity/AccountInfo.java | 20 +++ .../account/mapper/AccountInfoMapper.java | 12 ++ .../account/service/AccountService.java | 9 ++ .../service/impl/AccountServiceImpl.java | 22 +++ .../src/main/resources/application.yml | 25 ++++ .../src/main/resources/hmily.yml | 75 +++++++++++ .../main/resources/mybatis/mybatis-config.xml | 15 +++ dubbo-hmily-demo/dubbo-transaction/pom.xml | 28 ++++ .../transaction/TransactionApplication.java | 25 ++++ .../service/TransactionService.java | 8 ++ .../service/impl/TransactionServiceImpl.java | 42 ++++++ .../src/main/resources/application.yml | 18 +++ .../src/main/resources/hmily.yml | 75 +++++++++++ dubbo-hmily-demo/pom.xml | 126 ++++++++++++++++++ 16 files changed, 541 insertions(+) create mode 100644 dubbo-hmily-demo/dubbo-account/pom.xml create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/AccountApplication.java create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/entity/AccountInfo.java create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/mapper/AccountInfoMapper.java create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/AccountService.java create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/resources/application.yml create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/resources/hmily.yml create mode 100644 dubbo-hmily-demo/dubbo-account/src/main/resources/mybatis/mybatis-config.xml create mode 100644 dubbo-hmily-demo/dubbo-transaction/pom.xml create mode 100644 dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/TransactionApplication.java create mode 100644 dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/TransactionService.java create mode 100644 dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/impl/TransactionServiceImpl.java create mode 100644 dubbo-hmily-demo/dubbo-transaction/src/main/resources/application.yml create mode 100644 dubbo-hmily-demo/dubbo-transaction/src/main/resources/hmily.yml create mode 100644 dubbo-hmily-demo/pom.xml diff --git a/dubbo-hmily-demo/dubbo-account/pom.xml b/dubbo-hmily-demo/dubbo-account/pom.xml new file mode 100644 index 00000000..e8e185ff --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/pom.xml @@ -0,0 +1,27 @@ + + + + dubbo-hmily-demo + io.dobson + 1.0-SNAPSHOT + + 4.0.0 + + io.dobson.account + dubbo-account + + + 8 + 8 + + + + + org.apache.dubbo + dubbo-spring-boot-starter + 2.7.7 + + + \ No newline at end of file diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/AccountApplication.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/AccountApplication.java new file mode 100644 index 00000000..92f4f38e --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/AccountApplication.java @@ -0,0 +1,14 @@ +package io.dobson.account; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class AccountApplication { + public static void main(String[] args) { + SpringApplication springApplication = new SpringApplication(AccountApplication.class); + springApplication.setWebApplicationType(WebApplicationType.NONE); + springApplication.run(args); + } +} diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/entity/AccountInfo.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/entity/AccountInfo.java new file mode 100644 index 00000000..cbc594f1 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/entity/AccountInfo.java @@ -0,0 +1,20 @@ +package io.dobson.account.entity; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Builder +@AllArgsConstructor +@Data +public class AccountInfo implements Serializable { + private Integer id; + private Long accountId; + private Long usd_balance; + private Long rmb_balance; + private Date updateTime; + +} diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/mapper/AccountInfoMapper.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/mapper/AccountInfoMapper.java new file mode 100644 index 00000000..2a94027e --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/mapper/AccountInfoMapper.java @@ -0,0 +1,12 @@ +package io.dobson.account.mapper; + +import io.dobson.account.entity.AccountInfo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Update; + +@Mapper +public interface AccountInfoMapper { + @Update("update account_info set usd_balance = usd_balance + #{usd_balance}, rmb_balance = rmb_balance + #{rmb_balance}" + + " where usd_balance >= #{usd_balance} and rmb_balance >= #{rmb_balance} and id = #{id}") + boolean exchange(AccountInfo accountInfo); +} diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/AccountService.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/AccountService.java new file mode 100644 index 00000000..be133cb3 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/AccountService.java @@ -0,0 +1,9 @@ +package io.dobson.account.service; + +import io.dobson.account.entity.AccountInfo; +import org.dromara.hmily.annotation.Hmily; + +public interface AccountService { + @Hmily + boolean pay(AccountInfo accountInfo); +} diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java new file mode 100644 index 00000000..e9e267e5 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java @@ -0,0 +1,22 @@ +package io.dobson.account.service.impl; + +import io.dobson.account.entity.AccountInfo; +import io.dobson.account.mapper.AccountInfoMapper; +import io.dobson.account.service.AccountService; +import org.apache.dubbo.config.annotation.DubboService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +@DubboService(version = "1.0.0") +public class AccountServiceImpl implements AccountService { + + @Resource + private AccountInfoMapper accountInfoMapper; + + @Override + public boolean pay(AccountInfo accountInfo) { + return accountInfoMapper.exchange(accountInfo); + } +} diff --git a/dubbo-hmily-demo/dubbo-account/src/main/resources/application.yml b/dubbo-hmily-demo/dubbo-account/src/main/resources/application.yml new file mode 100644 index 00000000..209df722 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/resources/application.yml @@ -0,0 +1,25 @@ +server: + port: 7001 +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3311/account_a?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false + username: root + password: root + +dubbo: + application: + name: dubbo-provider + scan: + base-packages: io.dobson.account + registry: + address: zookeeper://localhost:2181 + protocol: + name: dubbo + port: 12345 + metadata-report: + address: zookeeper://localhost:2181 + +mybatis: + type-aliases-package: io.dobson.account.entity + mapper-locations: classpath:mapper/*.xml \ No newline at end of file diff --git a/dubbo-hmily-demo/dubbo-account/src/main/resources/hmily.yml b/dubbo-hmily-demo/dubbo-account/src/main/resources/hmily.yml new file mode 100644 index 00000000..18136626 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/resources/hmily.yml @@ -0,0 +1,75 @@ +hmily: + server: + configMode: local + appName: account-demo + # 如果server.configMode eq local 的时候才会读取到这里的配置信息. + config: + appName: account-demo + serializer: kryo + contextTransmittalMode: threadLocal + scheduledThreadMax: 16 + scheduledRecoveryDelay: 60 + scheduledCleanDelay: 60 + scheduledPhyDeletedDelay: 600 + scheduledInitDelay: 30 + recoverDelayTime: 60 + cleanDelayTime: 180 + limit: 200 + retryMax: 10 + bufferSize: 8192 + consumerThreads: 16 + asyncRepository: true + autoSql: true + phyDeleted: true + storeDays: 3 + repository: mysql + +repository: + database: + driverClassName: com.mysql.jdbc.Driver + url : jdbc:mysql://127.0.0.1:3311/hmily?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false + username: root + password: root + maxActive: 20 + minIdle: 10 + connectionTimeout: 30000 + idleTimeout: 600000 + maxLifetime: 1800000 + file: + path: + prefix: /hmily + zookeeper: + host: localhost:2181 + sessionTimeOut: 1000 + rootPath: /hmily + redis: + cluster: false + sentinel: false + clusterUrl: + sentinelUrl: + masterName: + hostName: + port: + password: + maxTotal: 8 + maxIdle: 8 + minIdle: 2 + maxWaitMillis: -1 + minEvictableIdleTimeMillis: 1800000 + softMinEvictableIdleTimeMillis: 1800000 + numTestsPerEvictionRun: 3 + testOnCreate: false + testOnBorrow: false + testOnReturn: false + testWhileIdle: false + timeBetweenEvictionRunsMillis: -1 + blockWhenExhausted: true + timeOut: 1000 + +metrics: + metricsName: prometheus + host: + port: 9081 + async: true + threadCount : 16 + jmxConfig: \ No newline at end of file diff --git a/dubbo-hmily-demo/dubbo-account/src/main/resources/mybatis/mybatis-config.xml b/dubbo-hmily-demo/dubbo-account/src/main/resources/mybatis/mybatis-config.xml new file mode 100644 index 00000000..bf8f188c --- /dev/null +++ b/dubbo-hmily-demo/dubbo-account/src/main/resources/mybatis/mybatis-config.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/dubbo-hmily-demo/dubbo-transaction/pom.xml b/dubbo-hmily-demo/dubbo-transaction/pom.xml new file mode 100644 index 00000000..cfe1bab5 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/pom.xml @@ -0,0 +1,28 @@ + + + + dubbo-hmily-demo + io.dobson + 1.0-SNAPSHOT + + 4.0.0 + + io.dobson.transaction + dubbo-tranaction + + + 8 + 8 + + + + + io.dobson.account + dubbo-account + 1.0-SNAPSHOT + + + + \ No newline at end of file diff --git a/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/TransactionApplication.java b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/TransactionApplication.java new file mode 100644 index 00000000..1633d16e --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/TransactionApplication.java @@ -0,0 +1,25 @@ +package io.dobson.transaction; + +import io.dobson.transaction.service.TransactionService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.WebApplicationType; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TransactionApplication implements ApplicationRunner { + @Autowired + private TransactionService transactionService; + + public static void main(String[] args) { + SpringApplication springApplication = new SpringApplication(TransactionApplication.class); + springApplication.setWebApplicationType(WebApplicationType.NONE); + springApplication.run(args); + } + @Override + public void run(ApplicationArguments args) throws Exception { + transactionService.pay(); + } +} diff --git a/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/TransactionService.java b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/TransactionService.java new file mode 100644 index 00000000..a0f8a62b --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/TransactionService.java @@ -0,0 +1,8 @@ +package io.dobson.transaction.service; + +import org.dromara.hmily.annotation.Hmily; + +public interface TransactionService { + @Hmily + void pay(); +} diff --git a/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/impl/TransactionServiceImpl.java b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/impl/TransactionServiceImpl.java new file mode 100644 index 00000000..a4b5db55 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/src/main/java/io/dobson/transaction/service/impl/TransactionServiceImpl.java @@ -0,0 +1,42 @@ +package io.dobson.transaction.service.impl; + +import io.dobson.account.entity.AccountInfo; +import io.dobson.account.service.AccountService; +import io.dobson.transaction.service.TransactionService; +import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboReference; +import org.dromara.hmily.annotation.HmilyTCC; +import org.springframework.stereotype.Service; + +@Service +@Slf4j +public class TransactionServiceImpl implements TransactionService { + + @DubboReference(version = "1.0.0") + private AccountService accountService; + + @Override + @HmilyTCC(confirmMethod = "confirmMethod", cancelMethod = "cancelMethod") + public void pay() { + transactionA(); + transactionB(); + } + + private void transactionB() { + AccountInfo account = AccountInfo.builder().id(2).rmb_balance(7L).usd_balance(-1L).build(); + accountService.pay(account); + } + + private void transactionA() { + AccountInfo account = AccountInfo.builder().id(1).rmb_balance(-7L).usd_balance(1L).build(); + accountService.pay(account); + } + + public void confirmMethod() { + log.info("confirm method invoked"); + } + + public void cancelMethod() { + log.info("cancel method invoked"); + } +} diff --git a/dubbo-hmily-demo/dubbo-transaction/src/main/resources/application.yml b/dubbo-hmily-demo/dubbo-transaction/src/main/resources/application.yml new file mode 100644 index 00000000..6febd924 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/src/main/resources/application.yml @@ -0,0 +1,18 @@ +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://127.0.0.1:3311/account_a?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false + username: root + password: root +server: + port: 7002 + +dubbo: + application: + name: dubbo-consumer + scan: + base-packages: io.dobson.transaction + registry: + address: zookeeper://localhost:2181 + metadata-report: + address: zookeeper://localhost:2181 diff --git a/dubbo-hmily-demo/dubbo-transaction/src/main/resources/hmily.yml b/dubbo-hmily-demo/dubbo-transaction/src/main/resources/hmily.yml new file mode 100644 index 00000000..6951ad62 --- /dev/null +++ b/dubbo-hmily-demo/dubbo-transaction/src/main/resources/hmily.yml @@ -0,0 +1,75 @@ +hmily: + server: + configMode: local + appName: transaction-demo + # 如果server.configMode eq local 的时候才会读取到这里的配置信息. + config: + appName: transaction-demo + serializer: kryo + contextTransmittalMode: threadLocal + scheduledThreadMax: 16 + scheduledRecoveryDelay: 60 + scheduledCleanDelay: 60 + scheduledPhyDeletedDelay: 600 + scheduledInitDelay: 30 + recoverDelayTime: 60 + cleanDelayTime: 180 + limit: 200 + retryMax: 10 + bufferSize: 8192 + consumerThreads: 16 + asyncRepository: true + autoSql: true + phyDeleted: true + storeDays: 3 + repository: mysql + +repository: + database: + driverClassName: com.mysql.jdbc.Driver + url : jdbc:mysql://127.0.0.1:3311/hmily?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false + username: root + password: root + maxActive: 20 + minIdle: 10 + connectionTimeout: 30000 + idleTimeout: 600000 + maxLifetime: 1800000 + file: + path: + prefix: /hmily + zookeeper: + host: localhost:2181 + sessionTimeOut: 1000 + rootPath: /hmily + redis: + cluster: false + sentinel: false + clusterUrl: + sentinelUrl: + masterName: + hostName: + port: + password: + maxTotal: 8 + maxIdle: 8 + minIdle: 2 + maxWaitMillis: -1 + minEvictableIdleTimeMillis: 1800000 + softMinEvictableIdleTimeMillis: 1800000 + numTestsPerEvictionRun: 3 + testOnCreate: false + testOnBorrow: false + testOnReturn: false + testWhileIdle: false + timeBetweenEvictionRunsMillis: -1 + blockWhenExhausted: true + timeOut: 1000 + +metrics: + metricsName: prometheus + host: + port: 9091 + async: true + threadCount : 16 + jmxConfig: \ No newline at end of file diff --git a/dubbo-hmily-demo/pom.xml b/dubbo-hmily-demo/pom.xml new file mode 100644 index 00000000..a891d124 --- /dev/null +++ b/dubbo-hmily-demo/pom.xml @@ -0,0 +1,126 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.0.RELEASE + + io.dobson + dubbo-hmily-demo + pom + 1.0-SNAPSHOT + + dubbo-account + dubbo-transaction + + + + 8 + 8 + 2.3.0.RELEASE + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + + + + + + + org.springframework.boot + spring-boot-starter + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-test + + + + org.apache.dubbo + dubbo + 2.7.7 + + + org.apache.dubbo + dubbo-dependencies-zookeeper + 2.7.7 + pom + + + org.slf4j + slf4j-log4j12 + + + + + + org.dromara + hmily-spring-boot-starter-apache-dubbo + 2.1.1 + + + org.dromara + hmily-repository-mongodb + + + org.slf4j + slf4j-api + + + org.slf4j + slf4j-log4j12 + + + log4j + log4j + + + + + org.projectlombok + lombok + 1.18.16 + + + + mysql + mysql-connector-java + 5.1.49 + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.1.4 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + \ No newline at end of file From 7f0d26697d432796259db7d1b86a509079a6e92c Mon Sep 17 00:00:00 2001 From: wangyibing Date: Thu, 1 Apr 2021 14:21:32 +0800 Subject: [PATCH 21/22] update .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index fd45e616..ba5fe28e 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,6 @@ hs_err_pid* *.iml *.idea/ -*target \ No newline at end of file +*target + +.DS_Store \ No newline at end of file From 4752f2df7765182c502a6454d2819f68031074e6 Mon Sep 17 00:00:00 2001 From: wangyibing Date: Thu, 1 Apr 2021 14:46:45 +0800 Subject: [PATCH 22/22] refactor --- .../account/service/impl/AccountServiceImpl.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java index e9e267e5..29b69ee5 100644 --- a/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java +++ b/dubbo-hmily-demo/dubbo-account/src/main/java/io/dobson/account/service/impl/AccountServiceImpl.java @@ -3,20 +3,32 @@ import io.dobson.account.entity.AccountInfo; import io.dobson.account.mapper.AccountInfoMapper; import io.dobson.account.service.AccountService; +import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; +import org.dromara.hmily.annotation.HmilyTCC; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service @DubboService(version = "1.0.0") +@Slf4j public class AccountServiceImpl implements AccountService { @Resource private AccountInfoMapper accountInfoMapper; @Override + @HmilyTCC(confirmMethod = "confirmMethod", cancelMethod = "cancelMethod") public boolean pay(AccountInfo accountInfo) { return accountInfoMapper.exchange(accountInfo); } + + public void confirmMethod (){ + log.info("confirm 交易操作================"); + } + + public void cancelMethod(){ + log.info("cancel 交易操作=================="); + } }