yangyoupeng

添加ContexttransFilter,将threadContext里面的内容作为RPC的attachment

package com.zhaoonline.microservice.framework.support;
import java.util.Iterator;
import java.util.Map.Entry;
import com.alibaba.dubbo.common.Constants;
import com.alibaba.dubbo.common.extension.Activate;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.RpcInvocation;
/**
* class name:ContexttransFilter <BR>
* class description:将ThreadContext中所有key-value作为rpc的attachment传递给dubbo provider <BR>
* Remark: <BR>
* @version 1.00 2016年10月27日
* @author zhaoonline)yangyoupeng
*/
@Activate(group = {Constants.CONSUMER})
public class ContexttransFilter implements Filter{
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
ThreadContext threadContext=ThreadContext.getContext();
RpcInvocation invocation1 = (RpcInvocation) invocation;
setAttachment(threadContext, invocation1);//设置需要向下游传递的参数
Result result = invoker.invoke(invocation);
return result;
}
private void setAttachment(ThreadContext threadContext, RpcInvocation invocation) {
Iterator<Entry<String, Object>> contextIter=threadContext.entrySet().iterator();
while(contextIter.hasNext()){
Entry<String, Object> entry=contextIter.next();
invocation.setAttachment(entry.getKey(),String.valueOf(entry.getValue()) );
}
invocation.setAttachment(ThreadContext.KEY_REQUESTID,threadContext.getRequestID());
}
}
......@@ -25,7 +25,7 @@ public class ThreadContext extends ConcurrentHashMap<String, Object>{
*/
private static final long serialVersionUID = -7551338871443500983L;
public static final String KEY_REQUESTID="requestID";
public static final ThreadLocal<ThreadContext> local=new ThreadLocal<ThreadContext>(){
@Override
......
contexttrans=com.zhaoonline.microservice.framework.support.ContexttransFilter