自定义ClassLoader在一个JVM启动多个Peer实例
为了解决在同一个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);
- linux 只启动一个进程实例
- 程序只启动一个实例的几种方法
- C#.NET禁止一个程序启动多个实例
- C / C++ 如何让程序只启动一个实例
- Wuyin.ShoesManager.Start 程序源代码(包括只启动一个实例及使用XP控件技术)
- 如何在idea中一个工程中启动多个实例?
- 让应用程序只运行一个实例,避免重复启动
- 一个应用程序只启动一个实例
- C# 只启动一个实例完全解决方案
- 限制启动一个程序实例
- Solr 启动一个SolrCloud实例所需要的所有配置和相关参数
- 如何让应用程序只启动一个实例
- Shark编程实例:启动一个流程,获得所有任务的列表,完成一个任务
- Eucalyptus-利用镜像启动一个Windows Server 2008r2实例
- Eucalyptus-利用镜像启动一个Centos实例
- 程序只启动一个实例的几种方法
- 实例:创建、启动、停止和绑定一个Service
- 使用QtSingleApplication,实现应用只启动一个实例
- Oracle同一个用户下启动多个数据库实例报错记录
- 如果vagrant up启动后,所有东西都没有了,可能是启动了一个新的实例,