package com.baidu.ub.common.commons; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import com.github.knightliao.apollo.db.bo.BaseObject; /** * 线程执行的上下文内容 */ public class ThreadContext { /** * 线程上下文变量的持有者 */ private final static ThreadLocal<Map<String, Object>> CTX_HOLDER = new ThreadLocal<Map<String, Object>>(); static { CTX_HOLDER.set(new HashMap<String, Object>()); } /** * 添加内容到线程上下文中 * * @param key * @param value */ public final static void putContext(String key, Object value) { Map<String, Object> ctx = CTX_HOLDER.get(); if (ctx == null) { return; } ctx.put(key, value); } /** * 从线程上下文中获取内容 * * @param key */ @SuppressWarnings("unchecked") public final static <T extends Object> T getContext(String key) { Map<String, Object> ctx = CTX_HOLDER.get(); if (ctx == null) { return null; } return (T) ctx.get(key); } /** * 获取线程上下文 */ public final static Map<String, Object> getContext() { Map<String, Object> ctx = CTX_HOLDER.get(); if (ctx == null) { return null; } return ctx; } /** * 删除上下文中的key * * @param key */ public final static void remove(String key) { Map<String, Object> ctx = CTX_HOLDER.get(); if (ctx != null) { ctx.remove(key); } } /** * 上下文中是否包含此key * * @param key * * @return */ public final static boolean contains(String key) { Map<String, Object> ctx = CTX_HOLDER.get(); if (ctx != null) { return ctx.containsKey(key); } return false; } /** * 清空线程上下文 */ public final static void clean() { CTX_HOLDER.set(null); } /** * 初始化线程上下文 */ public final static void init() { CTX_HOLDER.set(new HashMap<String, Object>()); } /** * 获取用来做分库分表的key */ @SuppressWarnings("unchecked") public final static <K extends Serializable> K getShardKey() { return (K) getContext(SHARD_KEY); } /** * 设置做分表分库的切分的key */ public final static <K extends Serializable> void putShardKey(K shardKey) { putContext(SHARD_KEY, shardKey); } /** * 获取Session中的用户信息 */ @SuppressWarnings("unchecked") public final static <U extends BaseObject<?>> U getSessionVisitor() { return (U) getContext(VISITOR_KEY); } /** * 设置做分表分库的切分的key */ public final static <K extends Serializable, U extends BaseObject<K>> void putSessionVisitor(U sessionVisitor) { putContext(VISITOR_KEY, sessionVisitor); } /** * 线程日志的级别 */ public final static void putThreadLog(Integer logLevel) { putContext(THREAD_LOG_KEY, logLevel); } /** * 获取线程日志的级别 */ public final static Integer getThreadLog() { return getContext(THREAD_LOG_KEY); } /** * 设置会话ID数据 */ public final static void putSessionId(String sessionId) { putContext(SESSION_KEY, sessionId); } /** * 获取会话ID数据 */ public final static String getSessionId() { return getContext(SESSION_KEY); } /** * 清空会话ID数据 */ public final static void removeSessionId() { remove(SESSION_KEY); } private final static String SHARD_KEY = "shardKey"; /** * 当前Session中登陆的user */ private final static String VISITOR_KEY = "sessionVisitor"; /** * 线程的日志级别 */ private final static String THREAD_LOG_KEY = "threadLog"; /** * 会话ID */ private final static String SESSION_KEY = "sessionId"; }