Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
zlt2000
microservices-platform
提交
51ca3b6a
microservices-platform
项目概览
zlt2000
/
microservices-platform
10 个月 前同步成功
通知
16
Star
4
Fork
3
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
microservices-platform
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
51ca3b6a
编写于
8月 14, 2019
作者:
zlt2000
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
扩展线程池,父线程能传递租户和MDC信息给子线程
上级
09476d98
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
111 addition
and
1 deletion
+111
-1
zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultAsycTaskConfig.java
...java/com/central/common/config/DefaultAsycTaskConfig.java
+2
-1
zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/utils/CustomThreadPoolTaskExecutor.java
...om/central/common/utils/CustomThreadPoolTaskExecutor.java
+109
-0
未找到文件。
zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/config/DefaultAsycTaskConfig.java
浏览文件 @
51ca3b6a
package
com.central.common.config
;
import
com.central.common.utils.CustomThreadPoolTaskExecutor
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.beans.factory.annotation.Value
;
...
...
@@ -41,7 +42,7 @@ public class DefaultAsycTaskConfig {
@Bean
public
TaskExecutor
taskExecutor
()
{
ThreadPoolTaskExecutor
executor
=
new
ThreadPoolTaskExecutor
();
ThreadPoolTaskExecutor
executor
=
new
Custom
ThreadPoolTaskExecutor
();
executor
.
setCorePoolSize
(
corePoolSize
);
executor
.
setMaxPoolSize
(
maxPoolSize
);
executor
.
setQueueCapacity
(
queueCapacity
);
...
...
zlt-commons/zlt-common-spring-boot-starter/src/main/java/com/central/common/utils/CustomThreadPoolTaskExecutor.java
0 → 100644
浏览文件 @
51ca3b6a
package
com.central.common.utils
;
import
cn.hutool.core.util.StrUtil
;
import
org.slf4j.MDC
;
import
org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor
;
import
org.springframework.util.concurrent.ListenableFuture
;
import
java.util.Map
;
import
java.util.concurrent.Callable
;
import
java.util.concurrent.Future
;
/**
* 这是{@link ThreadPoolTaskExecutor}的一个简单替换,可以在每个任务之前设置子线程的租户和MDC数据
*
* @author zlt
* @date 2019/8/14
*/
public
class
CustomThreadPoolTaskExecutor
extends
ThreadPoolTaskExecutor
{
/**
* 把父线程的租户和MDC内容赋值给子线程
* @param runnable
*/
@Override
public
void
execute
(
Runnable
runnable
)
{
String
tenantId
=
TenantContextHolder
.
getTenant
();
Map
<
String
,
String
>
mdcContext
=
MDC
.
getCopyOfContextMap
();
super
.
execute
(()
->
run
(
runnable
,
tenantId
,
mdcContext
));
}
@Override
public
<
T
>
Future
<
T
>
submit
(
Callable
<
T
>
task
)
{
String
tenantId
=
TenantContextHolder
.
getTenant
();
Map
<
String
,
String
>
mdcContext
=
MDC
.
getCopyOfContextMap
();
return
super
.
submit
(()
->
call
(
task
,
tenantId
,
mdcContext
));
}
@Override
public
Future
<?>
submit
(
Runnable
task
)
{
String
tenantId
=
TenantContextHolder
.
getTenant
();
Map
<
String
,
String
>
mdcContext
=
MDC
.
getCopyOfContextMap
();
return
super
.
submit
(()
->
run
(
task
,
tenantId
,
mdcContext
));
}
@Override
public
ListenableFuture
<?>
submitListenable
(
Runnable
task
)
{
String
tenantId
=
TenantContextHolder
.
getTenant
();
Map
<
String
,
String
>
mdcContext
=
MDC
.
getCopyOfContextMap
();
return
super
.
submitListenable
(()
->
run
(
task
,
tenantId
,
mdcContext
));
}
@Override
public
<
T
>
ListenableFuture
<
T
>
submitListenable
(
Callable
<
T
>
task
)
{
String
tenantId
=
TenantContextHolder
.
getTenant
();
Map
<
String
,
String
>
mdcContext
=
MDC
.
getCopyOfContextMap
();
return
super
.
submitListenable
(()
->
call
(
task
,
tenantId
,
mdcContext
));
}
/**
* 子线程委托的执行方法
* @param runnable {@link Runnable}
* @param tenantId 租户id
* @param mdcContext 父线程MDC内容
*/
private
void
run
(
Runnable
runnable
,
String
tenantId
,
Map
<
String
,
String
>
mdcContext
)
{
// 将父线程的租户id传给子线程
if
(
StrUtil
.
isNotEmpty
(
tenantId
))
{
TenantContextHolder
.
setTenant
(
tenantId
);
}
// 将父线程的MDC内容传给子线程
if
(
mdcContext
!=
null
)
{
MDC
.
setContextMap
(
mdcContext
);
}
try
{
// 执行异步操作
runnable
.
run
();
}
finally
{
// 清空租户内容
TenantContextHolder
.
clear
();
// 清空MDC内容
MDC
.
clear
();
}
}
/**
* 子线程委托的执行方法
* @param task {@link Callable}
* @param tenantId 租户id
* @param mdcContext 父线程MDC内容
*/
private
<
T
>
T
call
(
Callable
<
T
>
task
,
String
tenantId
,
Map
<
String
,
String
>
mdcContext
)
throws
Exception
{
// 将父线程的租户id传给子线程
if
(
StrUtil
.
isNotEmpty
(
tenantId
))
{
TenantContextHolder
.
setTenant
(
tenantId
);
}
// 将父线程的MDC内容传给子线程
if
(
mdcContext
!=
null
)
{
MDC
.
setContextMap
(
mdcContext
);
}
try
{
// 执行异步操作
return
task
.
call
();
}
finally
{
// 清空租户内容
TenantContextHolder
.
clear
();
// 清空MDC内容
MDC
.
clear
();
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录