2010-07-02 61 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有更好的機會。