2009-02-26 12 views
56

अन्य में java.nio में async io (सॉकेट-आधारित) के लिए कौन से विकल्प हैं? इसके अलावा java.nio बैकग्राउंड में धागे का उपयोग करता है (जैसा कि मुझे लगता है कि .NET की एसिंक-सॉकेट-लाइब्रेरी करता है, हो सकता है कि यह बदला गया हो) या क्या यह उचित चयन कॉल का उपयोग करके "सत्य" async io है?असीमित आईओ?

+6

जहां अंतर्निहित धारा इसका समर्थन करती है,।एनईटी कॉलबैक निष्पादित करने के लिए आईओ समापन बंदरगाहों और थ्रेडपूल थ्रेड का उपयोग करता है। –

+0

जॉन, जब अंतर्निहित धारा इसका समर्थन नहीं कर सकती है? –

+0

java.nio का उपयोग न करने के बारे में कोई विशिष्ट कारण? असल में, मैं काम पर अपने प्रोजेक्ट में कुछ एसिंक्रोनस i/o को लागू करने की कोशिश कर रहा हूं और मैंने इनमें से किसी भी का उपयोग नहीं किया है। इसलिए जानना चाहता था। धन्यवाद। – Bhushan

उत्तर

44

जावा का एनआईओ पैकेज (जावा 6 के रूप में), गैर-अवरुद्ध I/O के लिए केवल Selector एस के माध्यम से समर्थन प्रदान करता है। जावा 7 उम्मीद है कि एनआईओ 2 के साथ जहाज जा रहा है, जिसमें एसिंक्रोनस आई/ओ समर्थन शामिल है। आज, आपकी सबसे अच्छी शर्त एक ढांचे का उपयोग करना है। एआरमिस्टिस ने मीना का उल्लेख किया। यहां कुछ अन्य हैं।

  1. Grizzly। यह सूर्य के GlassFish सर्वर के लिए I/O कोर है। ग्रीज़ली एसिंक्रोनस रीड/राइट्स (कतार मॉडल के माध्यम से) करने की सुविधा प्रदान करता है। यह एक जैसे टीसीपी और यूडीपी का समर्थन करता है। मैंने कुछ परियोजनाओं में ग्रिज़ली का उपयोग किया है। ऐसी चीजें हैं जिन्हें मैं ढांचे के बारे में पसंद करता हूं और नापसंद करता हूं, लेकिन विस्तार से यह वास्तव में एक और विषय है। मैं कहूंगा कि कुछ उठाना और दौड़ना काफी आसान है और ग्रिज़ली आपके लिए भारी भारोत्तोलन करता है।
  2. Netty। यह परियोजना मीना प्रोजेक्ट के मूल लेखकों में से एक से आती है। मैंने इसका इस्तेमाल नहीं किया है इसलिए मुझे एसिंक्रोनस I/O के समर्थन के बारे में पता नहीं है। आपको एक नज़र रखना चाहिए

अब, धागे के बारे में आपके प्रश्न के संबंध में, एनआईओ चयनकर्ता गैर-अवरुद्ध I/O के लिए धागे का उपयोग नहीं करते हैं। जेडीके 6 में वे का उपयोग करें() विंडोज के तहत और नए लिनक्स कर्नेल पर एपोल सुविधा का चयन करें। एसिंक्रोनस I/O के लिए, थ्रेडिंग विवरण ढांचे पर निर्भर करते हैं।

+1

जावा का एनआईओ ब्लॉकिंग आईओ का भी समर्थन करता है। ;) –

+1

नेटटी असीमित और घटना-संचालित MINA की तरह है। होम पेज में वास्तविक उपयोगकर्ताओं द्वारा लिखित प्रशंसापत्र और प्रदर्शन रिपोर्ट देखें। :) – trustin

+0

ऐसा लगता है कि जावा 7 वास्तव में एसिंक I/O के साथ रिलीज़ हुआ था: http://openjdk.java.net/projects/nio/presentations/TS-5686.pdf –

12

java.nio सिर्फ एक पैकेज है - "गूंगा" वर्गों का संग्रह - स्वयं ही यह थ्रेड के किसी भी उपयोग को नियोजित नहीं करता है। जब Reactor design pattern में ठीक से उपयोग किया जाता है, तो आप उचित, पूरी तरह से स्केलेबल, एसिंक्रोनस I/O प्राप्त कर सकते हैं।

+0

आपका उत्तर मेरे लिए वैध लगता है, लेकिन क्या आप और समझा सकते हैं? थोड़ा और स्पष्टीकरण कृपया। –

6

यदि आप नेटवर्क सामग्री के लिए इसका उपयोग करने में रुचि रखते हैं। वास्तव में एक अच्छा विकल्प है:

http://mina.apache.org/

वहाँ एक नज़र उपयोग करने के लिए अपनी आसान और बहुत शक्तिशाली है।

15

libs के संबंध में एक और सुझाव नागा (http://naga.googlecode.com) होगा। यह एक ढांचे की तरह थोड़ा और पुस्तकालय की तरह थोड़ा सा है। यह सामान्य जावा सॉकेट की तरह दिखने की कोशिश करता है, अगर वह चाय का प्याला है। यह ग्रिज़ली, मीना और नेटी की तुलना में सरल है।

+0

नागा वास्तव में असीमित सामग्री के चारों ओर एक बहुत अच्छा रैपर की तरह लगता है। –

+1

यदि आप अपने रास्ते में ढांचे के बिना एसिंक्रोनस सॉकेट I/O करना चाहते हैं, तो नागा आप चाहते हैं। – poindexter

+1

नागा दलविक/एंड्रॉइड के तहत अच्छी तरह से काम करता है? –

2

मूल प्रश्न के लिए, कार्यान्वयन केवल एक मामले में प्रति थ्रेड I/O ऑपरेशन का उपभोग करता है, यूनिक्स/लिनक्स सिस्टम पर असिंक्रोनसफाइल चैनल।

16

जावा 7 भविष्य का वर्ग के साथ एनआईओ 2 इतना नया जवाब आया। उदाहरण:

सर्वर साइड पर:

final AsynchronousServerSocketChannel serverSocket= 
    AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection 
Future<AsynchronousSocketChannel> future= serverSocket.accept(); 
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled() 

//Do whatever you want .. 
InputStream stream = Channels.newInputStream(clientSocket) (...) 

ग्राहक के पक्ष में:

AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open(); 
Future connected = localSocket.connect(ourServerSocketAddress); 
// later: if(future.isDone()) 
connected.get(); 

//Send something 
OutputStream os = Channels.newOutputStream(clientChannel); 
os.write (...) 

अद्यतन: आप अभिनेता मॉडल का उपयोग कर सकते हैं तो AKKA TCP IO भी बेहतर होगा।

+3

भविष्य सच async नहीं है। यह धागा/सेमफोर आधारित है: http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html – Josmar

+9

"असली async" क्या है? - सिर्फ इसलिए कि यह थ्रेड का उपयोग करके लागू किया गया है इसका मतलब यह नहीं है कि यह असीमित नहीं है ... – DejanLekic

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