系统服务处理过程通常会有很多透传参数,每次请求实际使用到的参数不尽相同。将透传参数以服务处理上下文的形式存储在Threadlocal中,可以简化代码内部逻辑,避免参数的显示传递。服务处理上下文包含所有需要的参数,通过建造者模式在每次请求处理前只需构造当次需要的参数。
public class ServiceProcessContext {
/** requestId */private String requestId;
/** requestTime */
private Date requestTime;
/**
* 上下文建造者
*/
public static class Builder {
/** 被建造的上下文 */
private final ServiceProcessContext serviceProcessContext;
/**
* 构造函数
*/
public Builder() {
serviceProcessContext = new ServiceProcessContext();
}
/**
* 返回被建造的上下文
*
* @return 被建造的上下文
*/
public ServiceProcessContext build() {
return this.serviceProcessContext;
}
/**
* 为上下文构造请求时间
*
* @param requestTime 请求时间
* @return 建造器
*/
public Builder setRequestTime(Date requestTime) {
this.serviceProcessContext.requestTime = requestTime;
return this;
}
/**
* 为上下文构造请求ID
*
* @param requestId 请求ID
* @return 建造器
*/
public Builder setRequestId(String requestId) {
this.serviceProcessContext.requestId = requestId;
return this;
}
}
/**
* Getter method for property <tt>requestId</tt>.
*
* @return property value of requestId
*/
public String getRequestId() {
return requestId;
}
/**
* Getter method for property <tt>requestTime</tt>.
*
* @return property value of requestTime
*/
public Date getRequestTime() {
return requestTime;
}
}
public class ContextHolder {
/** 本地线程 */
private static final ThreadLocal<ServiceProcessContext> CONTEXT_LOCAL = new ThreadLocal<ServiceProcessContext>();
/**
* 取得操作上下文
*
* @return 上下文
*/
public static ServiceProcessContext get() {
if (exists()) {
return CONTEXT_LOCAL.get();
}
throw new ServiceBizException(CommonError.SERVICE_CONTEXT_NOT_EXIST);
}
/**
* 检查当前是否存在上下文
*
* @return true如果当前是否存在上下文,否则false
*/
public static boolean exists() {
return CONTEXT_LOCAL.get() != null;
}
/**
* 设置上下文
*
* @param context 上下文
*/
public static void set(ServiceProcessContext context) {
CONTEXT_LOCAL.set(context);
}
/**
* 清理上下文
*/
public static void clear() {
CONTEXT_LOCAL.remove();
}
}
构造和使用示例:
ServiceProcessContext serviceProcessContextt = new ServiceProcessContext.Builder().setRequestId("requestId").setRequestTime(new Date()).build();
ContextHolder.set(serviceProcessContextt);
ContextHolder.get()
ContextHolder.clear()