2009-05-29 11 views
5

जेडीके 6 में एम्बेडेड एचटीपी सर्वर वेब सेवाओं को विकसित करने में एक बड़ी मदद है, लेकिन मुझे ऐसी स्थिति मिली है जहां मैंने एंडपॉइंट प्रकाशित किया था और फिर कोड क्रैश हो गया और सर्वर चल रहा था।com.sun.net.httpserver.Http सर्वर को कैसे बंद करें?

एक बार जब आप इसका संदर्भ खो चुके हैं (या प्रकाशित एंडपॉइंट) तो आप एम्बेडेड सर्वर को कैसे बंद कर देते हैं?

+0

क्या ऑपरेटिंग सिस्टम को रोकने के लिए? – skaffman

+0

ओ/एस विंडोज है। –

उत्तर

0

मैंने पहले कभी इस सर्वर का उपयोग नहीं किया है और मुझे कोई अच्छा दस्तावेज नहीं मिल रहा है। शायद ये कम सुरुचिपूर्ण समाधान आपके लिए पहले से ही हुए हैं, लेकिन मैंने सोचा कि मैं उनका उल्लेख करूंगा।

com.sun.net.httpserver की तरह लगता है। HttpServer में एक कार्यान्वयन वर्ग है जिसे HttpServerImpl कहा जाता है। इसमें स्टॉप() नामक एक विधि है।

या शायद आप सर्वर सॉकेट पर थ्रेड सुनकर और इंटरप्ट() कॉल कर सकते हैं।

शॉन

+0

अगर मेरे पास HttpServerImpl के लिए एक हैंडल था तो मैं उस पर स्टॉप() को कॉल कर सकता था, लेकिन मेरे पास एक प्रक्रिया है जिसे HttpServer बनाना है और दूसरी प्रक्रिया के साथ इसे रोकना चाहते हैं। –

+0

एर, यह सीधे कक्षा पर सार्वजनिक सार शून्य शून्य (...) है, तो समस्या कहां है? देखें: http://java.sun.com/javase/6/docs/jre/api/net/httpserver/spec/com/sun/net/httpserver/HttpServer.html#stop(int) – ShiDoiSi

+0

मुझे और प्रदान करना चाहिए था विस्तार। मैं एक JVM में एक एंडपॉइंट प्रकाशित करता हूं और यदि एंडपॉइंट क्रैश पर एक ऑपरेशन मुझे सर्वर को एक अलग JVM में बंद करने की आवश्यकता है। मुझे सर्वर के व्यवस्थापक पोर्ट को कॉल करने की आवश्यकता है, लेकिन मुझे एम्बेडेड सर्वर के लिए व्यवस्थापक सॉकेट की तरह कुछ भी दिखाई नहीं देता है। –

-1
netstat -a 

प्रक्रिया बंदरगाह खुला (यह मानते हुए आप बंदरगाह जानते हैं) है की पीआईडी ​​को खोजने के लिए, और

kill -9 $pid 

प्रक्रिया को मारने के लिए।

+0

मुझे लगता है कि सर्वर JVM में थ्रेड के रूप में चलता है, इसलिए आप पूरे JVM को भारी हाथ से शूट करने का सुझाव दे रहे हैं। @ डीन: मुझे लगता है कि आप एक क्लीनर समाधान की तलाश में हैं जिसके लिए JVM को पुनरारंभ करने की आवश्यकता नहीं है? – ShiDoiSi

0

संदर्भ को खोने के बारे में कैसे? जब आप अपना कोड क्रैश कहते हैं, तो मुझे लगता है कि आपको कहीं अपवाद मिलता है। ठीक कहाँ पर? तो इस अपवाद को रोकने में सक्षम व्यक्ति को स्पष्ट रूप से HttpServer का संदर्भ भी होना चाहिए, जिसे आपको अपने आस-पास पारित करना पड़ सकता है।

संपादित करें: ओह। उस स्थिति में यदि आप पूरे JVM को HttpServer के साथ मारना नहीं चाहते हैं, तो आपको पर्यावरण के लिए आईपीसी के कुछ रूपों की पेशकश करने की आवश्यकता होगी, उदा। आरएमआई के माध्यम से एक कमांड चैनल जिसे जावा प्रोग्राम (और इसलिए चींटी) से बुलाया जा सकता है।

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

मैं एक त्वरित आरएमआई समाधान के साथ जाऊंगा।

+1

यह एक उदाहरण क्लाइंट में मुख्य() विधि है जो एंडपॉइंट प्रकाशित करती है और उदाहरण निष्पादित करती है। अगर यह दुर्घटनाग्रस्त हो जाता है तो मुझे सर्वर को चींटी को बंद करने में सक्षम होना चाहिए। प्रकाशित() और स्टॉप() एक अलग जेवीएम में किया जाएगा। –

8

मैं नीचे दिए गए कोड का उपयोग शुरू करने के लिए यह

this.httpServer = HttpServer.create(addr, 0); 
    HttpContext context = this.httpServer.createContext("/", new DocumentProcessHandler()); 
    this.httpThreadPool = Executors.newFixedThreadPool(this.noOfThreads); 
    this.httpServer.setExecutor(this.httpThreadPool); 
    this.httpServer.start(); 

और कोड नीचे यह

 this.httpServer.stop(1); 
     this.httpThreadPool.shutdownNow(); 
+0

एक सुंदर शटडाउन के लिए, करें: httpServer.stop (0); httpThreadPool.shutdown(); { httpThreadPool.awaitTerminator (2, TimeUnit.HOURS) आज़माएं; } पकड़ो (अपवाद ई) {... shrieeeeek! ...} –

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