2011-01-18 14 views
44

posso chiamare Java da Node.js tramite JNI? Ci sono degli esempi?Posso chiamare Java da Node.js tramite JNI e come?

+1

'Node.js' sembra il file di script java e JNI è utilizzato per accedere alle funzionalità native, puoi per favore elaborare la tua domanda –

+1

Se puoi usare Rhino invece di Node.js, l'interfacciamento è davvero facile: https://developer.mozilla.org/en-US/docs/Scripting_Java –

risposta

7

Sembra strano. Node.JS viene eseguito sul motore JavaScript di Google Chrome V8. Quello che dovrete fare è creare un binding V8 C++ (v8 c++ Crash Course mostra un esempio) che avvia una JVM e gestisce tutto il JNI.

Penso che potrebbe essere meglio lasciare un JavaServer e Node.js comunicare tramite la rete (qualcuno ha scritto un example for using RabbitMQ per la comunicazione basata su messaggio Java/Node.js). Qui, JSON sarebbe un ottimo formato per lo scambio di dati (se ti fidi che il tuo server Java produca JSON corretto, puoi semplicemente eval() in Node).

+1

Interessante a saperlo. ma suppongo che l'accesso alla rete, dovrebbe essere almeno un ordine di grandezza più lento del JNI. Don: tu pensi? –

+4

Dipende da cosa vuoi fare. L'approccio JNI sarà MOLTO di lavoro e un diavolo di debug (JNI da solo è già un dolore e sarà molto peggio con V8 -> C++ -> JNI -> Java). – Daff

+0

che ne dici di utilizzare redis come livello di accodamento, una soluzione più semplice. –

0

Non sono a conoscenza di tutti i dettagli di Node.js ma presumo che la tua segnalazione di JNI sia in realtà l'interfaccia nativa Java. Si può usare solo JNI da Java, quindi non è opportuno accedere a Java da JNI se non si è già in java.

Sembrerebbe che questo è l'approccio sbagliato, ed è necessario cercare la doco Node.js per la loro integrazione capitolo ...

+7

In realtà, JNI copre anche l'invocazione JVM, non solo le chiamate native da Java. –

+0

@ monaco software, la tua affermazione è giusta, ma nel ctx di q, il suo nodo js difficile da immaginare usa jni per tutti i suoi javaismi. –

0

Mi chiedo se è possibile a tutti. ma anche se è possibile, immagino sia difficile da attuare e sono certo che nessuno lo abbia ancora fatto.

come utilizzare un named pipe per comunicare tra processi (java e node.js)?

5

La comunicazione può essere eseguita da child_process.

spawn un nuovo processo ed esegue una classe Main. Questa classe principale restituisce l'output alla console. quindi i dati sono disponibili per l'evento stdout data del nodo.

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. 
}); 
101

Si dovrebbe provare il modulo n23 node-java che è un involucro ben scritto su JNI.

nodo-jave non sembra (ancora) avere un'ampia adozione, ma giocando con esso, sono stato impressionato da quanto semplice e robusto è stato.

E 'semplice come:

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

È possibile fare qualsiasi cosa con il tuo JVM incorporato - creare oggetti, metodi di chiamata, i campi di accesso, ecc

C'è un leggero disadattamento di impedenza tra il Nodo e Java, quindi se hai intenzione di interagire con qualcosa di complicato, ti consiglio di scrivere la maggior parte delle tue interazioni in Java e di esporre un'interfaccia più semplice attraverso la barriera Nodo/Java. Semplifica il debug in questo modo.

--- Dave

P.S., RealWorldUseCase (tm): Ho lavorato in un posto che aveva un bel complesso (e gli spaghetti-coded), il protocollo tra più client browser e di un servizio basato su Java. Ho scritto un bel test-harness che utilizzava jsdom per ospitare N browser simulati e utilizzava node-java come wrapper attorno al codice del servizio Java. È stato banale eliminare le interfacce di trasporto, sia in JS per i client, sia in Java per il servizio, quindi ogni volta che una di queste cose invia un messaggio, lo catturo e lo inserisco in una coda per il recapito probabilistico all'obiettivo desiderato (cioè, ho virtualizzato la rete).In questo modo, potrei eseguire una simulazione completa di più client che interagiscono con e attraverso un servizio Java ed eseguire l'intera operazione all'interno di un singolo processo senza alcuna comunicazione via cavo. E poi ho potuto fare cose divertenti come riordinare deliberatamente le consegne dei messaggi per assicurarmi che il codice fosse resistente ai bug di temporizzazione. E quando è stato scoperto un bug, ho registrato gli ordini dei messaggi e sono riuscito a riprodurli per riprodurre il bug. Oh, e il tutto è stato configurato e gestito uno scenario piuttosto complesso con alcune migliaia di righe di registrazione e terminato in meno di 1 secondo per esecuzione. 2 settimane ben speso. Cose divertenti.

Caso di utilizzo di RealWorld n. 2: selenium-inproc - un modulo che include il file JAR SeleniumRC che fornisce un'interfaccia nodo al test di automazione del browser w/Selenium senza dover eseguire ancora un altro servizio di localhost.

+6

questa dovrebbe essere la risposta giusta. – Ventura

+0

Funziona con librerie di terze parti come Gurobi? http://www.gurobi.com/ –

Problemi correlati