Salutations, Je n'ai pas pu fournir tous les détails dans la question, alors voici les détails clés.Comment puis-je éviter les goulots d'étranglement lors de l'utilisation de jni dans une application/un service Web Java?
J'ai une DLL native (et un .so correspondant) enveloppant une bibliothèque statique, qui est créée par le langage de programmation d'Eiffel. J'ai écrit un wrapper C++ autour de la lib statique, et je l'ai exposé avec succès à Java. Cependant, si j'utilise cette DLL dans une application web, les choses vont devenir compliquées. Le problème est que plusieurs threads java accèdent au même code C++, où le contexte natif (?) Est maintenu entre les appels par différentes classes & instances. Pour utiliser la fonctionnalité du code Eiffel, il faut initialiser le moteur d'exécution Eiffel depuis C++, puis utiliser les bibliothèques Eiffel pour utiliser les classes Eiffel de C++. Malheureusement, cela signifie que toutes les demandes entrantes vers le serveur Java se retrouvent dans un seul emplacement en C++ (dans la DLL native), où il n'y a qu'une seule exécution d'Eiffel. Cette situation m'oblige à sécuriser l'intégralité du thread d'exécution Eiffel et une seule opération effectuée par un thread Java peut utiliser le code Eiffel en passant par JNI. J'ai le sentiment que cela peut rapidement devenir un problème d'évolutivité. Je pense que je peux avoir besoin d'un pool de processus, chacun chargeant une copie de la même DLL (ou .so sous * nix) qui sera servi aux threads entrants de Java. Ainsi, une fois la bibliothèque partagée chargée, le code C++ créera, disons 10 processus, et les threads entrants du côté Java seront alloués à ces processus via le code C++. Le flux d'événements est le suivant:
Le thread Java accède au code natif (C++) dans la bibliothèque partagée. vérifie le code natif dont les processus sont disponibles à partir du pool de processus fait usage de l'un des processus via ipc, marquant occupé (probablement à l'aide d'un fil?)
C'est le seul moyen de la plate-forme cross que je pouvais penser à charger en toute sécurité le même morceau de code (classes Eiffel Runtime et eiffel) sans aucun problème de sécurité.
Tout ceci est dû au fait que l'exécution d'Eiffel est un composant coûteux et global, que je dois exposer via JNI.
Ou devrais-je simplement aller avec les opérations thread safe, où un seul thread est servi à partir de JNI à tout moment? Y a-t-il un truc que je peux faire avec Java pour créer des conteneurs jvm isolés et légers utilisant chacun un seul moteur d'exécution Eiffel?
Vos commentaires seraient les bienvenus.
Cordialement Seref
La base du code Eiffel est énorme, aucune chance de la réécrire pour le moment. Je cherchais un moyen de créer plusieurs jvms de sandboxing, ou des instances de serveur d'applications qui utilisent toutes la DLL sécurisée d'un thread unique en arrière-plan. Je ne vois pas comment je peux utiliser JMS avec une demande de service Web entrant, qui doit se connecter à un backend jni, pourriez-vous expliquer cela un peu plus? Merci pour la réponse de toute façon. – mahonya
J'ai élargi un peu. Nous utilisons ce modèle avec un certain succès. – djna
Cela semble prometteur, merci pour la mise à jour. Je ne suis pas sûr que je puisse obtenir le mécanisme pour retourner la réponse si. Je ferais probablement attendre l'appel de service Web jusqu'à ce qu'il reçoive une réponse à sa demande de la file d'attente jms. C'est probablement un meilleur moyen d'assurer la sécurité des threads sans entrer dans les détails des mécanismes de sécurité des threads C++ ou JNI. – mahonya