package cn.org.rapid_framework.distributed.threadlocal.hessian; import java.io.IOException; import java.net.URL; import java.util.Map; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.org.rapid_framework.distributed.threadlocal.DistributedThreadLocal; import com.caucho.hessian.client.HessianConnection; import com.caucho.hessian.client.HessianConnectionFactory; import com.caucho.hessian.client.HessianProxyFactory; /** * HessianConnectionFactory的代理类,用于将DistributedThreadLocal中的信息存放在 Hessian 的Http Header中 * * 注意:由于 http header大小的限制,所以DistributedThreadLocal的信息不能大于4K * * @author badqiu */ public class DistributedThreadLocalHessianConnectionFactory implements HessianConnectionFactory { private static Log log = LogFactory.getLog(DistributedThreadLocalHessianConnectionFactory.class); private HessianConnectionFactory delegate; public DistributedThreadLocalHessianConnectionFactory( HessianConnectionFactory delegate) { this.delegate = delegate; } public HessianConnection open(URL url) throws IOException { DistributedThreadLocal.onBeforeRemoteCall(); HessianConnection conn = delegate.open(url); Map<String, String> map = DistributedThreadLocal.getMap(); Set<String> keySet = map.keySet(); for (Map.Entry<String, String> entry : map.entrySet()) { conn.addHeader(DistributedThreadLocal.DISTRIBUTED_THREAD_LOCAL_KEY_PREFIX+entry.getKey(),entry.getValue()); } if(log.isDebugEnabled()) { log.debug("set hessian http headers for DistributedThreadLocal:"+map); } return conn; } public void setHessianProxyFactory(HessianProxyFactory factory) { delegate.setHessianProxyFactory(factory); } }