2015-09-16 4 views
18

मैं जावा लाइब्रेरी लिख रहा हूं, वास्तव में, क्लोजर लाइब्रेरी, लेकिन इस सवाल के लिए, यह महत्वपूर्ण है कि यह JVM पर चलता है। इस पुस्तकालय को कुछ जावास्क्रिप्ट निष्पादित करने की आवश्यकता है। I tried with Nashorn लेकिन मुझे कुछ सीमाएं आती हैं जिन्हें दूर करने में बहुत मुश्किल हो सकती है। एक विकल्प के रूप में, मैं नोडजेएस को आजमा देना चाहता हूं।मुझे जावा एप्लिकेशन से नोडजेएस कैसे चलाया जाना चाहिए?

मैं चाहता हूं कि मेरी लाइब्रेरी स्वयं निहित हो, नोडजेएस को स्वतंत्र रूप से चल रहे सिस्टम पर निर्भर न हो और इस प्रकार जावा और नोडजेएस कलाकृतियों को सही जगहों पर दो अलग-अलग नेटवर्क सर्वरों द्वारा उठाए जाने के लिए एक विशेष परिनियोजन तंत्र की आवश्यकता हो। । हालांकि, यह दृष्टिकोण कुछ मुद्दों को लाता है।

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

इस तक पहुंचने का सबसे अच्छा तरीका क्या है? क्या इस फैशन में बाल प्रक्रिया को प्रबंधित करने में मदद करने के लिए कोई जावा पुस्तकालय है? विशेष रूप से मुझे कुछ भी नोडजेएस पक्ष से करना चाहिए (मैं नोडजेएस के लिए बहुत नया हूं, मैंने इसे पहले कभी नहीं इस्तेमाल किया)।

+0

मैं इसे निर्भर करता है कि कैसे अपने पुस्तकालय का सेवन किया जा करने का इरादा है, लेकिन एक पुस्तकालय क्रम अपना काम पूरा करने के लिए में एक दिग्गज सर्वर प्रक्रिया का शुभारंभ होने एक कोड गंध की तरह लगता है लगता है। –

+0

क्या आपने अवतार के बारे में सुना है? मुझे कुछ समस्याएं भी थीं जहां मैं कुछ नोडज मॉड्यूल का उपयोग नहीं कर सका, लेकिन अवतार ने अंतर को भर दिया: https://strongloop.com/strongblog/how-to-run-node-js-on-the-jvm-with-avatar- जेएस-एंड-लूपबैक/ – Tiago

+0

बस थोड़ा सा जवाब कम करने के लिए ... आप वास्तव में क्या सीमाएं सामने आए हैं? नाशर्न के साथ सर्वर साइड स्क्रिप्टिंग औसत में 6ms जोड़ रही है। अंत में आपकी पोस्ट में प्रतिक्रिया समय, तो मुझे लगता है कि प्रदर्शन उनमें से एक नहीं है – cviejo

उत्तर

9

अंत में मेरे समाधान इस तरह ProcessBuilder उपयोग करने के लिए किया गया था। उत्तराधिकारी वर्तमान प्रक्रिया के आउटपुट पर जाने के उत्पादन का कारण बनता है जो प्रभावी ढंग से stdout और stderr विलय करता है।

कि NodeJS के शीर्ष पर पोर्ट संख्या के रूप में 0 निर्दिष्ट करने के द्वारा एक यादृच्छिक पोर्ट खुल जाता है और यह एक फाइल करने के लिए लिखते हैं:

(let [app (-> (express) 
       (.use (cookie-parser)) 
       (.get "/" (fn [_req res] (.send res "Universal JavaScript engine for server side pre-rendering single page applications."))) 
       (.get "/render" render)) 
     server (.createServer http app)] 
    (.listen server 0 (fn [] (.writeFile fs (:port-file options) (.-port (.address server))))))))) 

जो तब जावा तरफ से खोला जाता है (यह दिखाई देने की प्रतीक्षा):

(defn get-port-number [js-engine] 
    (or (with-timeout 
     (:start-timeout js-engine) 
     (loop [port-number (read-port-file js-engine)] 
      (if (string/blank? port-number) 
      (if (is-running? js-engine) 
       (do (Thread/sleep 100) 
        (recur (read-port-file js-engine))) 
       (throw (Exception. (str "While waiting for port number, process died: " (:path js-engine))))) 
      port-number))) 
     (throw (Exception. (str "Waited for " (:start-timeout js-engine) " for " (:path js-engine) " to start and report its port number but it timed out."))))) 
+0

http://nodyn.io/ के बारे में कैसे? – Stanimir

+0

@ पाब्लो थॉट मैंने नोट किया होगा कि 0 पर सुनने वाले नोड.जेएस हमेशा उम्मीद के अनुसार कार्य नहीं कर सकते हैं। देखें [यहां] (http://stackoverflow.com/a/10266225/4133078) –

+0

@Stanimir मुझे पता नहीं चला कि nodyn.io कितना पूरा है, यह बहुत पूरा प्रतीत नहीं होता है, और परियोजना आधिकारिक तौर पर त्याग दी गई है। – Pablo

6

जावा में जावास्क्रिप्ट को चलाने के तरीके पर एक बहुत अच्छा जवाब here है। क्या ऐसा कुछ आपके मामले के लिए करने योग्य होगा? यहाँ नहीं तो कुछ संसाधन हैं:

  • Random port in nodejs आप निर्माण के दौरान एक खुला बंदरगाह को खोजने के लिए अभी तक एक और सेवा हिट कर सकता है, या अपने नोड एप्लिकेशन बंदरगाह यह पकड़ लेता है के आधार पर अपने जावा सर्वर एक HTTP अनुरोध आग की है।
  • Winston मुझे मिली सबसे अच्छी लॉगिंग लाइब्रेरी है, आपको किसी भी पथ पर लॉग इन करने में कोई समस्या नहीं होनी चाहिए।
  • Forever और PM2 आम नोड प्रक्रिया प्रबंधक हैं जो नोड चलते रहते हैं। मैं वर्तमान में हमेशा के लिए पसंद करता हूं (यकीन नहीं क्यों)

ऐसा लगता है जैसे आप नोड के भीतर बहुत सी सीपीयू का उपयोग करेंगे। यदि ऐसा है तो आप शायद cluster module का उपयोग करना चाहेंगे (इसलिए नोडज एकाधिक कोर का उपयोग कर सकते हैं)। यदि आप इवेंट लूप को अवरुद्ध करते हैं (जो सीपीयू आधारित प्रसंस्करण करेगा, तो आप केवल फोर्कड प्रक्रिया प्रति 1 समवर्ती अनुरोध करने में सक्षम होंगे)।

+0

उस अन्य प्रश्न के बारे में आपने बताया, नहीं, मैंने पहले से ही नैशर्न की कोशिश की है और यह पर्याप्त नहीं है। मुझे नोडजेएस की तरह कुछ चाहिए। – Pablo

4

नैशोर्न में कुछ समस्याएं हैं जिनमें मैंने भी भाग लिया है, जैसे कि उनके कुछ एपीआई (दस्तावेज वांछित होने के लिए बहुत कुछ छोड़ देता है), और धीमी बूट अप।

क्या मैं बजाय सिफारिश करेंगे: एक सेवा और नहीं एक बच्चे प्रक्रिया के रूप में अपने सर्वर साइड प्रतिपादन का इलाज।

दूसरे शब्दों में, आप पोर्ट 10015 पर अपने आंतरिक नेट पर एक नोड.जेएस उदाहरण चला सकते हैं और केवल स्थानीय कनेक्शन को अनुमति दे सकते हैं (आप जहां भी चाहें लॉग भेज सकते हैं)। फिर आप उन पृष्ठों के साथ सेवा का अनुरोध कर सकते हैं जिन्हें आप प्रस्तुत करना चाहते हैं, जैसे कि localhost:10015/posts/ और क्या वह नोड.जेएस ऐप एक हेडलेस ब्राउज़र (फ़ैंटम या स्लिमर जैसे कुछ का उपयोग करके) को पृष्ठ प्रस्तुत करता है।

अपने नोड सर्वर को चालू रखने के लिए, आपको Forever या supervisord उपयोग कर सकते हैं, और आप तेजी से कर्षण हासिल करने में मदद करने के लिए, अपने आप को देखो सकता है क्या पूर्वप्रस्तुत टीम बना दिया है: https://github.com/prerender/prerender-node

4

मैं एक ऐसी ही स्थिति में किया गया है जहां मुझे एक अजगर लिपि से फोर्टन चलाया गया था, तो यहां मेरे दो सेंट हैं। इस तरह जावा में एक टर्मिनल कमांड के साथ अपने Node.js स्क्रिप्ट चलाएं:

Runtime rt = Runtime.getRuntime(); 
String[] commands = {"node example.js", "args"}; 
Process proc = rt.exec(commands); 

BufferedReader stdInput = new BufferedReader(new 
    InputStreamReader(proc.getInputStream())); 

BufferedReader stdError = new BufferedReader(new 
    InputStreamReader(proc.getErrorStream())); 

// read the output from the command 
System.out.println("Here is the standard output of the command:\n"); 
String s = null; 
while ((s = stdInput.readLine()) != null) { 
    System.out.println(s); 
} 

// read any errors from the attempted command 
System.out.println("Here is the standard error of the command (if any):\n"); 
while ((s = stdError.readLine()) != null) { 
    System.out.println(s); 
} 

सेटअप के साथ आप अपने नोड कार्यक्रम के लिए मानकों में गुजरती हैं और प्रतिक्रियाएं प्राप्त कर सकते हैं। हालांकि मुझे यकीन नहीं है कि आप अपने node.js प्रोग्राम का उपयोग कर रहे हैं, इसलिए यह सुनिश्चित न करें कि यह सहायक है या नहीं। कॉल उस में शुरू

(defn create-process-builder [js-engine] 
    (doto (ProcessBuilder. ["node" (:path js-engine) 
          "--port-file" (:port-file js-engine) 
          "--default-ajax-host" (:default-ajax-host js-engine) 
          "--default-ajax-port" (str (:default-ajax-port js-engine))]) 
    .inheritIO)) 

और उसके बाद:

+0

इस विधि से ध्यान देने योग्य एक बात यह है कि प्रत्येक कॉल के साथ बूट करने के लिए नोड प्रक्रिया के लिए लगभग 30ms लगेंगे। –

+0

इसके अलावा, मुझे लगता है कि ओपी सिस्टम पर स्थापित नोड पर निर्भर नहीं होना चाहता – cviejo

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

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