48 votes

Puis-je appeler Java à partir de Node.js via JNI et comment?

puis-je appeler Java à partir de Node.js via JNI ? Y a-t-il des exemples?

113voto

Dave Dopson Points 16690

Vous devriez essayer le nœud-java mnp module qui est un wrapper écrit plus de JNI.

nœud-java ne semble pas (encore) l'adoption à grande échelle, mais à jouer avec elle, j'ai été impressionné par la façon simple et robuste, il a été.

C'est aussi simple que:

var list = java.newInstanceSync("java.util.ArrayList");
list.addSync("item1");
list.addSync("item2");
console.log(list.getSync(1)); // prints "item2"

Vous pouvez faire à peu près n'importe quoi avec votre JVM embarquée - créer des objets, des méthodes d'appel, l'accès des champs, etc.

Il y a une légère différence d'impédance entre un Nœud et Java, donc si vous allez interagir avec quelque chose de compliqué, je vous recommande de l'écriture de la plupart de vos interactions en Java et en exposant une interface plus simple à travers le Nœud/Java barrière. C'est juste pour le débogage plus facile de cette façon.

--- Dave

p.s., RealWorldUseCase(tm): j'ai travaillé dans un endroit qui avait une assez complexe (et spaghetti-codées) protocole entre plusieurs clients de navigateur et Java-based service. J'ai écrit un assez doux test-harnais utilisés jsdom d'hôte N simulé et navigateurs utilisés nœud-java comme un wrapper autour de la Java le code de service. Il est trivial de cale le transport des interfaces, à la fois en JS pour les clients, et en Java pour le service, de sorte que chaque fois que l'une de ces choses envoie un message, j'ai fait une capture et le coller dans une file d'attente pour probabiliste de la livraison de la cible (c'est à dire, j'ai virtualisé le réseau). De cette manière, j'ai pu courir un plein sur la simulation de plusieurs clients d'interagir avec et par l'intermédiaire d'un service Java, et d'exécuter l'ensemble de la chose à l'intérieur d'un processus unique, sans fil de communication. Et puis, je pouvais faire des choses amusantes comme délibérément réorganiser les livraisons message à assurez-vous que le code a bien résisté à la synchronisation des bugs. Et quand un bug a été découvert, j'ai eu le message d'ordonnancements connecté et peut les reproduire à reproduire le bug. Oh, et le tout mis en place et dirigé un joli scénario complexe avec quelques milliers de lignes de journalisation et de terminer en moins de 1 seconde par s'exécuter. 2-semaines bien passé. Choses amusantes.

RealWorld Cas d'Utilisation #2: le sélénium-inproc - un module qui enveloppe le SeleniumRC fichier JAR fournissant une interface de nœud de navigateur d'automatisation de test w/ Sélénium sans avoir à courir encore un autre localhost service.

10voto

Daff Points 22358

Qui semble difficile. Node.JS fonctionne sur Google Chrome moteur JavaScript V8. Ce que vous avez à faire est de créer un V8 C++ liaison (v8 c++ Cours intensif montre un exemple), qui lance une JVM et la JNI de la manipulation.

Je pense que vous pourriez être mieux de laisser un JavaServer et Node.js communiquer via le réseau (quelqu'un a écrit un exemple pour l'utilisation de RabbitMQ pour Java/Node.js message en fonction de communication). Ici, JSON serait un grand format d'échange de données (si vous confiance à votre serveur Java produit de bonne JSON, vous pouvez simplement la fonction eval() Nœud).

5voto

Yogesh Agrawal Points 431

La communication peut être effectuée par child_process.

engendrer un nouveau processus et exécuter une classe principale. Cette classe principale renvoie la sortie à la console. les données sont donc disponibles pour l'événement stdout data du nœud.

 var cmd    = require('child_process').spawn('java', ['Main']);

cmd.stdout.on('data', function (data) {
  console.log('stdout: ' + data); // This will print string returned by Main class.
});
 

0voto

mP. Points 7516

Je ne suis pas au courant de tous les détails de Node.js mais je suppose que votre mention de JNI est en fait l'interface native Java. On ne peut utiliser JNI qu'à partir de Java, donc à mon humble avis, il n'est pas logique d'accéder à Java à partir de JNI si vous n'êtes pas déjà en java.

Il semblerait que ce soit la mauvaise approche, et vous devez rechercher dans le doco Node.js leur chapitre d'intégration ...

0voto

Alfred Points 32190

Je me demande si c'est possible du tout. mais même si c'est possible, j'imagine que c'est difficile à mettre en œuvre et je suis certain que personne ne l'a encore fait.

que diriez-vous d'utiliser un canal nommé pour communiquer entre les processus (java et node.js)?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X