【问题标题】:Plugin framework and bi-directional program communication插件框架和双向程序通信
【发布时间】:2015-09-11 16:16:36
【问题描述】:

让 2 个不同的独立 Java 程序相互通信的好方法是什么?

我不确定我是否想使用 OSGi(但它似乎是唯一仍在更新的;jpf 和 jspf 都非常老了)。我对插件框架主题很陌生。 OSGi 只是对架构、插件结构等的描述,Equinox 和所有其他东西是我必须使用的真正实现,我说得对吗?

我让事情变得更精确:我想编写一个核心工具,它应该能够热加载插件,并与它们和 JavaFX GUI 进行双向通信。

我通常使用一个用于控制 GUI 的类和一个用于算法等 (MVC) 的附加类。但我认为这种风格不再有助于构建基于插件的工具。

我想从一开始就使用好的设计模式,否则最终会一团糟。

【问题讨论】:

    标签: java plugins osgi


    【解决方案1】:

    解决这个问题最简单的方法是使用ServiceLoader(文档here)。它包含在 Java 中,使用起来相当简单:

    1. 在运行时加载 Jar 文件
    2. 检测实现特定接口的类(例如:your.package.YourService)。
    3. 从这些类中实例化对象。

    Here 是一篇很好的文章,描述了如何做到这一点(注意:您应该使用带有URLCLassLoader 的第二个建议;动态扩展类路径)。另外,不要忘记在 Jar 的 META-INF 目录中声明您的服务:

    如果com.example.impl.StandardCodecsCodecSet service 那么它的jar文件也包含一个名为

    的文件
    META-INF/services/com.example.CodecSet 
    

    这个文件包含一行:

    com.example.impl.StandardCodecs    # Standard codecs
    

    通过选择这种方法,您的核心程序自然会处理您的插件,因此将能够轻松地与它们进行通信。为了确保双向通信(即插件调用您的核心程序),我建议创建一个您的核心程序将实现的接口,并将该接口传递给您的插件。

    插件接口:

    public interface Plugin { 
       public void doPluginStuff(Caller caller);
    }
    

    核心程序Caller接口:

    public interface Caller {
       public void sendBackResults(Object results);
    }
    

    插件实现(在单独的 Jar 文件中):

    public class AParticularPlugin implements Plugin {
       public void doPluginStuff(Caller caller){
          caller.sendBackResults("Hello world");
       }
    }
    

    核心计划:

    public class CoreProgram implements Caller {
    
       public void callPlugin(URL[] urlToJarFiles){
          URLClassLoader ucl = new URLClassLoader(urlToJarFiles);
          ServiceLoader<Plugin> sl = ServiceLoader.load(Plugin.class, ucl);
          Iterator<Plugin> plugins = sl.iterator();
          while (plugins.hasNext())
             plugins.next().doPluginStuff(this);
       }
    
       public void sendBackResults(Object results){
          System.out.println(results.toString());
       }
    
    }
    

    【讨论】:

      【解决方案2】:

      对您的第一个问题的一点“答案”。更有可能是某种体验报告。

      我在早期的一些项目中使用 Akka 框架来跨程序(和硬件)边界进行通信。

      Akka 是一个使用 Actor 模式和消息的框架。它是在 scala 中构建的,但也有一个很好的 Java 版本。

      看看:http://akka.io/

      我还是新手,请不要犹豫给我建议!

      您好, 托斯滕

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多