为了解决在同一个JVM中启动多个peer进行测试而带来的烦恼,通过大量收集资料最后找到一种可行的解决方案,而由于国内博客系统未提及相关解决方案,特贡献出来,以免大家少走弯路。
在我们开始相对两个或则更多的peer的交互进行测试时,都会遇到下面这种情况:
net.jxta.exception.PeerGroupException: Only a single instance of the World Peer Group may be instantiated at a single time.
我们可以通过采用自定义类加载器的方式,在同一个JVM中对同一个类定义多个副本,并创建该类的实例,使得每个类定义的副本都有同样的行为;但是需要注意的是,每个类定义的副本不能进行转换,比如:ClassLoaderA中有类A的副本B,同样的ClasLoaderB中有类A的副本C,通过类C创建的实例是不能转换成ClassLoaderA中类B;因为JVM将类A副本B,C看待成两个两个不相干的类;类似于类的继承关系,B,C都继承于A,但是B,C除了有A共同的特征之外,其他特征完全不一样,所以两个相同的副本是不能相互转变换的。
(ˇˍˇ) ,最后向大家介绍我通过类加载器实现同一JVM中启动多个peer的解决方案:
首先,每个Peer都是由JxtaLifeCycle类来管理其生命周期,在start方法中初始化peer并启动。execute方法中执行相关的动作,如:发送/接受消息,发现/发布Advertisement,等。stop方法中停止并销毁Peer.
public interface JxtaLifeCycle { /** * 启动 * * @param config * @throws Exception */ void start(InstanceConfig config) throws Exception; /** * 执行相关操作 * * @throws Exception */ void execute() throws Exception; /** * 停止 * * @throws Exception */ void stop() throws Exception; }
然后通过Jxta.of(..)/Jxta.startAs(..)方法创建或启动一个peer实例,非常简单易用。
@Test public void startAnyNumberOfPeers() throws Exception { int id = 0; for (any of : times) { Jxta.startAs(Sender.class, named("sender-" + id++)); } }
采用如上的方法方便喜欢写测试的同伴们扫清JXTA在测试中启动多个peer实例的障碍。当然该实现最大的功臣还的归结于PeerClassLoader,由于时间仓促并没有记下获取该PeerClassLoader的地址,大家可以通过google进行搜索PeerClassLoader关键字,应该会有所收获。
最后附上该解决方案的源码(jxta-test-supports-2.5-sources.jar)以及例子源码(jxta-test-supports-2.5-test-sources.jar);
相关推荐
自定义classloader的使用
热修复和插件化是目前比较热门的技术,要想更好的掌握它们需要了解ClassLoader,下面这篇文章主要给大家介绍了关于Android中自定义ClassLoader耗时问题追查的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧
ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的ClassLoader运行机制 自己写的
让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的....
Java ClassLoader定制实例
JVM ClassLoader简析.压缩包中文档和示例代码
java自定义类加载classloader文档,包括代码,以及详细的原理及过程
运用代理模式,通过自定义classloader对代码加密,啊;敌法;打飞机
虽然这个项目本身意义不大,但我相信在你的项目中创建自己的 REPL 是一个很好的起点! :) #与Scala默认REPL有何不同? 表明 自定义 ClassLoader 加载任何类时的类名。 ":myCommand" 命令位于默认 REPL 命令之上。...
这篇文章主要讲类加载器在android中如何动态的加载其他工程类的过程,对于类加载器的知识就跳过了。
eclipse工程格式 博文链接:https://aga.iteye.com/blog/200818
classloader 源码,自定义classloader
介绍了Java堆的分析方法,以一个实例为基础,展示对堆的分析过程。 第九课 锁 baise锁 轻量级锁 自旋锁 介绍JVM中对多线程锁的实现。 第十课 class文件结构 ASM库介绍 介绍JVM规范中的最重要的内容——Class文件...
案1:修改序列化byte数据该法可解决序列化最终数据的serialVesionUID不致,但法解决Object的serialVesionUID不案2:反射修改s
自定义ClassLoader,控制台输入调试。 运行期间 重新载入指定目录的class文件。可实现对于类的功能函数更新。 用到java 反射,@interface 等技术
3-7Tomcat中自定义类加载器的使用与源码实现(1).mp4
内容简介: ClassLoader体系结构 类装载器在JVM中并不是唯一的,JVM自带了三个装载器,用户也可以根据自己的需求自定义新的装载器,这些装载器的体系结构可以看作是树状结构,如图1所示:
索引类加载器一个自定义的 JVM 类加载器,它为类路径元素编制索引,以便更快地定位类/资源。 构建: ./make-jar.sh 要使用,将indexed-classpath.jar添加到类路径并设置-Djava.system.class.loader=org.pantsbuild....
关于J2EE服务器的ClassLoader的原理,该文档清晰了揭示了jvm装载类的顺序,同时用户可以自定义修改classLoader的配置 通过该文档,可以加深对Java虚拟机的理解