2011-01-18 23 views
44

क्या मैं जावा को Node.js से जेएनआई के माध्यम से कॉल कर सकता हूं? क्या कोई उदाहरण हैं?क्या मैं जेएनआई के माध्यम से जावा को नोड.जेएस से कॉल कर सकता हूं और कैसे?

+1

'' Node.js जावा स्क्रिप्ट फ़ाइल लगता है और JNI आप अपने प्रश्न –

+1

आप Node.js के बजाय राइनो उपयोग कर सकते हैं विस्तृत कृपया कर सकते हैं, देशी कार्यक्षमता का उपयोग करने के लिए किया जाता है, interfacing वास्तव में है आसान: https://developer.mozilla.org/en-US/docs/Scripting_Java –

उत्तर

7

यह मुश्किल लग रहा है। नोड.जेएस Google क्रोम जावास्क्रिप्ट इंजन V8 पर चलता है। आपको क्या करना होगा एक वी 8 सी ++ बाध्यकारी बनाना (v8 c++ Crash Course एक उदाहरण दिखाता है) जो एक जेवीएम शुरू करता है और सभी जेएनआई हैंडलिंग करता है।

मुझे लगता है कि आप JavaServer और Node.js को नेटवर्क के माध्यम से संवाद करने से बेहतर हो सकते हैं (किसी ने Java/Node.js संदेश आधारित संचार के लिए example for using RabbitMQ लिखा)। यहां, जेएसओएन एक महान डेटा एक्सचेंज प्रारूप होगा (यदि आप भरोसा करते हैं कि आपका जावा सर्वर उचित JSON उत्पन्न करता है तो आप इसे नोड में केवल eval() कर सकते हैं)।

+1

जानना दिलचस्प है। लेकिन मुझे लगता है कि नेटवर्क का उपयोग, कम से कम तीव्रता का आदेश होना चाहिए जो जेएनआई। क्या आपको नहीं लगता? –

+4

यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं। जेएनआई दृष्टिकोण बहुत काम करेगा और डीबग करने के लिए नरक होगा (अकेले जेएनआई अकेले दर्द है और यह वी 8 -> सी ++ -> जेएनआई -> जावा) के साथ बहुत खराब होगा। – Daff

+0

आपकी क्यूई परत के रूप में रेडिस का उपयोग करने के बारे में, एक सरल समाधान। –

0

मुझे नोड.जेएस के सभी विवरणों से अवगत नहीं है, लेकिन मुझे लगता है कि जेएनआई का आपका उल्लेख वास्तव में जावा मूल इंटरफ़ेस है। कोई जावा से जेएनआई का उपयोग कर सकता है, इसलिए अगर आप जावा में पहले से नहीं हैं तो जावा को जेएनआई से जावा तक पहुंचने का एहसास नहीं है।

ऐसा लगता है कि यह गलत दृष्टिकोण है, और आप उनके एकीकरण अध्याय के लिए Node.js doco खोज करने के लिए की जरूरत है ...

+7

असल में, जेएनआई जावा से सिर्फ मूल कॉलिंग नहीं, बल्कि जेवीएम आमंत्रण को भी शामिल करता है। –

+0

@ सॉफ़्टवेयर भिक्षु, आपका कथन काफी सही है, लेकिन क्यू के सीटीएक्स में, नोड जेएस को सभी डब्ल्यू/अपने सभी जावाविमों पर जेनी का उपयोग करके कल्पना करना मुश्किल है। –

0

मुझे आश्चर्य है अगर यह बिल्कुल संभव है। लेकिन अगर यह संभव है तो भी मुझे कल्पना है कि इसे लागू करना मुश्किल है और मुझे यकीन है कि किसी ने अभी तक ऐसा नहीं किया है।

प्रक्रियाओं (जावा और नोड.जेएस) के बीच संवाद करने के लिए named pipe का उपयोग करने के बारे में कैसे?

5

संचार बच्चे_प्रोसेस द्वारा किया जा सकता है।

एक नई प्रक्रिया को जन्म देती है और मुख्य श्रेणी निष्पादित करती है। यह मुख्य वर्ग कंसोल पर आउटपुट लौट रहा है। इसलिए डेटा नोड के stdout data ईवेंट के लिए उपलब्ध है।

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

आपको node-java एनपीएम मॉड्यूल का प्रयास करना चाहिए जो जेएनआई पर एक अच्छी तरह लिखित रैपर है।

नोड-जेव (अभी तक) व्यापक गोद लेने के लिए प्रकट नहीं होता है, लेकिन इसके साथ खेल रहा है, मैं इस बात से प्रभावित हूं कि यह कितना सरल और मजबूत रहा है।

यह रूप में सरल है:

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

तुम सिर्फ अपने एम्बेडेड JVM के साथ कुछ के बारे में क्या कर सकते हैं - वस्तुओं, कॉल विधियों, पहुंच क्षेत्रों, आदि बनाने

वहाँ नोड के बीच एक मामूली प्रतिबाधा बेमेल है और जावा, इसलिए यदि आप जटिल कुछ के साथ बातचीत करने जा रहे हैं, तो मैं जावा में आपकी अधिकांश इंटरैक्शन लिखने और नोड/जावा बाधा में एक सरल इंटरफेस को उजागर करने की सलाह दूंगा। यह सिर्फ इस तरह से आसान डीबगिंग के लिए बनाता है।

--- डेव

पश्चलेख, RealWorldUseCase (टीएम): मैं एक जगह है कि एकाधिक ब्राउज़र ग्राहकों और एक जावा आधारित सेवा के बीच एक बहुत जटिल (और स्पेगेटी कोडित) प्रोटोकॉल था पर काम किया। मैंने एन सिम्युलेटेड ब्राउजर होस्ट करने के लिए jsdom का उपयोग किया है और जावा सेवा कोड के चारों ओर एक रैपर के रूप में node-java का उपयोग किया है। क्लाइंट के लिए जेएस में और सेवा के लिए जावा में परिवहन इंटरफेस को बाहर निकालना मुश्किल था, इसलिए जब भी इनमें से कोई भी चीज संदेश भेजती है, तो मैं इसे कैप्चर करता हूं और इच्छित लक्ष्य के लिए संभाव्य वितरण के लिए इसे कतार में चिपकाता हूं (यानी, मैंने नेटवर्क वर्चुअलाइज्ड किया)।इस तरह, मैं एक जावा सेवा के साथ और उसके माध्यम से बातचीत करने वाले कई ग्राहकों का एक पूर्ण-सिमुलेशन चला सकता हूं, और बिना किसी तार संचार के पूरी प्रक्रिया को एक ही प्रक्रिया में चला सकता हूं। और फिर मैं मजेदार सामान कर सकता हूं जैसे जानबूझकर संदेश वितरण को पुन: व्यवस्थित करना ताकि यह सुनिश्चित किया जा सके कि कोड समय बग के लिए लचीला था। और जब एक बग की खोज की गई, तो मेरे पास संदेश ऑर्डर लॉग किए गए और उन्हें बग को दोबारा बनाने के लिए पुन: पेश किया जा सकता था। ओह, और पूरी चीज स्थापित हुई और लॉगिंग की कुछ हज़ार लाइनों के साथ एक सुंदर जटिल परिदृश्य चलाया और 1 सेकंड प्रति रन के तहत समाप्त हो गया। 2 सप्ताह अच्छी तरह से खर्च किया। मजेदार चीजें।

वास्तविक दुनिया प्रयोग करें प्रकरण # 2: selenium-inproc - एक मॉड्यूल डब्ल्यू/Selenium अभी तक एक स्थानीय होस्ट सेवा को चलाने के लिए बिना SeleniumRC JAR फ़ाइल ब्राउज़र स्वचालन परीक्षण करने के लिए एक नोड इंटरफेस प्रदान गिर्द घूमती है।

+6

यह सही उत्तर होना चाहिए। – Ventura

+0

क्या यह गुरुबी जैसे तीसरे पक्ष के पुस्तकालयों के साथ काम करता है? http://www.gurobi.com/ –

0

मुझे लगता है कि आप जो खोज रहे हैं वह पुल के रूप में उपयोग करने के लिए एक मूल विस्तार है। हालांकि मैं तुम क्या कह रहे का एक उदाहरण की जरूरत नहीं है, मैं कैसे Node.js

https://github.com/jrgleason/NodeJSArduinoLEDController

0

मुझे लगता है कि अनुमोदित जवाब थोड़ा पुराना है का उपयोग करते हुए एक सी ++ विस्तार कॉल करने के लिए एक उदाहरण की क्या ज़रूरत है। यह हो सकता है बाहर कोशिश कर रहा लायक: https://github.com/joeferner/node-java

संबंधित मुद्दे