普通传参
一、新增Filter文件
1、消费者过滤器:ConsumerFilter.java
package com.demo.Filter;
import com.alibaba.dubbo.rpc.*;
import com.demo.common.Filter.UserParameter;
import java.util.Map;
import java.util.UUID;
public class ConsumerFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Map<String, String> stringStringMap = invocation.getAttachments();
// 设置参数
stringStringMap.put("patentId","0");
stringStringMap.put("traceId",UUID.randomUUID().toString());
System.out.println("生成tradeId:"+stringStringMap.get("traceId"));
return invoker.invoke(invocation);
}
}
2、生产者过滤器:ProviderFilter.java
package com.demo.Filter;
import com.alibaba.dubbo.rpc.*;
import com.demo.common.Filter.UserParameter;
import java.util.Map;
public class ProviderFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Map<String, String> stringStringMap = invocation.getAttachments();
// 接收参数
System.out.println("收到:patentId:"+stringStringMap.get("patentId"));
System.out.println("收到:tradeId:"+stringStringMap.get("traceId"));
return invoker.invoke(invocation);
}
二、配置SPI Filter扩展文件
1、生产者配置
在目录:resources/META-INF/dubbo/ 创建com.alibaba.dubbo.rpc.Filter 文件
内容:
providerFilter=com.demo.Filter.ProviderFilter
2、消费者配置
在目录:resources/META-INF/dubbo/ 创建com.alibaba.dubbo.rpc.Filter
内容:
consumerFilter=com.demo.Filter.ConsumerFilter
注:META-INF/dubbo 必须转成目录,如果出现META-INF。dubbo样式,右键Mark Directory As=>Exclusion处理
三、配置dubbo文件
1、生产者
<dubbo:provider filter=“providerFilter” />
2、消费者
<!--过滤器配置-->
<dubbo:consumer filter="consumerFilter" />
运行,输出结果
消费者:
生成tradeId:0d89320e-b023-44e8-ace6-c077f7e59f69
提供者:
收到:patentId:0
收到:tradeId:5212f9e0-a4d8-455d-9d6d-7ffb66ab4873
ThreadLocal传参
一、新增ThreadLocal数据对象
public class UserParameter {
// 创建线程局部变量,并初始化值
private static ThreadLocal<String> userIdThreadLocal = new ThreadLocal<String>()
{
@Override
protected String initialValue()
{
return "";
}
};
// 提供线程局部变量set方法
public static void setUserId(String userId) {
userIdThreadLocal.set(userId);
}
// 提供线程局部变量get方法
public static String getUserId() {
return userIdThreadLocal.get();
}
}
二、消费者Controller调用方法写入数据‘
UserParameter.setUserId("黑白独行");
System.out.println("写入 UserId:" + UserParameter.getUserId());
三、消费者ConsumerFilter传入参数‘
invocation.getAttachments().put("userId", UserParameter.getUserId());
System.out.println("传入 UserId:" + UserParameter.getUserId());
四、提供者ProviderFilter接收参数‘
String userId = invocation.getAttachments().get("userId");
UserParameter.setUserId(userId);
System.out.println("收到 UserId:" + UserParameter.getUserId());
五、提供者Service实现方法获取参数‘
String userId = UserParameter.getUserId();
System.out.println("读取 UserId:" + UserParameter.getUserId());
运行,查看结果
消费者:
写入 UserId:黑白独行
传入 UserId:黑白独行
提供者:
收到 UserId:黑白独行
读取 UserId:黑白独行