2010-03-10 43 views
2

我们在这种形式的代码的地方:我有哪些选项可用于Java进程通信?

void processParam(Object param) 
{ 
    wrapperForComplexNativeObject result = jniCallWhichMayCrash(param); 
    processResult(result); 
} 

processParam - 方法被称为与许多不同的参数。

jniCallWhichMayCrash - 本地方法,旨在对参数进行一些复杂处理并创建一些复杂对象。在某些情况下它可能会崩溃。

wrapperForComplexNativeObject - 由痛饮

processResult生成的包装类型 - 用纯Java编写的方法,它处理它是由创作了几种参数(受种我没有意思班,也许有些像层次结构)的对象:
1 - 一些非唯一对象(来自同一层次结构)互相引用时,这些对象可能具有不同参数值的processParam()方法的调用创建的副本。由于保留所有重复项的成本很高,因此有必要缓存它们。
2 - 一些相互引用(来自同一层次结构)的独特对象和一些第一类对象。

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

回答

1

让我们假定过程是在同一台机器上。您的选项包括:

  • 使用Process.exec()来启动一个新的过程对于每个请求,传递参数对象作为命令行参数或通过工艺标准输入和读取结果从标准THR流程输出。该过程在完成一个请求时退出。

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

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

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

对于上述每一个,您都需要设计自己的请求格式并处理双方的参数/结果编码和解码。

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

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

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

  • 消息队列系统(如MQ系列)。

注意,最后4名在客户端和服务器在不同计算机系统正常使用,但他们的工作一样好(可能更快)时,客户端和服务器进行共同定位。


我或许应该补充一种替代方法是摆脱有问题的JNI代码。将其替换为纯Java代码,或者将其作为外部命令或服务运行,而不用Java包装程序。

0

你有没有使用网络启发式的方法?你的情况,通常情况下,网络服务可以/将在其所有的多样性的解决方案:

+0

恐怕网络服务的使用将是一个矫枉过正的问题。我也认为它不会有好的表现,XMLs不是我们的选择。 – okutane 2010-03-10 15:17:30

+0

你能详细说明原因吗? 实现一个Web服务器接收4kb的XML块不会使您的机器爆炸,我认为...因为像dns-323和其他等效模型的home-nas支持lighttpd的使用,即使您的iPhone会考虑使用芯片忽略不计。 – Riduidel 2010-03-10 15:26:46

+0

那么,你能想象如何设计一个编译器,其中一个模块会将一些数据(例如整个源文件或一组文件的中间表示)作为大量小XML传递给它?我认为它不会很好,我们的应用程序也是一样的。 – okutane 2010-03-11 20:00:50

0

如果您可以分离过程的责任,即P1是数据的生产者,P2是消费者,最健壮的答案是使用文件传达您的数据。存在开销(读CPU周期)涉及serailization /反序列化但是你的进程不会崩溃,并且很容易调试/同步。

相关问题