`
jarpy
  • 浏览: 22187 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

通过Dynamic proxy 和 Thread local 进行 connection 管理

阅读更多

 

 

public class CassandraAutopubStoreClient implements  InvocationHandler{
	static Logger log = LoggerFactory.getLogger(CassandraAutopubStoreClient.class);
	
	// The next serial number to be assigned
    private static int nextSerialNum = 0;

    private static ThreadLocal<Client> localClient = new ThreadLocal<Client>();

    public static Client getCurrentThreadClient() {
        return localClient.get();
    }

     
	
	private Object store;

    public static Object newInstance(CassandraAutopubStore store) {
	return java.lang.reflect.Proxy.newProxyInstance(
			CassandraAutopubStore.class.getClassLoader(),
			CassandraAutopubStore.class.getInterfaces(),
	    new CassandraAutopubStoreClient(store));
    }

    private CassandraAutopubStoreClient(CassandraAutopubStore store) {
	this.store = store;
    }

	    
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		 Object result;
			try {
//				if ("getClient".equals(method.getName())){
//					Client client = getCurrentThreadClient();
//					assert client!=null;
//					return client;
//				}else{
					//create client and put the client into threadlocal
					Client client=createClient();
					localClient.set(client);
				    result = method.invoke(store, args);
				    client.getInputProtocol().getTransport().close();
				    localClient.remove();
//				}
		        } catch (InvocationTargetException e) {
			    throw e.getTargetException();
		        } catch (Exception e) {
			    throw new RuntimeException("unexpected invocation exception: " +
						       e.getMessage());
			} finally {
			    System.out.println("after method " + method.getName());
			}
			return result;
	}
	
	public static Client createClient(){
		//TODO: cache the client for reuse property
		TTransport tr = new TSocket("localhost", 9160);
		try {
			tr.open();

		} catch (TTransportException e) {
			throw new StoreException(log, "Cassandra is not running", e);
		}
		log.info("Created CassandraStore connection " + System.identityHashCode(tr));
		final TProtocol proto = new TBinaryProtocol(tr);
		return new Cassandra.Client(proto);
	}

}

 

public StandAloneServer() throws Exception {
		
		System.out.println("Starting REST server on http://"
				+ InetAddress.getLocalHost().getHostAddress() + ":" + PORT
				+ "/");
		component.getServers().add(Protocol.HTTP, PORT);
		component.getDefaultHost().attach(new OpenAutopub());
		component.getDefaultHost().attach("/resources",new StaticResourceApplication());
		component.getClients().add(Protocol.CLAP);
		component.start();
		store = (AutopubStore) CassandraAutopubStoreClient.newInstance(new CassandraAutopubStore(){
			@Override
			public Client getClient() {
				Client client = CassandraAutopubStoreClient.getCurrentThreadClient();
				if (client ==null){
					client = super.getClient();
				}
				return client;
			}
		});
		AutopubResource.setStorage(store);
		
	}
 
分享到:
评论

相关推荐

    Castle Dynamic Proxy代理使用

    Castle Dynamic Proxy使用Emit和委托等技术生成代理类型,调用真实类的方法,性能方面也没有太多损失。 Castle Dynamic Proxy的主要特点包括: 1. 动态生成代理类型: Castle Dynamic Proxy可以动态生成透明代理...

    08spring4_dynamicproxy.rar

    package cn.sxt.dynamicproxy; import java.util.ArrayList; import java.util.List; import cn.sxt.service.UserService; import cn.sxt.service.UserServiceImpl; public class Client { public ...

    SpringIOC,DI+dynamic proxy 实现盗版AOP

    IOC,即Inversion of Control,它的核心思想是将对象的创建和管理权交由容器来负责。在Spring框架中,我们通过配置XML或使用注解来定义对象及其依赖关系,Spring容器会根据这些配置自动创建并管理对象,这样开发者...

    Castle.DynamicProxy.zip

    总结来说,Castle.DynamicProxy通过提供动态代理功能,使得我们能够在运行时对方法调用进行控制,从而绕过因.NET 4.0类型查找机制变化而引发的问题。这种解决方案不仅适用于IBatisNET v1.x,对于其他类似情况也可能...

    DynamicProxy.zip

    DynamicProxy.zip

    Castle.DynamicProxy2.dll

    Castle框架注入依赖所需dll Version:2.1.0.0

    DynamicProxy

    这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!

    Dynamic Proxy

    绿色软件,无需安装,可以自动添加、修改代理服务器ip地址

    WCF.rar_ChannelFactory_WCF DynamicProxy_WCF 动态_wcf 动态调用_动态WCF

    在本示例中,`ChannelFactory` 和 `DynamicProxy` 是两个关键概念,它们与WCF中的动态调用密切相关。 **ChannelFactory** 是WCF客户端编程模型中的一个重要组件。它是一个工厂模式的实现,用于创建与服务契约相匹配...

    反射与动态代理Reflection&DynamicProxy.zip

    Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...

    LinFu.DynamicProxy.dll

    配合 LinFu.DynamicProxy 1.0.4.18998 NHibernate使用中框架动态代理方式 LinFu框架 如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为 ...

    java reflect and dynamic proxy .Java反射和动态代理

    **Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....

    DynamicProxy源码

    动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    它通过设置`esri.config.defaults.io.proxyUrl`来指定代理服务的URL,当ArcGIS JavaScript API请求需要跨域访问的资源时,会自动通过这个代理转发请求。在Java应用中,你需要将`proxy.jsp`部署到服务器,并在Esri的...

    MEF+Caliburn.Micro+Validation+AOP

    例如,通过MEF加载实现`INotifyDataErrorInfo`接口的验证服务,这些服务可以利用Castle DynamicProxy来拦截和增强视图模型的方法调用,进行数据验证。同时,Caliburn.Micro则负责处理视图和视图模型的交互,提供简单...

    dynamicProxy.rar

    主要写了静态代理、动态代理、还写了URL的使用,其实就是下载的原理了。 动态代理动态代理动态代理动态代理

    DYNAMIC PROXY

    代理模式是设计模式中的一种,它提供了一种对目标对象进行增强的手段,即在不修改原有对象代码的情况下,通过代理对象来扩展或拦截目标对象的功能。在Java中,动态代理主要依赖于两个接口:`java.lang.reflect....

Global site tag (gtag.js) - Google Analytics