标签归档:java

classloader隔离练习

平时,我们用maven来管理项目的依赖包,可是有时候还是会出现jar包多版本同时存在的问题,这时,我们可以利用classloader的隔离机制来解决。 1.我们自定义classloader,然后设置它为应用的contextClassLoader运行。 2.自定义classLoader加载特定目录的jar包,同时把加载过的Class缓存起来,这时classLoader就起到隔离作用,像一个容器,只装自己的jar包。 3.Class的查找机制,如果自定义classLoader里加载过,取出来直接返回,没有则用父classLoader查找加载。 4.自定义classLoader加载自己指定目录的jar包,父classLoader则加载classpath里的包或者类。 可能说的比较简洁,大家感兴趣还是直接看代码吧。 练习代码看这里

发表在 编程语言 | 标签为 | Comments Off on classloader隔离练习

学习ClassLoader和自定义ClassLoader的使用

这几天在看ClassLoader,推荐一篇讲ClassLoader的文章,地址:http://longdick.iteye.com/blog/442213,然后又看了下《深入java虚拟机》里的ClassLoader章节,下面就随便说点,主要还是以练习代码为主。 1.对于任意一个类,由加载它的ClassLoader和它本身决定了在java虚拟机中的唯一性。 也就是说比较2个类,只有它们都是由同一个ClassLoader加载,那么比较才有意义。否则,即使是同一个类文件,如果加载它们的ClassLoader不同,那么这2个类必定不相等。 2.类加载的双亲委派机制是可以破坏的,通过改变CallClassLoader和ContextClassLoader。 被当前类引用的类的加载也是由加载当前类的ClassLoader加载,子线程的ContextClassLoader是由父线程的ContextClassLoader派生出来。 3.扩展ClassLoader一般应该建议重写findClass(String)方法。 原因是自定义的ClassLoader只专注于加载自己的Class,在加载自己的Class的过程中,又会先加载父类Object,Object类是由启动类加载器加载的,默认可以直接由loadClass(String)执行,这么做可以用ClassLoader来选择性加载某一些类做隔离。 贴代码 自定义ClassLoader,重写loadClass()。 测试类 执行结果: sun.misc.Launcher$AppClassLoader@addbf1 ==> 当前上下文类加载器是应用类加载器 sun.misc.Launcher$ExtClassLoader@42e816 ==> 应用类加载器的父类加载器是扩展类加载器 null ==> 扩展类加载器的父类加载器是启动类加载器,因为启动类加载器是C++编写,java里获取不到 class com.zoo.classloader.ClassLoaderTest ==> 自定义类加载器加载进行加载 com.zoo.classloader.MyClassLoader@1fb8ee3 ==> 通过Class对象获取它的类加载器 false ==> 同一个Class,不同的类加载器加载,那么Class不相等 hello world ==> 被自定义类加载器加载的Class在程序中执行 sun.misc.Launcher$AppClassLoader@addbf1 ==> 获取当前上下文类加载器 com.zoo.classloader.MyClassLoader@1fb8ee3 ==> 设置上下文类加载器 … 继续阅读

发表在 编程语言 | 标签为 | Comments Off on 学习ClassLoader和自定义ClassLoader的使用

dubbo-http-thrift随笔

前几天应两个哥们的需求,需要一个http协议的thrift服务,具体的需求2点: 1.请求方式是http,然后采用thrift序列化。 2.能够传递隐藏参数在http的header里。 这个周末,2个下午,在公司整出了一个beta版本,具体还有很多地方需要优化,下面会列出具体的优化点。代码地址:https://github.com/yankai913/dubbo-http-thrift,感兴趣的哥们可以去看下。 先说说thrift,如果Getting Started,直接官网http://thrift.apache.org/即可,这里说一下目前最新的版本是0.9.1的新特性,地址:https://issues.apache.org/jira/browse/THRIFT-563,简单点说就是,以前的版本一个端口只能暴漏一个服务,原因取决于TMessage的只传了methodName,而最新的版本methodName里包含了serviceName和methodName,这样,就算方法名相同,但是还有serviceName可以区分,这样一个端口就可以暴露多个服务了。 再说说dubbo,如果Getting Started,直接官方https://github.com/alibaba/dubbo,这里说下关于http的,dubbo暴露http服务时,httpServer有2种,一种是内嵌jetty,在jetty里开个用来处理请求的线程池,这种是默认的,另一种是servlet,配置里是server=servlet,但是它依赖于servlet容器启动来暴露服务,例如tomcat,处理线程交给tomcat管理,这种是推荐的。使用http时,采用了2种序列化,hessian和java自身的序列化,这里加了一种thrift的序列化。 接着说说优化点: 1.代码里写着需要优化或者TODO的地方都要修复。 2.注意类的加载避免内存溢出,减少字节数组的复制。 3.thrift里的序列化方式,代码里hardCode了是二进制,其他的方式应该还有json什么的,需要做个开关,自由选择。 4.序列化和反序列化的优化。 5.暴漏扩展handler。 6.异常容错的处理和response响应里的异常处理。

发表在 编程语言 | 标签为 , , , | Comments Off on dubbo-http-thrift随笔

hbase学习(一)hbase单机部署和java客户端连接单机hbase

最近看了些hbase的东西,打算写点什么,谁知鼓捣的过程中步步是坑,最终呕心沥血,憋出了这篇文章,实属不易。 hbase和hive总是成对出现的,简单说,hbase是数据库,hive是mapReduce作业。 先从hbase单机部署说起,尽量说的简洁点,说多了都是眼泪。 1.给服务器起个机器名,iptables关掉,同时本地绑定host。 起个机器名 127.0.0.1 localhost 211.155.225.210 love-kaige NETWORKING=yes HOSTNAME=love-kaige 关闭iptables 本地绑定host C:\Windows\System32\drivers\etc\hosts 211.155.225.210 love-kaige 然后reboot重启机子,执行 hostname显示love-kaige,service iptables status 显示 iptables: Firewall is not running. 即OK。 2.下载安装jdk和hbase。 jdk应该关系不大,我安装的是jdk-7u51-linux-x64.rpm,环境变量配好即可,此处略过。 hbase下载的是稳定版,地址:http://mirrors.aliyun.com/apache/hbase/stable/hbase-0.94.18.tar.gz。阿里云对apache下的项目和linux不同的发行版都做了镜像,方便了广大的码农,给个赞。 解压hbase,然后对hbase-site.xml进行修改,修改如下: 然后去hbase的bin目录,./start-hbase.sh起起来。 3.编写java代码。 添加依赖: 服务端和客户端的版本最好一致,现在都是0.94.18,免得出现莫名奇妙的问题。hadoop的版本和hbase的版本也有对应关系,把官网的hbase和hadoop的版本匹配表搬过来, Table 2.1. Hadoop version support matrix HBase-0.92.x … 继续阅读

发表在 数据库, 编程语言 | 标签为 , | Comments Off on hbase学习(一)hbase单机部署和java客户端连接单机hbase

Guice系列之用户指南(十二)

原文地址:https://code.google.com/p/google-guice/wiki/InjectingProviders InjectingProviders(注入的提供者):通过注入提供者来产生对象支持依赖注入。 和普通的依赖注入一样,每一种类型都能够确切地获取它所依赖的实例。RealBillingService包含CreditCardProcessor和TransactionLog,当灵活性是必须地时,Guice会绑定一个提供者,当调用get()方法时,提供者会产生一个对象的值。 这个提供者的类型是通过泛型参数来区分的,在Provider和Provider之间。只要是注入值的地方都可以通过注入提供者来代替。 对每一种绑定或者是注解,注入器都有内建绑定的相应的提供者。 Providers for multiple instances(不同实例的提供者):顾名思义。 在使用提供者的过程中,你可能需要一种类型的不同实例。设想当一个披萨支付失败时,你的应用程序正在保存一个概括条目和一个详细订单。用各种提供者,你就能随时获取一个新的条目: Providers for lazy loading(延时加载的提供者):在提供者里做部分逻辑延迟产生大对象。 当你在获取关于一个类型的依赖,同时这个依赖的创建开销又特别的大时,你能够用提供者来推迟这项工作。当你不是非常需要这个依赖时,这是很有用的: Providers for Mixing Scopes(混合作用域的提供者):提供者产生不同作用域的对象。 依赖一个很窄的作用域的对象是一个错误,设想你使用了单例的事务日志,但是这个事务日志对当前用户需要用的是请求作用域。如果你直接注入用户就会出错,因为用户是随着请求的改变而改变的。自从提供者能够按需的产生对象值,它们使你安全的混合多个作用域成为可能:

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(十二)

Guice系列之用户指南(十一)

原文地址:https://code.google.com/p/google-guice/wiki/Injections Injections(各种注入):常见的有构造函数注入,set方法注入,成员变量注入,前面几篇提到过,就说说没有提到的。 Optional Injections(可选择的注入):就是在注入时可以选择使用注入,通过@Inject(optional=true)实现。 或者是在成员变量上: On-demand Injection(按需注入):方法注入或者变量注入可能用在初始化一个已经存在的实例。你可以用Injector.injectMembers API: Static Injections(静态注入):不推荐,依赖关系不透明和受类的全局状态影响。 Automatic Injection(自动注入):自动注入 Guice自动注入有如下情况: 在绑定代码中,实例被传递到toInstance() 在绑定代码中,provider实例被传递到toProvider()

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(十一)

Guice系列之用户指南(十)

原文地址:https://code.google.com/p/google-guice/wiki/Scopes Scopes:作用域。 默认情况下,Guice每次在调用时都会返回一个新的实例,这种行为是可以通过作用域配置的,作用域允许复用对象实例。在一个应用服务的生命周期中,对象可能是单例的(@Singleton),也可能是一个回话的(@SessionScoped),也可能是一个请求的(@RequestScoped)。Guice在web应用中也包含一个servlet扩展的作用域。自定义作用域可以在不同类型的应用中使用。 Applying Scopes 作用域使用有不用的方式,例如注解, 也可以配置在代码里, 也可以注解在@Provides方法处, 如果有些冲突的作用域同时在一个类型上或者代码里的bind()方法上配置,那么bind()的配置生效。如果一个类型你不想给它设置要作用域,那么就绑定Scopes.NO_SCOPE。 像链接绑定那样,作用域应用于绑定的父类型,而不是绑定目标实现类。设想我们有一个同时实现Bar接口和Grill接口的实现类Applebees,这就要求需要同时绑定的这两种类型,一种是类型Bar,另一种是Grill: 这是因为作用域应用于这个绑定的类型(Bar,Grill),而不是满足这个类型的实现类Applebees,为了允许只有一个实例,用一个注解@Singleton声明在父类型上,或者在代码里绑定。 这种绑定使得以上的其他两种.in(Singleton.class)语句不必要。这种in()语句还接受像RequestScoped.class或者是ServletScopes.REQUEST的注解: 这种注解是推荐优先的,因为它允许这个模块在不同的类型应用中复用,打个比方,一个被@RequestScoped注解的对象即能够在web应用的http请求中被使用,也可以在一个API服务器的rpc中被使用。 Eager Singletons Eager Singletons(各种饥渴的单例):不是延迟的,是饿汉式的单例。 Guice有特殊的语法定义把单例为饿汉式的: Guice有特殊的语法定义把单例为饥渴的: 饿汉式的单例可以很快揭示初始化问题,并确保最终用户获得一致的,直观的体验。懒汉式的单例保证了一个快速的编辑-完成-启动的开发周期,用这个Stage的枚举可以区分那种策略被使用: PRODUCTION DEVELOPMENT .asEagerSingleton() eager eager .in(Singleton.class) eager lazy .in(Scopes.SINGLETON) eager lazy @Singleton eager* lazy Guice会在已知类型的情况下创建饿汉式单例,这些类型都是在自己的模块,并加上这些类型递归依赖提到的类型。

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(十)

Guice系列之用户指南(九)

原文地址:https://code.google.com/p/google-guice/wiki/JustInTimeBindings JustInTimeBindings(即时绑定):主要是在@ImplementedBy和@ProvidedBy实现。 贴代码: 执行结果: Cat i am a cat Provider.get() Student i am a student 练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(九)

Guice系列之用户指南(八)

原文地址:https://code.google.com/p/google-guice/wiki/BuiltInBindings Built-in Bindings(内建的绑定):即时在injector内的绑定。例如Loggers等。 贴代码: 执行结果: Injector{bindings=[InstanceBinding{key=Key[type=com.google.inject.Stage, annotation=[none]], source=[unknown source], instance=DEVELOPMENT}, ProviderInstanceBinding{key=Key[type=com.google.inject.Injector, annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider}, ProviderInstanceBinding{key=Key[type=java.util.logging.Logger, annotation=[none]], source=[unknown source], scope=Scopes.NO_SCOPE, provider=Provider}]} 练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(八)

Guice系列之用户指南(七)

原文地址:https://code.google.com/p/google-guice/wiki/ToConstructorBindings Constructor Bindings(构造器绑定):在父类型上绑定子类实现的构造函数。 贴代码: 执行结果: run AnimalModule.configure() run Cat.constructor() name==>Tom i am a cat 练习代码在这里

发表在 编程语言 | 标签为 , | Comments Off on Guice系列之用户指南(七)