2009-06-18 4 views
18

के लिए असीमित HTTP क्लाइंट जावा दुनिया में एक सापेक्ष नौसिखिया के रूप में, मुझे कई चीजों को निराशाजनक रूप से पूरा करने में लग रहा है जो कई अन्य ढांचे में अपेक्षाकृत तुच्छ हैं। एक प्राथमिक उदाहरण एसिंक्रोनस http अनुरोधों के लिए एक सरल समाधान है। एक के रूप में देखकर पहले से मौजूद प्रतीत नहीं होता है, सबसे अच्छा तरीका क्या है? एक ब्लॉकिंग प्रकार lib का उपयोग करके अपने स्वयं के थ्रेड बनाकर httpclient या अंतर्निर्मित जावा http सामग्री की तरह, या क्या मुझे नई गैर-अवरुद्ध आईओ जावा सामग्री का उपयोग करना चाहिए - यह विशेष रूप से जटिल है जो सरल होना चाहिए।जावा

जो मैं खोज रहा हूं वह डेवलपर बिंदु दृश्य से उपयोग करना आसान है - AS3 में URLLoader के समान कुछ - जहां आप बस URLRequest बनाते हैं - समापन, त्रुटियों, प्रगति को संभालने के लिए ईवेंट हैंडलर का एक समूह संलग्न करें, आदि, और इसे आग लगाने के लिए एक विधि बुलाओ।

आप AS3 में URLLoader से परिचित नहीं हैं, तो इस तरह इसकी तो सुपर आसान और लग रहा है कुछ:

private void getURL(String url) 
{ 
    URLLoader loader = new URLLoader(); 
    loader.addEventListener(Event.Complete, completeHandler); 
    loader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler); 
    loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 

    URLRequest request = new URLRequest(url); 

    // fire it off - this is asynchronous so we handle 
    // completion with event handlers 
    loader.load(request); 
} 

private void completeHandler(Event event) 
{ 
    URLLoader loader = (URLLoader)event.target; 
    Object results = loader.data; 

    // process results 
} 

private void httpStatusHandler(Event event) 
{ 
    // check status code 
} 

private void ioErrorHandler(Event event) 
{ 
    // handle errors 
} 

उत्तर

5

ऐसा लगता है कि आप चाहते हैं (का एक हिस्सा) NIO - वहाँ एक अच्छा ट्यूटोरियल here, एसिंक्रोनस नेटवर्किंग हिस्सा पी से शुरू होता है। 30 और अंत में कई उपयोगी लिंक हैं।

1

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

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

एक और विकल्प java.net.URL कक्षाओं का उपयोग करना है - और आप उन ऑनलाइन और स्टैक ओवरफ्लो के लिए कई ट्यूटोरियल पा सकते हैं। आप उन्हें धागे में लपेट सकते हैं - इसलिए आपके जावा प्रोग्राम में निष्पादन के कई धागे हैं।

लेकिन फिर आप सिंक्रनाइज़ेशन की समस्या में भाग लेते हैं। जो मैं सहमत हूं, दर्द है, लेकिन फिर यह लचीलापन का एक और अधिक बारीक स्तर प्रदान करता है।

(मुझे लगता है कि इससे आपके प्रश्न का उत्तर नहीं मिलता है - और किसी को वास्तव में अतुल्यकालिक HTTP अनुरोध करने के लिए एक जावा सुविधा के जानता है, मुझे पता है कि कोई दिलचस्पी होगी)

+0

पूरी तरह से अलग निकस समझते हैं। हालांकि, इस उदाहरण में, हम क्लाइंट यूआई फ्रेमवर्क के रूप में जावा का उपयोग कर रहे हैं और प्रस्तुत किए जाने वाले बहुत सारे डेटा बाहरी वेब सेवाओं से आ रहे हैं। – helifreak

+0

असल में कई एसिंक http क्लाइंट हैं, जो अन्य उत्तरों में सूचीबद्ध हैं (जेटी के पास वर्षों से एक है, जकार्ता एचसी काफी समय भी है; निंग का एसिंक http क्लाइंट नवीनतम और सक्रिय रूप से विकसित है)। वे सिर्फ इतना ध्यान नहीं मिला है कि वे लायक हैं। – StaxMan

1

AFAIK TCPMon उपकरण एक लेता है आप जो वर्णन करते हैं उसके समान दृष्टिकोण। आप अपने SVN browser

में स्रोत कोड पर एक नज़र डालें, ब्लॉकिंग कोड की गड़बड़ी के लिए WGET-java पर भी एक नज़र डालें।

लेकिन क्या आपको इसे जावा में लिखना है? इस तरह कुछ ऐसा करने के लिए जेआरबी या राइनो का उपयोग करके कई अन्य दृष्टिकोण हैं जो JVM पर चलेंगे लेकिन जावा में नहीं लिखे गए हैं।

+0

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

1

httpunit और htmlunit कुछ भी करने के लिए एक ब्राउज़र फ़ायरफ़ॉक्स, बिना सिर ब्राउज़िंग, अनुसूचित सॉफ्टवेयर ग्राहकों और एजेंटों अनुकरण जैसे 2 अनुकूलन और विन्यास जावा http ग्राहकों में सक्षम हैं।

+0

मैं इसका उल्लेख करने जा रहा था, लेकिन इनमें से कोई भी असीम नहीं है। हालांकि, वे स्वचालन कार्यों का बहुत तेज़ काम करते हैं। – cwash

0

मैं इसके लिए अलग थ्रेड फायरिंग की सिफारिश करता हूं।

+0

भले ही मैंने अलग धागे निकाल दिए, मुझे अभी भी लगता है कि धागे अवरुद्ध हो रहे हैं और जितनी जल्दी हो सके उतनी जल्दी नहीं ... – trillions

6

यदि आपने इसे पहले से नहीं देखा है, तो जावा 5 java.util देखें।समवर्ती - यह बहु-थ्रेडेड ऐप्स को विकसित करना बहुत आसान बनाता है। आप एक ThreadPoolExecutor सेट कर सकते हैं जो चार थ्रेड प्रबंधित करता है, कहता है। फिर आप पूरा करने के लिए पूल को किसी भी संख्या में फ़ीड करते हैं। प्रत्येक कार्य एक रननेबल है। ThreadPoolExecutor रननेबल कार्यों को कतारबद्ध करेगा और उन्हें समानांतर में उपलब्ध थ्रेड पर फ़ीड करेगा। पूल के बाद एक्सेक्यूट() विधि को कॉल किया जाता है जब प्रत्येक रननेबल कार्य पूरा हो जाता है।

मैं स्पष्ट रूप से 1 999 में जावा में लिखे गए वेब ब्राउज़र के लिए एक फ़ेच थ्रेड पूल लिखना याद रखता हूं, और यह सही होने के लिए भालू था। पिछले महीने मैंने एक वेब सर्वर के लिए एक लोड टेस्टर लिखा था। परीक्षक के पास ThreadPoolExecutor है जिसमें n थ्रेड हैं, और रननेबल कार्य मैं इसे प्रत्येक को अपाचे HTTP क्लाइंट का उपयोग करके एक पृष्ठ लाता हूं। यह उचित रूप से अच्छी तरह से काम करने के लिए सिर्फ एक या दो घंटे लग गए। मुझे लगता है कि आप jache.util.concurrent को अपाचे HTTP क्लाइंट के साथ जोड़ना चाहेंगे, हालांकि ऐसा लगता है कि आपको प्रगति संकेत के लिए कुछ अनुकूलन करने की आवश्यकता होगी।

(ध्यान दें कि अपाचे HTTP क्लाइंट अपने स्वयं के धागे पूलिंग करता है, और 20 धागे अधिकतम करने के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन सीमा आप, और केवल दो प्रत्येक वेब सर्वर से।)

अद्यतन: यहाँ Apache HTTP Client के लिए लिंक है। MultiThreadedHttpConnectionManager पर पढ़ना सुनिश्चित करें, यह कनेक्शन पूल को नियंत्रित करता है, और यह सबसे बुनियादी उदाहरण में नहीं दिखाया गया है।

+0

अच्छी जानकारी। धन्यवाद। मैं अभी भी विश्वास नहीं कर सकता कि क्लाइंट असभ्य जावा कैसे है। शायद जावा अपनी उम्र दिखाने के लिए शुरू कर रहा है। – helifreak

+0

मैंने 1.4 और जावा 5 वर्षों के दौरान जावा में लगभग कोई विकास नहीं किया, और अब मुझे जावा 6 1.3 से काफी बेहतर लगता है। Java.util.concurrent के अलावा, जेनेरिक और संग्रह ढांचे का खड़ा है। जावा पर स्तरित तकनीक असभ्य प्रतीत हो सकती है हालांकि: ग्रोवी के संक्षिप्त एक्सएमएल प्रोसेसिंग के साथ जेएक्सपी की तुलना करें। इसके अलावा। रूबी, पायथन और स्कैला जैसी गतिशील भाषाएं इन दिनों गंभीर प्रतिस्पर्धा हैं। –

+2

नहीं, ऐसा नहीं है कि जावा उम्र दिखा रहा है; एकाधिक गैर-जेडीके-बंडल गैर-अवरुद्ध (एसिंक्रोनस) http क्लाइंट देखें। समवर्ती पहुंच करने के लिए थ्रेड के साथ स्पष्ट रूप से गड़बड़ करने की आवश्यकता नहीं है। हालांकि जेडीके में गैर-अवरुद्ध विकल्प रखना सुविधाजनक होगा, लेकिन इतनी उपयोगी चीजें हैं कि जेडीके को किसी भी बड़े गुब्बारे से रखने की कोशिश करना बेहतर होगा। – StaxMan

1

भी http://www.javaworld.com/javaworld/jw-03-2008/jw-03-asynchhttp.html इस लेख में एक देखो चर्चा async HTTP के आधार पर ले लो एक HttpClient xLightweb

+0

http://xlightweb.sourceforge.net/ देखें। ऐसा लगता है कि सक्रिय रूप से विकसित किया गया है। – Eelco

0

मैं सिर्फ Geronimo के भीतर कार्यान्वित अतुल्यकालिक HTTP ग्राहक पर ठोकर खाई नाम दिया है। आप इसे देख सकते हैं, http://svn.apache.org/viewvc/geronimo/sandbox/AsyncHttpClient/ पर - चेतावनी: नवीनतम प्रतिबद्धता एक वर्ष से अधिक पुरानी प्रतीत होती है। Jetty HTTP client अतुल्यकालिक है xsocket.sourceforge.net

+0

यह http://cwiki.apache.org/AWEB/ वर्तमान स्थान प्रतीत होता है। यह सुनिश्चित नहीं है कि यह कितना सक्रिय है। – Eelco

5

:

एक अन्य परियोजना एक अतुल्यकालिक HTTP ग्राहक निर्माण xsocket है।

8

अपाचे कॉमन्स एचटीपी क्लाइंट का संस्करण 4.0 (अब HttpComponents/HttpCore में) जावा के एनआईओ (गैर-अवरुद्ध आईओ) का भी समर्थन करता है। मुझे लगता है कि यह तुम्हारा सबसे अच्छा शर्त है।

15

"Async Http क्लाइंट" का उपयोग करें जिसे पहले ning http क्लाइंट लाइब्रेरी कहा जाता था। http://code.ning.com/2010/03/introducing-nings-asynchronous-http-client-library/

अब उपलब्ध देखें GitHub पर https://github.com/ning/async-http-client

+1

और यह http://github.com/ning/async-http-client पर github पर है। मैं इसका उपयोग करने की सिफारिश कर सकता हूं, हालांकि ज्यादातर एक साधारण विश्वसनीय सिंक्रोनस http क्लाइंट के रूप में। लेकिन साधारण भविष्य-आधारित परिणामों के साथ, एसिंक ऑपरेशन भी उपयोग करना आसान है। – StaxMan

+1

उन्होंने गिटहब रिपोज़ को बदल दिया है, वे अब http://github.com/AsyncHttpClient/async-http-client – jfager

+1

पर हैं, उन्होंने वास्तव में गिटहब रिपोज़ को फिर से बदल दिया है और अब https://github.com/sonatype/ पर हैं async-http-ग्राहक। मैंने अभी सही रेपो स्थान को प्रतिबिंबित करने के लिए उत्तर अपडेट किया है। –

0

Asyncweb अपने http सर्वर के साथ एक अतुल्यकालिक http ग्राहक प्रदान करता है। निम्न स्थान से डाउनलोड के लिए उपलब्ध है:

https://svn.apache.org/repos/asf/mina/asyncweb/trunk

+0

लेकिन क्या यह एक मृत परियोजना नहीं है? – StaxMan

2

वहाँ पुस्तकालयों और चौखटे NIO/Netty के शीर्ष पर लिखा है - RxNetty और Vertx जो अतुल्यकालिक HTTP ग्राहक

नीचे लिखने के लिए सहायक हो सकता है एक उदाहरण है कोड का उपयोग कर vertx

public class Client extends AbstractVerticle { 

    @Override 
    public void start() throws Exception { 
    //lambda callback would be called when the response comes back 
    vertx.createHttpClient().getNow(8080, "localhost", "/", resp -> { 
     System.out.println("Got response " + resp.statusCode()); 
     resp.bodyHandler(body -> { 
     System.out.println("Got data " + body.toString("ISO-8859-1")); 
     }); 
    }); 
    //this code statement will execute before response comes back 
    System.out.println("I am not blocked"); 
    } 
} 

आप here

से पूर्ण विकसित उदाहरण कोड प्राप्त कर सकते हैं