问题描述
我遇到需要在同步应用程序中引发异步行为的情况。
详细地说,有一个整体的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提供者。
2楼
是将C ++应用程序称为JNI函数集集还是一个进程?
您可以简单地考虑生成C ++的子进程(给它一个main()
),并在单个JVM中的多个线程中使用其输出。
与协调多个JVM相比,C ++程序在单独的进程中可能会有更好的机会。
3楼
看来您不是在寻找群集,而是在寻找池。
如果包装程序可在与主线程相同的JVM中执行,则任务只是重用任何可用的 /工作程序实现。 您甚至可以反编译包装器,以查看其main()方法实际调用的类,并尝试在应用程序中重现它。 这样做对CORBA应用程序来说工作正常。
如果每个包装程序都必须位于不同的JVM中,则最简单的方法是(再次)分配线程池,其中每个线程监视它自己的Process对象实例,将请求写入stdin,从stdout读取响应。
当然,每个连接线程不是最高效的设计,因此当使每个线程都工作时,实际上可能会迁移到一个模型,即一小线程(甚至一个线程)监视较大的包装Process实例池,使用选择器。