forever杨的个人博客

I want to be forever young!


  • 首页

  • 文章202

  • 分类31

  • 标签175

  • 公益

  • 关于

  • 搜索

Java Lambda 用法

发表于 2022-01-21 | 更新于 2022-04-26 | 分类于 Java
| 字数: 1.3k | 时长 ≈ 1 分钟
标签 lambada

按分组获取分组中最新一条记录

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
53
54
55
56
57
58
/**
* 历史任务实体类
*/
@Data
@NoArgsConstructor
public class HistoryTask implements Serializable {
private static final long serialVersionUID = 7925632180050362451L;
/**
* 主键ID
*/
private String id;
/**
* 流程实例ID
*/
private String orderId;
/**
* 任务名称
*/
private String taskName;
/**
* 任务显示名称
*/
private String displayName;
/**
* 任务处理者ID
*/
private String operator;
/**
* 任务创建时间
*/
private String createTime;
/**
* 任务完成时间
*/
private String finishTime;
}

public Map<String, HistoryTask> getLatest(List<HistoryTask> historyTasks) {
return historyTasks.stream().collect(
// 根据任务处理者 Id 分组,获取各自分组中最新的一条记录
Collectors.toMap(
HistoryTask::getOperator,
Function.identity(),
(h1, h2) -> {
try {
Date date1 = DateUtil.parseDate(h1.getFinishTime(), "yyyy-MM-dd HH:mm:ss");
Date date2 = DateUtil.parseDate(h2.getFinishTime(), "yyyy-MM-dd HH:mm:ss");
return date1.after(date2) ? h1 : h2;
} catch (ParseException e) {
// ignore
}
return h1;
})
);
}

List<HistoryTask> historyTasks = ...
historyTasks = new ArrayList<>(getLatest(historyTasks).values());

RestTemplate 使用

发表于 2022-01-06 | 更新于 2024-07-11 | 分类于 Java
| 字数: 26k | 时长 ≈ 24 分钟
标签 spring spring-boot RestTemplate

主要配置

  • 连接池
  • 支持 IP 形式的 HTTPS 请求
阅读全文 »

父子关系树或列表排序

发表于 2021-12-22 | 更新于 2022-04-26 | 分类于 Java
| 字数: 3.5k | 时长 ≈ 3 分钟
标签 sort

父子关系列表排序

父节点在前,子节点在后

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
/**
* 按父子节点排序,父节点在子节点前面
*
* @param departs 列表
* @return 排序列表
*/
public static List<Depart> sort(List<Depart> departs) {
// 先找出所有的 root 元素
Queue<Depart> queues = departs.stream()
.filter(d -> d.getParentId() == null || -1L == d.getParentId())
.collect(Collectors.toCollection(LinkedList::new));
return findChildren(departs, queues);
}

private static List<Depart> findChildren(List<Depart> departs, Queue<Depart> queues) {
List<Depart> childrenList = new ArrayList<>();
while (queues.size() > 0) {
// 弹出队列
Depart poll = queues.poll();
childrenList.add(poll);
for (Depart depart : departs) {
if (Objects.equals(depart.getParentId(), poll.getId())) {
// 加入队列
queues.offer(depart);
}
}
}
return childrenList;
}
阅读全文 »

常用 spring 框架工具类

发表于 2021-12-18 | 更新于 2022-04-26 | 分类于 Java
| 字数: 5.5k | 时长 ≈ 5 分钟
标签 spring

Assert 断言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 要求参数 object 必须为非空(Not Null),否则抛出异常,不予放行
// 参数 message 参数用于定制异常信息。
void notNull(Object object, String message)
// 要求参数必须空(Null),否则抛出异常,不予『放行』。
// 和 notNull() 方法断言规则相反
void isNull(Object object, String message)
// 要求参数必须为真(True),否则抛出异常,不予『放行』。
void isTrue(boolean expression, String message)
// 要求参数(List/Set)必须非空(Not Empty),否则抛出异常,不予放行
void notEmpty(Collection collection, String message)
// 要求参数(String)必须有长度(即,Not Empty),否则抛出异常,不予放行
void hasLength(String text, String message)
// 要求参数(String)必须有内容(即,Not Blank),否则抛出异常,不予放行
void hasText(String text, String message)
// 要求参数是指定类型的实例,否则抛出异常,不予放行
void isInstanceOf(Class type, Object obj, String message)
// 要求参数 `subType` 必须是参数 superType 的子类或实现类,否则抛出异常,不予放行
void isAssignable(Class superType, Class subType, String message)
阅读全文 »

PasswordEncoder 配置

发表于 2021-12-12 | 更新于 2021-12-29 | 分类于 Java
| 字数: 1.2k | 时长 ≈ 1 分钟
标签 spring spring-security

PasswordEncoder 配置

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
@Bean
public PasswordEncoder passwordEncoder() {
String bcrypt = "bcrypt";
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
Map<String, PasswordEncoder> encoders = new HashMap<>(8);
encoders.put(bcrypt, new BCryptPasswordEncoder());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
// md
// encoders.put("md4", new Md4PasswordEncoder());
// encoders.put("md5", new MessageDigestPasswordEncoder("MD5"));
// sha
// encoders.put("sha1", new StandardPasswordEncoder("SHA-1", ""));
// encoders.put("sha256", new StandardPasswordEncoder());
// encoders.put("sha384", new StandardPasswordEncoder("SHA-384", ""));
// encoders.put("sha512", new StandardPasswordEncoder("SHA-512", ""));
// sm3
// encoders.put("sm3", new SM3PasswordEncoder());
// ldap
// encoders.put("ldap", new LdapShaPasswordEncoder());

//idForEncode is default for encoder
DelegatingPasswordEncoder delegating = new DelegatingPasswordEncoder(bcrypt, encoders);
// 如果都不匹配以上加密方式,则使用默认方式
delegating.setDefaultPasswordEncoderForMatches(encoder);
return delegating;
}

chage 修改密码策略

发表于 2021-12-07 | 更新于 2023-08-14 | 分类于 Linux
| 字数: 170 | 时长 ≈ 1 分钟
标签 shell chage

chage

1
2
3
4
5
6
7
## 查看密码策略
chage -l 账号
# 修改密码有效期
## Minimum number of days between password change
chage -m 360 账号
## Maximum number of days between password change
chage -M 360 账号

apisix 使用

发表于 2021-11-27 | 更新于 2022-07-14 | 分类于 apisix
| 字数: 3.9k | 时长 ≈ 4 分钟
标签 apisix apisix-dashboard

版本

apisix:2.11.0

apisix-dashboard:2.10.1

阅读全文 »

使用 nload 查询系统实时带宽

发表于 2021-11-16 | 更新于 2024-01-12 | 分类于 Linux
| 字数: 173 | 时长 ≈ 1 分钟
标签 shell nload

nload

安装

1
yum -y install nload

使用 nload 监控网络流量

1
2
3
4
5
6
7
# 使用 nload 监控网络流量
[root@yl ~]$ nload

# 可以在命令行上指定网卡名称
# 查询网卡名
[root@yl ~]$ ifconfig
[root@yl ~]$ nload 网卡名

-m、-a、-t 等参数使用

查询 Linux 内核

发表于 2021-11-16 | 更新于 2021-11-20 | 分类于 Linux
| 字数: 60 | 时长 ≈ 1 分钟
标签 shell arch

arch

1
2
[root@yl ~]$ arch
x86_64

注:x86_64、x64、AMD64基本上是同一个东西

apisix 配置 etcd TLS

发表于 2021-09-16 | 更新于 2021-11-20 | 分类于 apisix
| 字数: 1.3k | 时长 ≈ 1 分钟
标签 docker apisix etcd

镜像:apisix:2.9-alpine

如果使用 etcd TLS,需要自己构建 openresty。

阅读全文 »

docker 部署 apisix 网关

发表于 2021-09-15 | 更新于 2021-11-20 | 分类于 apisix
| 字数: 15k | 时长 ≈ 14 分钟
标签 docker apisix etcd apisix-dashboard keepalived

规划

服务 路径 ip:port
etcd /data/docker/etcd 192.123.2.1:2379、2380
etcd /data/docker/etcd 192.123.2.2:2379、2380
etcd /data/docker/etcd 192.123.2.3:2379、2380
keepalived /etc/keepalived 主机IP:192.123.2.1,浮动IP:192.123.2.100
keepalived /etc/keepalived 主机IP:192.123.2.2,浮动IP:192.123.2.100
keepalived /etc/keepalived 主机IP:192.123.2.3,浮动IP:192.123.2.100
apisix /data/docker/apisix 192.123.2.1:9080、9443、3305
apisix /data/docker/apisix 192.123.2.1:9080、9443、3305
apisix /data/docker/apisix 192.123.2.1:9080、9443、3305
apisix-dashboard /data/docker/apisix-dashboard 192.123.2.1:9000
阅读全文 »

项目使用 gitlab-ci 做持续集成持续部署

发表于 2021-09-13 | 更新于 2021-12-09 | 分类于 git
| 字数: 4k | 时长 ≈ 4 分钟
标签 docker docker-compose gitlab gitlab-runner maven gitlab-ci gradle

本教程中使用到的 maven、gradle、docker、docker-compose、shell 类型 runner,需要提前创建好,参考:。

阅读全文 »

spring cors 配置

发表于 2021-09-08 | 更新于 2021-09-13 | 分类于 Java
| 字数: 5.3k | 时长 ≈ 5 分钟
标签 spring spring-boot cors

Web 项目配置 cors 的三种方式。

阅读全文 »

docker redis集群安装和配置

发表于 2021-08-30 | 更新于 2024-02-29 | 分类于 redis
| 字数: 9.7k | 时长 ≈ 9 分钟
标签 docker redis

Redis 集群配置

密码:redis123456

备份:未开启

保护模式(protected-mode):未开启。如果开启,需要指定bind: 0.0.0.0,否则应用连接集群会报错

阅读全文 »

gitlab-ci.yml 配置详情

发表于 2021-07-12 | 更新于 2022-11-29 | 分类于 git
| 字数: 21k | 时长 ≈ 19 分钟
标签 git gitlab ci cd

全局关键字

stages

stages用于定义流水线全局可使用的阶段,阶段元素的顺序既是作业执行的顺序。

阅读全文 »
123…14
forever杨

forever杨

开心又过一日,唔开心又过一日

202 文章
31 分类
175 标签
GitHub
友情链接
  • Tidy的个人博客
© 2024 forever杨 | 站点总字数: 706k