feat(sj_1.1.0-beta2): 优化threadLocal

This commit is contained in:
opensnail 2024-06-27 15:00:55 +08:00
parent ada349a88f
commit aea6906b55
7 changed files with 63 additions and 22 deletions

View File

@ -0,0 +1,9 @@
package com.aizuda.snailjob.client.common;
/**
* @author: opensnail
* @date : 2024-03-22
* @since : sj_1.1.0
*/
public interface SnailJobContextThreadLocal<T> extends SnailThreadLocal<T> {
}

View File

@ -5,12 +5,5 @@ package com.aizuda.snailjob.client.common;
* @date : 2024-03-22
* @since :3.2.0
*/
public interface SnailLogContext<T> {
void set(T value);
void remove();
T get();
public interface SnailJobLogThreadLocal<T> extends SnailThreadLocal<T> {
}

View File

@ -0,0 +1,16 @@
package com.aizuda.snailjob.client.common;
/**
* @author: opensnail
* @date : 2024-06-27
* @since : sj_1.1.0
*/
public interface SnailThreadLocal<T> {
void set(T value);
void remove();
T get();
}

View File

@ -1,11 +1,13 @@
package com.aizuda.snailjob.client.common.log.support;
import cn.hutool.core.util.ServiceLoaderUtil;
import com.aizuda.snailjob.client.common.SnailLogContext;
import com.aizuda.snailjob.client.common.log.context.ThreadLocalLogContext;
import com.aizuda.snailjob.client.common.SnailJobLogThreadLocal;
import com.aizuda.snailjob.client.common.SnailThreadLocal;
import com.aizuda.snailjob.client.common.log.report.LogMeta;
import com.aizuda.snailjob.client.common.threadlocal.CommonThreadLocal;
import com.aizuda.snailjob.common.log.enums.LogTypeEnum;
import java.util.Objects;
import java.util.Optional;
/**
@ -15,11 +17,15 @@ import java.util.Optional;
*/
public final class SnailJobLogManager {
private static final SnailLogContext<LogTypeEnum> LOG_TYPE = snailJobLogContextLoader();
private static final SnailLogContext<LogMeta> LOG_META = snailJobLogContextLoader();
private static final SnailThreadLocal<LogTypeEnum> LOG_TYPE = snailJobLogContextLoader();
private static final SnailThreadLocal<LogMeta> LOG_META = snailJobLogContextLoader();
private static <T> SnailLogContext<T> snailJobLogContextLoader() {
return Optional.ofNullable(ServiceLoaderUtil.loadFirst(SnailLogContext.class)).orElse(new ThreadLocalLogContext<T>(new ThreadLocal<>()));
private static <T> SnailThreadLocal<T> snailJobLogContextLoader() {
SnailThreadLocal<T> snailThreadLocal = ServiceLoaderUtil.loadFirst(SnailJobLogThreadLocal.class);
if (Objects.isNull(snailThreadLocal)) {
snailThreadLocal = new CommonThreadLocal<>(new ThreadLocal<>());
}
return snailThreadLocal;
}
private SnailJobLogManager() {

View File

@ -1,21 +1,21 @@
package com.aizuda.snailjob.client.common.log.context;
package com.aizuda.snailjob.client.common.threadlocal;
import cn.hutool.core.lang.Assert;
import com.aizuda.snailjob.client.common.SnailLogContext;
import com.aizuda.snailjob.client.common.SnailThreadLocal;
import com.aizuda.snailjob.client.common.exception.SnailJobClientException;
/**
* ThreadLocal实现类
*
* @author: xiaowoniu
* @date : 2023-08-09 16:34
* @since 3.2.0
* @author: opensnail
* @date : 2024-06-27
* @since sj_1.1.0
*/
public class ThreadLocalLogContext<T> implements SnailLogContext<T> {
public class CommonThreadLocal<T> implements SnailThreadLocal<T> {
private final ThreadLocal<T> threadLocal;
public ThreadLocalLogContext(ThreadLocal<T> threadLocal) {
public CommonThreadLocal(ThreadLocal<T> threadLocal) {
Assert.notNull(threadLocal, () -> new SnailJobClientException("thread local can not be null"));
this.threadLocal = threadLocal;
}

View File

@ -1,15 +1,29 @@
package com.aizuda.snailjob.client.job.core.executor;
import cn.hutool.core.util.ServiceLoaderUtil;
import com.aizuda.snailjob.client.common.SnailJobLogThreadLocal;
import com.aizuda.snailjob.client.common.SnailThreadLocal;
import com.aizuda.snailjob.client.common.threadlocal.CommonThreadLocal;
import com.aizuda.snailjob.common.core.model.JobContext;
import java.util.Objects;
/**
* @author: opensnail
* @date : 2024-06-13
* @since : sj_1.1.0
*/
public final class JobContextManager {
private JobContextManager() {}
private static final ThreadLocal<JobContext> JOB_CONTEXT_LOCAL = new ThreadLocal<>();
private static final SnailThreadLocal<JobContext> JOB_CONTEXT_LOCAL = initThreadLocal();
private static SnailThreadLocal<JobContext> initThreadLocal() {
SnailThreadLocal<JobContext> snailThreadLocal = ServiceLoaderUtil.loadFirst(SnailJobLogThreadLocal.class);
if (Objects.isNull(snailThreadLocal)) {
snailThreadLocal = new CommonThreadLocal<>(new ThreadLocal<>());
}
return snailThreadLocal;
}
public static void setJobContext(JobContext jobContext) {
JOB_CONTEXT_LOCAL.set(jobContext);

View File

@ -1,5 +1,6 @@
package com.aizuda.snailjob.client.job.core.executor;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.StrUtil;
import com.aizuda.snailjob.client.common.rpc.client.RequestBuilder;
import com.aizuda.snailjob.client.job.core.client.JobNettyClient;
@ -60,7 +61,9 @@ public final class MapInvokeHandler implements InvocationHandler {
throw new SnailJobMapReduceException("The Next taskName can not be {}", SystemConstants.MAP_ROOT);
}
// 使用ThreadLocal传递数据
JobContext jobContext = JobContextManager.getJobContext();
Assert.notNull(jobContext, () -> new SnailJobMapReduceException("job context is null"));
// 1. 构造请求
MapTaskRequest mapTaskRequest = new MapTaskRequest();