往期热门文章:
1、微服务全做错了!谷歌提出新方法,成本直接降9倍!2、IntelliJ IDEA 2024 首个大版本发布,好用到爆!3、Web 后端的一生之敌:分页器4、ObjectMapper,别再像个二货一样一直new了!5、表设计的18条军规,你违反了几条?5、还在用Xshell?你out了,推荐一个更现代的终端连接工具
1 前言
2 目的
3 优点
4 原理
@TransactionalEventListener(fallbackExecution = true, phase = TransactionPhase.AFTER_COMPLETION)
fallbackExecution=true
没有事务正在运行,依然处理事件TransactionPhase.AFTER_COMPLETION
事务提交后和事务回滚后都处理事件5 组件
6 设计模式
7 流程图
8 数据库脚本
CREATE TABLE `async_req` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`application_name` varchar(100) NOT NULL DEFAULT '' COMMENT '应用名称',
`sign` varchar(50) NOT NULL DEFAULT '' COMMENT '方法签名',
`class_name` varchar(200) NOT NULL DEFAULT '' COMMENT '全路径类名称',
`method_name` varchar(100) NOT NULL DEFAULT '' COMMENT '方法名称',
`async_type` varchar(50) NOT NULL DEFAULT '' COMMENT '异步策略类型',
`exec_status` tinyint NOT NULL DEFAULT '0' COMMENT '执行状态 0:初始化 1:执行失败 2:执行成功',
`exec_count` int NOT NULL DEFAULT '0' COMMENT '执行次数',
`param_json` longtext COMMENT '请求参数',
`remark` varchar(200) NOT NULL DEFAULT '' COMMENT '业务描述',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_applocation_name` (`application_name`) USING BTREE,
KEY `idx_exec_status` (`exec_status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步处理请求';
CREATE TABLE `async_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`async_id` bigint NOT NULL DEFAULT '0' COMMENT '异步请求ID',
`error_data` longtext COMMENT '执行错误信息',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_async_id` (`async_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步处理日志';
9 异步策略
10 安全级别
11 执行状态
12 流程图
13 apollo 配置
# 开关:默认关闭
async.enabled=true
# 应用名称
spring.application.name=xxx
# 数据源 druid
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/fc_async?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=user
spring.datasource.password=xxxx
spring.datasource.filters=config
spring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=yyy
#静态地址
spring.resources.add-mappings=true
spring.resources.static-locations=classpath:/static/
# 以下配置都有默认值
# 核心线程数
async.executor.thread.corePoolSize=10
# 最大线程数
async.executor.thread.maxPoolSize=50
# 队列容量
async.executor.thread.queueCapacity=10000
# 活跃时间
async.executor.thread.keepAliveSeconds=600
# 执行成功是否删除记录:默认删除
async.exec.deleted=true
# 自定义队列名称前缀:默认应用名称
async.topic=${spring.application.name}
# 重试执行次数:默认5次
async.exec.count=5
# 重试最大查询数量
async.retry.limit=100
# 补偿最大查询数量
async.comp.limit=100
# 登录拦截:默认false
async.login=false
14 用法
scm.async.enabled=true2,在需要异步执行的方法加注解 (必须是spring代理方法)
@AsyncExec(type = AsyncExecEnum.SAVE_ASYNC, remark = "数据字典")3,人工处理地址
http://localhost:8004/async/index.html
15 注意
spring.application.name2,队列名称
${async.topic:${spring.application.name}}_async_queue自定义topic:
async.topic=xxx
3,自己业务要做幂等4,一个应用公用一个队列自产自消5,定时任务
16 效果展示
17 github地址
往期热门文章:1、为什么现在Java连Date类都不建议使用了?2、Java 极限操作3、100万级安装量的开源作品,一年有多少打赏收入?4、编写 if 时尽量不要带 else?5、Redis只能做缓存?太out了!6、目前工资最高的几家外包公司汇总!(2024最新版)7、工作中最常见的6种OOM问题8、千万不要滥用Stream.toList(),有坑!9、强烈建议你不要再使用Date类了!!!10、IDEA 接口调试神器,贼好用!