思有所皈,绪有所依

给万千思绪,寻一寄存之所

这几天稍微得闲,尝试把fron-zero-to-n这个项目的Spring Boot版本升级到2.7.8,JDK升级到17,为后续升级到Spring Booot 3.0做准备。

详细版本

依赖项 升级前的版本 升级后的版本
Spring Boot 2.6.2 2.7.8
Spring Cloud 2021.0.0 2021.0.5
Java 1.8 17

Spring Boot和Spring Cloud的版本对应关系,还是参考https://start.spring.io或者https://start.spring.io/actuator/info

阅读全文 »

版权申明

博客文章自带的版权申明,如果是发布在自建的网站上,司法采信的权重可能并不高,毕竟可以随意修改,只是一个防君子不防小人的措施。

电子签名

司法认可的结合时间戳的签名,有成本。比如密信提供的Adobe全球信任PDF签名证书,入门版是2元一次。联合信任时间戳服务中心的签名甚至需要10元一次。

“登报”申明

传统的方式,除了公证,就是登报申明,借助这个思路,我们可以考虑找一些第三方的网站来公开。如果证据链完备,司法也会认可。比如在Github上以开源的方式发布,或者在新浪微博上发布,或者在多个博客平台上发布,这样就类似登报申明了,可以证明在某个时间节点,你发布了什么内容。当然内容是否是原创,另说。

创建索引

对大表进行分表

查询时使用with进行预处理(select in with)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
WITH regional_sales AS (
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region
), top_regions AS (
SELECT region
FROM regional_sales
WHERE total_sales > (SELECT SUM(total_sales)/10 FROM regional_sales)
)
SELECT region,
product,
SUM(quantity) AS product_units,
SUM(amount) AS product_sales
FROM orders
WHERE region IN (SELECT region FROM top_regions)
GROUP BY region, product;

既然Spring Boot官方宣称3.0是未来10年的基石,那我们也有必要做一些储备和尝试。笔者用当前生产部署的一个项目,建立git分支进行升级测试,这里做一个记录,后续逐渐完善。

阅读全文 »

安装

官网下载IntelliJ IDEA 社区版

从Ultimate切换到Community

项目的运行可能会被标记为Unknown,没什么关系,在配置里删除掉,然后在要运行的Class文件上鼠标右键,重新运行即会自动创建

插件

grep console,定义控制台输出的日志样式

Key Promoter X,在该使用快捷键的地方提醒你使用快捷键

Alibaba Java Coding Guidelines,阿里巴巴代码规范约束插件,对代码规范等很有帮助,可以养成良好的代码规范,编程风格

SonarLint,编写代码时修复错误和漏洞

Json Helper,Json格式化插件

AiXcoder Code Completer,代码智能提示(本来是搜索Codota,出来这个,还没测试效果)

Git Commit Template,提供了很好的 Git 格式化模版,规范Git提交

Maven Helper,依赖分析工具

用Hexo写个人博客已经有一段时间了,但是一直没找到一个好的方式来发布到互联网上(既要省钱又要省事):

  1. 是否购买独立的域名?
  2. 是否购买有公网IP的主机来部署?

今天终于发布出来了,采用“阿里云域名 + Cloudflare Pages”的组合,首年只花9元的域名钱,后续也只是域名续费。

阅读全文 »

现在感觉Spring Cloud的整个体系太重了,尝试看看Spring Boot + Dubbo 3.0

官方示例: Spring Boot 开发服务
内置对容器化部署的支持: Docker部署Dubbo跨主机IP访问解决方案

Dubbo超时设置的优先顺序,调用方的接口方法 > 调用方全局设置 > 提供方全局设置 > 提供方接口方法

dubbo-admin: 待探索

官方文档JobRunr Doc

安装

在Spring Boot上的安装非常简单,有Spring Boot Starter

Spring boot 2的Maven依赖包:

Spring Boot 2
1
2
3
4
5
<dependency>
<groupId>org.jobrunr</groupId>
<artifactId>jobrunr-spring-boot-starter</artifactId>
<version>5.1.3</version>
</dependency>

JobRunr从6.0开始支持Spring Boot 3:

Spring Boot 2
1
2
3
4
5
<dependency>
<groupId>org.jobrunr</groupId>
<artifactId>jobrunr-spring-boot-3-starter</artifactId>
<version>6.1.3</version>
</dependency>

配置application.yml,主要是开启/关闭 JobRunr 的Server和Dashboard,Server用来执行job,Dashboard则是在一个独立的端口提供网页看板:

1
2
3
4
5
6
7
8
9
10
org:
jobrunr:
background-job-server:
enabled: true
dashboard:
enabled: true
port: 8000
database:
#JobRunr创建表的默认前缀是jobrunr_
skip-create: false

使用JobScheduler创建Job

1
2
3
4
5
6
7
8
9
10
@Autowired
private JobScheduler jobScheduler;
...

//这里使用了自定义的实体来保存任务信息,然后创建时指定了id,注意id如果已经存在则不会创建
//JobRunr的jobrunr_jobs表也记录了任务信息,其id跟这里给的id一一对应,所以借用这个机制可以扩展自定义的任务记录
SomeTask task = ...
jobScheduler.enqueue(UUID.fromString(task.getId()), () -> {
someService.someMethod(task);
});

使用注解创建重复执行的任务(Job)

1
2
3
4
5
6
7
8
9
10
11
12

@Recurring(id = "per-day-trigger-job", cron = "0 0 7 * * *")
@Job(name = "每天的7时触发")
public void bizMsgPerDayTrigger() {
...
}

@Recurring(id = "per-minute-trigger-job", interval = "PT1M")
@Job(name = "每分钟触发")
public void bizMsgPerMinuteTrigger() {
...
}

Dashboard

Dashboard是一个网页看板,在这里可以查看任务的执行情况,也可以手动触发任务、删除任务。

个人觉得选用JobRunr,一方面是与Spring Boot集成比较方便,这样在开发和运维上比较节省人力和服务器资源,当然这可能是个双刃剑,对那些不差钱也不差人的场景来说,这是“缺点”;另一方面是Dashboard的可视化,会增加我们的掌控感。

有问题的Job会进入Scheduled状态

JobRunr建议在写Job的执行代码时,把异常抛出来,这样JobRunr就会把这个Job的状态设置为Failed,然后在Dashboard上可以看到这个Job的执行情况,如下图所示:

如果某个Job每次执行都抛异常,就会进入Scheduled状态,以更低的频率执行。

重复执行任务的手工触发和删除

有些任务,比如每天甚至每周才执行一次,如果想手工触发,可以在Dashboard上的RecurringJobs下,勾选Job,然后点击“Trigger”按钮触发,如下图所示:

任务的删除,主要是这种场景:代码做了修改之后,使用@Recurring和@Job注解申明的任务,名称变了或者不需要了,也就是代码里其实已经没有这个名称的Job了。这时候可以在Dashboard上的RecurringJobs下,勾选Job,然后点击“Delete”按钮删除。

0%