2010-07-02 56 views
4

我有一种情况需要在同步应用程序中诱发异步行为。集群JVM

详细说明,有一个单片C++应用程序可以同步生成复杂衍生产品的定价。这个C++应用程序附带了一个java包装器,我的应用程序用它来与它进行交互。

当前设计

My APP <------> Java Wrapper <---> C++ application 

由于从Java包装到C++是同步的来电,我想有这些Java包装集群创建一个异步行为。

我会有一个“主包装器”,它将决定(以循环方式或基于来自群集的某些实时信息)哪个独立包装器获得请求。

未来设计

        <---> Java Wrapper <---> C++ application 
My APP <------> Java Master Wrapper <---> Java Wrapper <---> C++ application 
            <---> Java Wrapper <---> C++ application 

做任何你们都经历建立这个类的东西? 任何建议,教程链接,代码位等将是最有帮助的。

干杯

仅供参考,我简单地看了看兵马俑,它似乎像它不过是我需要的不是一个选项(不是在我公司批准的产品)。

回答

1

如果'Java Master Wrapper'和'My App'在同一个JVM中,那么您可以让Java Master Wrapper将定价结果存储在My APP线程所消耗的共享数据结构中。如果我的APP是不同的流程/ JVM,则可以使用JMS分发结果。 ActiveMQ是一个JMS提供者。

0

看来你不是为了集群,而是为了一个游泳池。

如果包装程序可以在与主线程相同的JVM中执行,那么该任务仅仅是重用任何可用的thread pool /工具实现。您甚至可以反编译包装器,以查看其main()方法实际调用哪些类,然后在应用程序中尝试并重现它。对于CORBA应用程序来说,它工作正常。

如果每个包装必须位于不同的JVM中,最简单的方法是分配线程池(再次),其中每个线程都看着它自己的Process对象实例,向stdin写入请求,从stdout读取响应。

当然,thread-per-connection不是最高效的设计,所以当你使它工作时,当一小块线程(甚至一个线程)监视一个更大的池包装器使用Selector处理实例。

1

C++应用程序被称为JNI库函数集,还是它是一个过程?您可能仅仅考虑产生C++的子进程(给它一个main())并在单个JVM中的多个线程中使用它的输出。 C++程序可能在单独的进程中比协调多个JVM有更好的机会。