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使用Emit和委托等技术生成代理类型,调用真实类的方法,性能方面也没有太多损失。 Castle Dynamic Proxy的主要特点包括: 1. 动态生成代理类型: Castle Dynamic Proxy可以动态生成透明代理...
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 ...
IOC,即Inversion of Control,它的核心思想是将对象的创建和管理权交由容器来负责。在Spring框架中,我们通过配置XML或使用注解来定义对象及其依赖关系,Spring容器会根据这些配置自动创建并管理对象,这样开发者...
总结来说,Castle.DynamicProxy通过提供动态代理功能,使得我们能够在运行时对方法调用进行控制,从而绕过因.NET 4.0类型查找机制变化而引发的问题。这种解决方案不仅适用于IBatisNET v1.x,对于其他类似情况也可能...
DynamicProxy.zip
Castle框架注入依赖所需dll Version:2.1.0.0
这是动态代理的简单实例,方便学,入手.这个例子非常的简单哦!
绿色软件,无需安装,可以自动添加、修改代理服务器ip地址
在本示例中,`ChannelFactory` 和 `DynamicProxy` 是两个关键概念,它们与WCF中的动态调用密切相关。 **ChannelFactory** 是WCF客户端编程模型中的一个重要组件。它是一个工厂模式的实现,用于创建与服务契约相匹配...
Java反射(Reflection)和动态代理(Dynamic Proxy)是Java编程中的高级特性,它们为程序提供了强大的功能和灵活性。本文将深入探讨这两个主题,并通过源码分析来加深理解。 首先,让我们了解一下Java反射。反射机制...
配合 LinFu.DynamicProxy 1.0.4.18998 NHibernate使用中框架动态代理方式 LinFu框架 如果使用LinFu.DynamicProxy动态代理,引用NHibernate.ByteCode.LinFu.dll程序集并配置proxyfactory.factory_class节点为 ...
**Java动态代理(Dynamic Proxy)** Java动态代理是Java提供的一种机制,可以在运行时创建具有特定接口的代理类。这通常用于实现AOP(面向切面编程)或事件处理等。主要由java.lang.reflect.Proxy和java.lang....
动态代理(DynamicProxy)是Java中一种强大的设计模式,它允许在运行时创建代理对象,这些代理对象可以作为原对象的“代理”,在调用原对象的方法时添加额外的功能,如日志、性能监控、事务处理等。在Java中,`java....
它通过设置`esri.config.defaults.io.proxyUrl`来指定代理服务的URL,当ArcGIS JavaScript API请求需要跨域访问的资源时,会自动通过这个代理转发请求。在Java应用中,你需要将`proxy.jsp`部署到服务器,并在Esri的...
例如,通过MEF加载实现`INotifyDataErrorInfo`接口的验证服务,这些服务可以利用Castle DynamicProxy来拦截和增强视图模型的方法调用,进行数据验证。同时,Caliburn.Micro则负责处理视图和视图模型的交互,提供简单...
主要写了静态代理、动态代理、还写了URL的使用,其实就是下载的原理了。 动态代理动态代理动态代理动态代理
代理模式是设计模式中的一种,它提供了一种对目标对象进行增强的手段,即在不修改原有对象代码的情况下,通过代理对象来扩展或拦截目标对象的功能。在Java中,动态代理主要依赖于两个接口:`java.lang.reflect....