`
阅读更多

为了解决在同一个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可以帮助我们隔离不同版本的类。每个版本的库可以有专属的Classloader,确保它们各自加载各自的类,防止版本冲突。 六、动态加载与卸载 自定义Classloader还可以实现...

    Java ClassLoader定制实例

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。理解ClassLoader的工作原理以及如何定制它,对于深入学习Java的运行机制和进行高级应用开发具有重要意义。本篇文章将...

    ClassLoader运行机制 自己写的

    1. Bootstrap ClassLoader:这是JVM启动时的第一个ClassLoader,负责加载JDK核心类库(如rt.jar)。 2. Extension ClassLoader:加载JDK扩展目录(如$JAVA_HOME/jre/lib/ext)中的类。 3. System ClassLoader(也...

    JVM ClassLoader简析

    Bootstrap ClassLoader是JVM启动时的第一个ClassLoader,负责加载JDK的`<JAVA_HOME>\lib`目录下的核心类库,如rt.jar。Extension ClassLoader则负责加载`<JAVA_HOME>\lib\ext`目录下的扩展类库。Application ...

    定义ClassLoader调用外部jar包

    在Java编程环境中,ClassLoader是一个至关重要的组件,它负责加载类到Java虚拟机(JVM)中。当我们需要从外部jar包动态加载类时,自定义ClassLoader就显得尤为关键。这篇博文"定义ClassLoader调用外部jar包"探讨了...

    Understanding the Java ClassLoader

    为了更好地理解和利用Java的这一特性,本篇将详细介绍Java ClassLoader的作用及其工作原理,并通过构建一个示例ClassLoader来帮助读者深入理解如何自定义ClassLoader,从而扩展JVM的功能。 #### 二、ClassLoader...

    classloader

    在Android系统中,类加载器(ClassLoader)是一个至关重要的组件,它负责查找并加载应用程序中的类。类加载器的工作机制是Java虚拟机(JVM)的一部分,但在Android中,由于其特殊的运行环境,类加载器的功能和使用...

    Java实现热加载完整代码;Java动态加载class;Java覆盖已加载的class;Java自定义classloader

    让Java支持热加载是个不错的想法。如何做到的呢? 1. 定义好接口和实现类 2. 让代理类通过反射的方式调用实现类,对外暴露的是代理类。 3. 自定义URLClassLoader。检查实现类.class文件的修改时间,如果是更新的....

    java自定义类加载classloader文档,包括代码

    上述代码展示了如何创建一个自定义类加载器`MyClassLoader`,该类继承自`java.lang.ClassLoader`。`MyClassLoader`的主要功能是从文件系统中加载指定类的二进制数据。 - **构造函数**:接受一个父类加载器和基础...

    ClassLoader小例子

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中,使得程序能够执行。本示例"ClassLoader小例子"将深入探讨这个概念,并通过一个具体的程序来演示其工作原理。下面我们...

    ClassLoader 案例

    本案例将深入探讨如何创建一个自定义的ClassLoader,利用Java反射和注解技术实现运行时功能更新。 首先,了解ClassLoader的工作原理。Java中的类加载过程分为三个阶段:加载、验证、准备、解析和初始化。默认情况下...

    JVM.zip_JVM代理_classloader

    JVM代理是一种在JVM启动时或者运行时插入额外功能的方式,它允许开发者在不修改源代码的情况下扩展或修改Java应用程序的行为。通常,JVM代理被用于性能监控、日志记录、动态字节码注入等场景。Java提供了一种标准...

    使用自定义ClassLoader解决反序列化serialVesionUID不一致问题 _ 回忆飘如雪1

    自定义`ClassLoader`的设计和实现是一个高级话题,需要深入理解Java的类加载机制。通过这种方式,可以有效地解决在反序列化过程中因`serialVersionUID`不一致导致的问题,同时减少潜在的副作用,提升程序的稳定性和...

    ClassLoader 详解.doc

    首先,JVM启动时,会构建一个类加载器的层次结构,主要包括三个基本类加载器: 1. Bootstrap ClassLoader:引导类加载器,也称为原始类加载器。它是整个加载过程的起点,负责加载Java的核心类库,如rt.jar,这是...

    探索JVM底层奥秘ClassLoader源码分析与案例讲解

    7. **线程上下文类加载器**:在多线程环境下,每个线程都关联有一个线程上下文类加载器,用于服务线程特有的类加载需求。 8. **类的卸载**:Java中类一旦被加载就很难被卸载,因为垃圾回收器不会回收Class对象,...

    java ClassLoader机制及其在OSGi中的应用

    Java ClassLoader机制是Java虚拟机(JVM)中一个至关重要的组成部分,它的主要任务是将类的.class文件加载到JVM中,使得程序能够运行。ClassLoader不仅负责类的加载,还涉及类的验证、初始化等一系列过程。理解...

    关于Android中自定义ClassLoader耗时问题的追查

    在Android开发中,自定义ClassLoader是一项关键技能,尤其在实现热修复和插件化技术时。本文主要探讨了Android中自定义ClassLoader导致的性能问题,特别是冷启动速度的影响。问题的核心在于,通过插入自定义的...

    ClassLoader类加载器

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...

    ClassLoader总结

    Bootstrap ClassLoader是JVM启动时的第一个ClassLoader,负责加载JDK核心库,如rt.jar中的类。Extension ClassLoader负责加载JDK扩展目录(如`$JAVA_HOME/jre/lib/ext`)下的类。而AppClassLoader则负责加载应用类...

Global site tag (gtag.js) - Google Analytics