对于Java进程通信,我有哪些选项?

对于Java进程通信,我有哪些选项?,java,Java,我们在这种形式的代码中占有一席之地: void processParam(Object param) { wrapperForComplexNativeObject result = jniCallWhichMayCrash(param); processResult(result); } processParam—使用许多不同参数调用的方法 JNICALLHICMAYCRASH—一种本机方法,用于对其参数进行一些复杂的处理,并创建一些复杂的对象。在某些情况下,它可能会崩溃 wra

我们在这种形式的代码中占有一席之地:

void processParam(Object param)
{
   wrapperForComplexNativeObject result = jniCallWhichMayCrash(param);
   processResult(result);
}
processParam—使用许多不同参数调用的方法

JNICALLHICMAYCRASH—一种本机方法,用于对其参数进行一些复杂的处理,并创建一些复杂的对象。在某些情况下,它可能会崩溃

wrapperForComplexNativeObject-SWIG生成的包装类型

processResult—一个用纯Java编写的方法,它通过创建几种对象(我不是指类,可能类似层次结构)来处理其参数:
1-一些相互引用的非唯一对象(来自同一层次结构),这些对象可以通过调用具有不同参数值的processParam()方法创建重复项。由于保留所有副本的成本很高,因此有必要对其进行缓存。
2-一些相互引用的唯一对象(来自同一层次)和一些第一类对象


为某个集合中的每个参数执行processParam后,将一起处理在processResult中创建的数据。问题是,JNICALL可能会使整个JVM崩溃,这将是非常糟糕的。崩溃的原因可能是一个参数值发生崩溃,而不是另一个参数值发生崩溃。我们已经决定,最好忽略JVM内部的崩溃,并在发生此类崩溃时跳过一些数据块。为了做到这一点,我们应该在单独的进程内部运行processParam函数,并以某种方式将结果(如何?如何?!这是一个问题)传递到主进程,如果发生任何崩溃,我们只会丢失部分数据(没问题),而不会丢失其他所有数据。因此,目前的主要问题是实现不同进程之间的传输。我有哪些选择?我可以考虑通过流序列化和传输二进制数据,但是由于对象的复杂性,序列化可能不是很快。也许我还有其他一些方法可以实现这一点?

你想过如何使用基于web的方法吗?在您的情况下,web服务通常可以/将是一个多样化的解决方案:

  • REST调用
  • WSDL和所有重量级机制
  • 即使是http上的XML-RPC,比如由您使用的或可以激发您灵感的XML-RPC

让我们假设这些进程在同一台机器上。你的选择包括:

  • 使用Process.exec()为每个请求启动一个新进程,将参数对象作为命令行参数传递,或通过进程标准输入并从thr进程标准输出读取结果。该进程在完成单个请求时退出

  • 使用Process.exec()启动长时间运行的流程,使用流程标准输入/输出发送请求和回复。流程实例处理多个请求

  • 使用“命名管道”向现有本地(或可能是远程)进程发送请求/答复

  • 使用原始TCP/IP套接字或Unix域套接字向现有本地(或可能是远程)进程发送请求/答复

对于上面的每一项,您都需要设计自己的请求格式,并处理两侧的参数/结果编码和解码

  • 将流程实现为web服务,并使用JSON或XML(或其他内容)对参数和结果进行编码。根据您选择的编码方案,现有库将处理编码/解码和(可能)映射到Java类型

  • SOAP/WSDL—通过这些,您通常在更高的抽象级别上设计应用程序协议,框架库负责编码/解码、调度请求等

  • CORBA或类似ICE的等效物。这些选项类似于SOAP/WSDL,但使用更高效的连接表示等

  • 消息队列系统,如MQ系列

请注意,后四种方法通常用于客户机和服务器位于不同机器上的系统中,但当客户机和服务器位于同一位置时,它们也同样有效(可能更快)



我也许应该补充一点,另一种方法是去掉有问题的JNI代码。要么用纯Java代码替换它,要么将其作为外部命令或服务运行,而不使用Java包装器。

如果您可以隔离流程的责任,即P1是数据生产者,P2是消费者,最可靠的答案是使用文件来传输数据。序列化/反序列化涉及到开销(读取CPU周期),但是您的进程不会崩溃,而且调试/同步非常容易。

我担心使用web服务会造成过度消耗。我还认为它不会有好的性能,XMLs不是我们的选择。你能详细说明为什么吗?实现一个接收4kb XML块的web服务器不会使您的机器崩溃,我认为。。。由于家庭NAS,如DNS323和其他等效模型支持使用LUTTPD,甚至有一个芯片,甚至你的iPhone都会考虑忽略。那么,你能想象如何设计一个编译器,其中一个模块将通过一些数据(例如整个源文件或文件集的中间呈现),这是多么好的事情。大量的小型XML?我认为这一点都不好,我们的申请也是一样的。