优秀开源笔记

优秀学习笔记

Canal:数据库实时更新通知

Canal是一款阿里的MySQL实时同步框架

数据想要实时同步?这才是最佳实践|Java|Canal|框架_哔哩哔哩_bilibili

alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)

Ruoyi快速入门

若依框架快速开发项目(不涉及底层逻辑,只是简单使用)-CSDN博客

创建自己的模块需要对pom的操作:

  1. 创建自己的模块ruoyi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<parent>
<artifactId>ruoyi</artifactId>
<groupId>com.ruoyi</groupId>
<version>x.x.x</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>ruoyi-test</artifactId>

<description>
test系统模块
</description>

<dependencies>

<!-- 通用工具-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>

</dependencies>

</project>

  1. 在根目录的pom中加入自己的modeldependency
1
2
3
4
5
6
7
8
9
10
<modules>
<module>ruoyi-test</module>
</modules>

<!-- 测试模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-test</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>

3.在ruoyi-admin引入自己的依赖

1
2
3
4
5
6
<!-- 测试模块-->
<dependency>
<groupId>com.ruoyi</groupId>
<artifactId>ruoyi-test</artifactId>
</dependency>

网关是什么?

用于连接两个协议不同的数据传输,或者是不同网络下的信息传输,实时转换满足目的系统需求。并可以提供过滤和安全功能

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连。 网关是一种充当转换重任的计算机系统或设备。在使用不同的通信协议、数据格式或语言,甚至体系结构完全不同的两种系统之间,网关是一个翻译器。与网桥只是简单地传达信息不同,网关对收到的信息要重新打包,以适应目的系统的需求。同时,网关也可以提供过滤和安全功能。大多数网关运行在OSI 7层协议的顶层–应用层。

什么是网关,网关的作用是什么? - 知乎 (zhihu.com)

ForkJoinPool

Java高并发编程中ForkJoinPool的使用及详细介绍-刘宇_forkjoinpool最大-CSDN博客

1、提交任务的两种方式

我们在提交任务时,一般不会直接继承ForkJoinTask,只要继承它的子类即可:

  • RecursiveAction:用于没有返回结果的任务(类似Runnable)
  • RecursiveTask:用于有返回结果的任务(类似Callable)

2、构造函数

  • parallelism:由几个线程来拆分任务,如果不填则更具CPU核数创建线程数
  • factory:创建工作线程的工厂实现
  • handler:线程因未知异常而终止的回调处理
  • asyncMode:是否异步,默认false
1
2
3
ForkJoinPool()
ForkJoinPool(int parallelism)
ForkJoinPool(int parallelism, ForkJoinWorkerThreadFactory factory, UncaughtExceptionHandler handler, bool

ForkJoinPool又叫分而治之,通俗来讲就是帮我们把一个任务分成许多小任务给不同的线程执行,然后通过join将多个线程处理的结果进行汇总返回。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.IntStream;

public class ForkJoinRecurisiveTask {
//最大计算数
private static final int MAX_THRESHOLD = 5;
public static void main(String[] args) {
//创建ForkJoinPool
ForkJoinPool pool = new ForkJoinPool();
//异步提交RecursiveTask任务
ForkJoinTask<Integer> forkJoinTask = pool.submit(new CalculatedRecurisiveTask(0,100));
try {
//根据返回类型获取返回值
Integer result = forkJoinTask.get();
System.out.println("结果为:"+result);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}

private static class CalculatedRecurisiveTask extends RecursiveTask<Integer>{
private int start;
private int end;
public CalculatedRecurisiveTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
//判断计算范围,如果小于等于5,那么一个线程计算就够了,否则进行分割
if ((end-start)<=5) {
return IntStream.rangeClosed(start, end).sum();
}else {
//任务分割:将start一直加到end,当超过5计算量大就分开线程计算(分而治之这是ForkJoin的核心思想)
int middle = (end+start)/2;
CalculatedRecurisiveTask task1 = new CalculatedRecurisiveTask(start,middle);
CalculatedRecurisiveTask task2 = new CalculatedRecurisiveTask(middle+1,end);
//执行
task1.fork();
task2.fork();
//等待返回结果
return task1.join()+task2.join();
}
}
}
}

AIGC + 服装设计

30 秒出服装设计稿,森马用函数计算+AIGC 整“新活”! - OSCHINA - 中文开源技术交流社区

火山引擎推荐 + 搜款网

火山引擎&搜款网:服装批发背后的智慧与“荐”行 - OSCHINA - 中文开源技术交流社区