Кластеризация JVM - PullRequest
4 голосов
/ 02 июля 2010

У меня есть ситуация, когда мне нужно вызвать асинхронное поведение в синхронном приложении.

Чтобы уточнить, существует монолитное приложение C ++, которое синхронно создает цены на сложные производные продукты.Это приложение C ++ поставляется с Java-оболочкой, которую мое приложение использует для взаимодействия с ним.

Текущий дизайн

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

Поскольку вызовы из Java-оболочки в C ++ являются синхронными, я хочусоздать асинхронное поведение, имея кластер этих Java-оболочек.

У меня был бы «Мастер-обертка», который бы решал (либо в циклическом порядке, либо на основе некоторой информации в реальном времени из кластера), какой отдельный обертка получает запрос.

Future Design

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

У кого-нибудь из вас есть опыт создания чего-то подобного?Любые советы, ссылки на учебники, фрагменты кода и т. Д. Были бы наиболее полезными.

Приветствия

К вашему сведению, я кратко посмотрел на терракоту, и мне кажется, что это то, что мне нужно, но это не вариант(не одобренный продукт в моей фирме).

Ответы [ 3 ]

1 голос
/ 11 февраля 2012

Приложение C ++ вызывается как набор функций библиотеки JNI или это процесс? Вы можете просто подумать о порождении подпроцессов в C ++ (дать ему main()) и использовать его вывод в нескольких потоках в одной JVM. Программа на C ++, вероятно, будет иметь гораздо лучшую возможность в отдельных процессах по сравнению с координацией нескольких JVM.

1 голос
/ 02 июля 2010

Если 'Java Master Wrapper' и 'My App' находятся в одной и той же JVM, вы можете сделать так, чтобы Java Master Wrapper внес депозитные цены в общую структуру данных, которую использовали потоки My APP. Если My APP - это отдельные процессы / JVM, вы можете использовать JMS для распространения результатов. ActiveMQ - это один JMS-провайдер.

0 голосов
/ 03 июля 2010

Кажется, вы ищете не кластер, а пул.

Если оболочка исполняется в той же JVM с основным потоком, задача состоит в том, чтобы просто повторно использовать любую из доступных пулов потоков / worker.Вы даже можете декомпилировать оболочку, чтобы увидеть, какие классы фактически вызывает ее метод main (), и попытаться воспроизвести ее в своем приложении.Сделал это для приложения CORBA, работал нормально.

Если каждая обертка должна быть в другой JVM, самый простой способ - это выделить пул потоков (снова), где каждый поток наблюдает за своим собственным экземпляром Process.объект, запись запросов в stdin, чтение ответов из stdout.

Конечно, поток-на-соединение не самый эффективный дизайн, поэтому, когда вы сделаете это, вы можете перейти к модели, когда маленькийпул потоков (или даже один поток) наблюдает за большим пулом экземпляров процесса-оболочки, используя селектор.

...