让两个不同的独立Java程序相互通信的好方法是什么?
我不确定是否要使用OSGi(但它似乎是唯一一个仍然获得更新的东西; jpf和jspf非常老)。我是插件框架主题的新手。我是对的,OSGi只是对架构,插件结构等的描述,而且equinox和所有这些其他东西都是真正的实现,我必须使用它?
我做得更精确:我想编写一个核心工具,它应该能够热插拔插件,并与它们和JavaFX GUI进行双向通信。
我通常使用一个类来控制GUI,另外一个类用于算法等(MVC)。但我认为这种风格不再有助于构建基于插件的工具。
我想从一开始就使用一个好的设计模式,否则它最终会变得一团糟。
答案 0 :(得分:4)
此问题的最简单解决方案是使用ServiceLoader
(doc here)。它包含在Java中,使用起来相当简单:
your.package.YourService
)。 Here是一篇非常好的帖子,描述了如何操作(注意:您应该使用第二个提案URLCLassLoader
; 不动态扩展类路径)。另外,不要忘记在Jar的META-INF目录中声明您的服务:
如果
的文件com.example.impl.StandardCodecs
是一个实现CodecSet
服务然后它的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());
}
}
答案 1 :(得分:1)
一点回答&#34;对你的第一个问题。它更有可能是某种经验报告。
我在一些早期项目中使用Akka Framework来跨程序(和硬件)边界进行通信。
Akka是一个使用actor模式和消息的框架。它是用scala构建的,但也有一个很好的Java版本。
看一看:http://akka.io/
我还是新手,请不要犹豫,给我建议!
问候, 托