Приветствия, Я не мог предоставить все детали в вопросе, так что вот ключевые сведения.Как я могу избежать узких мест при использовании jni в веб-приложении/службе java
У меня есть родная dll (и соответствующая .so) упаковка статической библиотеки, которая создается языком программирования Eiffel. Я написал обертку C++ вокруг статической библиотеки, и я успешно открыл ее для Java. Однако, если я использую эту dll в веб-приложении, все станет довольно сложным. Проблема состоит в том, что несколько потоков java будут обращаться к одному и тому же C++-коду, где внутренний контекст (?) Поддерживается между вызовами разных классов & экземпляров. Чтобы использовать функциональность из кода Эйфеля, нужно инициализировать время выполнения Eiffel из C++, а затем использовать библиотеки Eiffel, чтобы использовать классы Eiffel из C++. К сожалению, это означает, что все входящие запросы на стороне сервера Java заканчиваются в одном месте на C++ (внутри собственной DLL), где есть только одно время выполнения Eiffel. Эта ситуация заставляет меня сделать весь поток среды Eiffel безопасным, и только одна операция одним потоком Java может использовать код Эйфеля, проходя через JNI. У меня такое ощущение, что это может быстро стать проблемой масштабируемости.
Я чувствую, что мне может понадобиться пул процессов, каждый из которых загружает копию той же DLL (или .so под * nix), которая будет передаваться входящим потокам с Java. Таким образом, после загрузки общей библиотеки код C++ создаст, скажем, 10 процессов, а входящие потоки со стороны Java будут выделены для этих процессов с помощью кода на C++. Поток событий будет таким:
Java-поток обращается к собственному коду (C++) в общей библиотеке. Native код проверяет, какие процессы доступны из технологического бассейна делает использование одного из процессов через МПК, пометив его занят (возможно, используя нить?)
Это единственная кросс-платформенный, как я мог думать, чтобы безопасно загружать одну и ту же часть кода (Eiffel runtime и классы eiffel) без каких-либо проблем с безопасностью потоков.
Это все из-за того, что Eiffel runtime является дорогостоящим и глобальным компонентом, который я должен предоставить через JNI.
Или я должен просто выполнять операции с потоками, где в любой момент может подаваться только один поток от JNI? Есть ли какой-либо трюк, который я могу сделать с Java для создания легких изолированных контейнеров jvm, каждый из которых использует только одно Eiffel runtime?
Ваш отзыв будет высоко оценен.
С наилучшими пожеланиями Şeref
База данных Эйфелевой башни огромна, и у нее нет шансов переписать ее на данный момент. Я искал способ создания множества jvms для песочницы, или экземпляров сервера приложений, которые все используют изолированную dll для потока в фоновом режиме. Я не вижу, как я могу использовать JMS с входящим запросом веб-службы, который должен подключиться к концу jni, не могли бы вы объяснить это немного больше? Спасибо за ответ в любом случае. – mahonya
Я немного расширился. Мы используем этот шаблон с некоторым успехом. – djna
Выглядит многообещающе, спасибо за обновление. Я не уверен, что могу получить механизм, чтобы вернуть ответ. Я бы, вероятно, заставил вызов веб-службы ждать, пока он не получит ответ на свой запрос из очереди jms. Вероятно, это лучший способ обеспечить безопасность потоков, не вникая в специфику механизмов безопасности потоков C++ или JNI. – mahonya