package com.iailab.framework.tenant.core.mq.redis;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.iailab.framework.mq.redis.core.interceptor.RedisMessageInterceptor;
|
import com.iailab.framework.mq.redis.core.message.AbstractRedisMessage;
|
import com.iailab.framework.tenant.core.context.TenantContextHolder;
|
|
import static com.iailab.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID;
|
|
/**
|
* 多租户 {@link AbstractRedisMessage} 拦截器
|
*
|
* 1. Producer 发送消息时,将 {@link TenantContextHolder} 租户编号,添加到消息的 Header 中
|
* 2. Consumer 消费消息时,将消息的 Header 的租户编号,添加到 {@link TenantContextHolder} 中
|
*
|
* @author iailab
|
*/
|
public class TenantRedisMessageInterceptor implements RedisMessageInterceptor {
|
|
@Override
|
public void sendMessageBefore(AbstractRedisMessage message) {
|
Long tenantId = TenantContextHolder.getTenantId();
|
if (tenantId != null) {
|
message.addHeader(HEADER_TENANT_ID, tenantId.toString());
|
}
|
}
|
|
@Override
|
public void consumeMessageBefore(AbstractRedisMessage message) {
|
String tenantIdStr = message.getHeader(HEADER_TENANT_ID);
|
if (StrUtil.isNotEmpty(tenantIdStr)) {
|
TenantContextHolder.setTenantId(Long.valueOf(tenantIdStr));
|
}
|
}
|
|
@Override
|
public void consumeMessageAfter(AbstractRedisMessage message) {
|
// 注意,Consumer 是一个逻辑的入口,所以不考虑原本上下文就存在租户编号的情况
|
TenantContextHolder.clear();
|
}
|
|
}
|