Привет, я не смог предоставить все детали в вопросе, поэтому вот ключевые детали.
У меня есть нативный dll (и соответствующий .so), обертывающий статическую библиотеку, созданную языком программирования Eiffel.Я написал оболочку C ++ вокруг статической библиотеки и успешно открыл ее для Java.Однако, если я буду использовать эту DLL в веб-приложении, все станет немного сложнее.Проблема в том, что несколько потоков Java будут обращаться к одному и тому же коду C ++, где собственный контекст (?) Сохраняется между вызовами разных классов и экземпляров.Чтобы использовать функциональность из кода Eiffel, нужно инициализировать среду выполнения Eiffel из C ++, а затем использовать библиотеки Eiffel для использования классов Eiffel из C ++.К сожалению, это означает, что все входящие запросы на стороне Java-сервера оказываются в одном месте в C ++ (внутри нативной dll), где есть только одна среда выполнения Eiffel.Эта ситуация заставляет меня сделать весь поток времени выполнения Eiffel безопасным, и только одна операция одного потока Java может использовать код Eiffel, проходя через JNI.У меня есть ощущение, что это может быстро стать проблемой масштабируемости.
Мне кажется, что мне может понадобиться пул процессов, каждый из которых загружает копию одной и той же dll (или .so в * nix), которая будет обслуживаться входящим потокам из Java.Таким образом, после загрузки разделяемой библиотеки будет создан код C ++, скажем, 10 процессов, и входящие потоки со стороны Java будут распределены этим процессам через код C ++.Поток событий будет выглядеть следующим образом:
Поток Java обращается к собственному коду (c ++) в разделяемой библиотеке.Нативный код проверяет, какие процессы доступны из пула процессов, использует один из процессов через ipc, помечая его как занятый (возможно, с использованием потока?)
Это единственный кроссплатформенный способ, который я мог придумать, чтобы безопаснозагрузить один и тот же кусок кода (классы выполнения Eiffel и классы Eiffel) без каких-либо проблем с безопасностью потоков.
Это все из-за того, что среда выполнения Eiffel является дорогим и глобальным компонентом, который я должен раскрыть через JNI.
Или я должен просто пойти с потокобезопасными операциями, где только один поток обслуживается из JNI в любое время?Есть ли какой-нибудь трюк, который я могу сделать с Java для создания облегченных изолированных jvm-подобных контейнеров, каждый из которых использует только одну среду выполнения Eiffel?
Ваши отзывы будут высоко оценены.
С наилучшими пожеланиями Seref