2009-01-14 9 views
5

मेरे पास जावा में दो मशीनों में दो प्रक्रियाओं में लिखा गया है जो डेटा के सरल हिस्सों को एक दूसरे को पास करना चाहिए।


विभिन्न मशीनों में प्रक्रियाओं के बीच संचार के लिए त्वरित और गंदे समाधान

मैं एक त्वरित और गंदा तरीका के लिए देख रहा हूँ (साझा नेटवर्क फ़ाइलों पर परिवर्तन के लिए फ़ाइलों और मतदान लेखन का सहारा के बिना)

उत्तर

0

प्रश्न स्पष्ट नहीं है। क्या आप उपयोग करने के लिए एक एपीआई या पुस्तकालय की तलाश में हैं? क्या दो मशीनें एक-दूसरे के पते को शुरू करने के लिए जानती हैं या क्या उन्हें एक-दूसरे की खोज करने की ज़रूरत है?

आप अधिकांश संचार के लिए जेएमएस का उपयोग कर सकते हैं, लेकिन सभी मशीनों को "ब्रोकर प्रक्रिया" से परिचित होना चाहिए जो अलग से चल रहा है।

6

जावा RMI (दूरस्थ विधि इंटरफेस)

+0

क्या आपको जेएनडीआई सेटअप की भी आवश्यकता नहीं है? शायद जल्दी और गंदा लग रहा है। –

+0

यह सॉकेट से बेहतर है। यदि आप किसी साझा फ़ाइल सिस्टम पर लिखना नहीं चाहते हैं, तो वहां और क्या विकल्प है? –

+0

जेएमएस, टेराकोटा, स्प्रिंग रिमोटिंग, HTTP, एक्सएमपीपी, आरएमआई के अलावा कुछ भी। Yech। –

1

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

इसलिए प्रत्येक प्रक्रिया में एक विशिष्ट बंदरगाह पर श्रोता होगा और हर बार उस बंदरगाह में डेटा भेज देगा।

2

मानते हैं कि मशीनों में एक-दूसरे के पते हैं (कहा जा रहा पता एक अलग मुद्दा है), मुझे लगता है कि आपकी सबसे अच्छी शर्त Spring remoting है। आपके पास डेटा पास करने वाला इंटरफ़ेस है, एक डोमेन ऑब्जेक्ट जो उस डेटा को समाहित करता है जिसे आप पास करना चाहते हैं, और प्रत्येक पक्ष पर उस इंटरफ़ेस को कार्यान्वित करने वाली एक दूरस्थ सेवा। उसके बाद, आपका कोड दूरस्थ सेवा को केवल एक अन्य सहयोगी के रूप में मानता है। सस्ता, आसान, तेज़, और आप जो भी परिवहन पसंद करते हैं उसका उपयोग कर सकते हैं (आरएमआई, HTTP, हेसियन, बर्लप इत्यादि)।

यह आमतौर पर एक मौजूदा इंटरफ़ेस/सेवा को रीमोटिंग सेवा के रूप में बेनकाब करने के लिए लगभग 10 मिनट (अधिकतर) लेता है, हालांकि पहली बार थोड़ी देर लग जाएगी।

1

मैं हूँ दूसरा RMI और JMS की तरह एक बड़ा प्रणाली की भूमि के ऊपर के बिना, अपनी प्रक्रियाओं सॉकेट के माध्यम से संवाद, और उल्लेख है कि अपाचे के MINA पैकेज बहुत ही सरल और मजबूत है, साथ ही स्केलेबल बात की इस प्रकार की बनाता करने का विचार । इसमें एन्कोडिंग और डिकोडिंग संदेशों के लिए कुछ अच्छा समर्थन भी शामिल है। मैंने मध्यम स्तर की प्रणाली में बहुत सफलतापूर्वक उपयोग किया है।

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

0

मुझे लगता है कि आरएमआई कुछ हद तक परेशान है। आपको एक ही रिमोट ऑब्जेक्ट के लिए 3 फाइलों को परिभाषित करना होगा और आपको सामान्य विकास प्रक्रिया के बाहर सामान सीखना होगा यदि आप पहले से ही इसका उपयोग नहीं करते हैं (मुझे विश्वास है कि इसमें एक अलग कंपाइलर चरण शामिल है)।

इसे काम करने के लिए उपकरण हो सकते हैं, लेकिन क्या मैं बस एक साधारण सॉकेट खोलने का सुझाव दे सकता हूं? वे उपयोग करने के लिए तुच्छ के करीब हैं।

एकमात्र चेतावनी यह है कि आपको कंप्यूटर के बीच क्या प्रवाह बहने के बारे में सावधान रहना चाहिए।

+0

स्टब्स/स्केल के साथ-साथ आरएमआईसी चला गया जब जावा 5 बाहर आया – basszero

+0

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

+0

आह ... हाँ, उन वस्तुओं। मैंने पाया है कि प्रॉक्सी क्लास कुछ सावधानीपूर्वक प्रतिबिंब के साथ मिलकर कुछ दर्दनाक कॉलों को दूर कर सकती है। अपने रिमोट इंटरफ़ेस के लिए प्रॉक्सी बनाएं और असली ऑब्जेक्ट में कॉल प्रतिनिधि दें। निर्बाध। – basszero

2

ActiveMQ ब्रोकर पर जेएमएस बहुत आसान है। यह उपलब्ध here है। एक संदेश भेजने के लिए निम्नलिखित त्वरित और गंदे छद्म कोड है, लेकिन जैसा कि आप इसका न्यूनतम कोड देख सकते हैं। दो जावा ऐप्स, एक प्रकाशक और एक ग्राहक पर विचार करें।

  1. अपने प्रकाशक से एक में एक दलाल बनाएं: (: ग्राहक दलाल चल मशीन के पते के साथ स्थानीय होस्ट का स्थान ले लेगा नोट): दोनों अनुप्रयोगों में

    BrokerService broker = new BrokerService();  
    broker.addConnector("tcp://localhost:61616");  
    broker.setPersistent(false);  
    broker.start(); 
    
  2. सेटअप कनेक्शन

    प्रकाशन आवेदन में
    final ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");  
    TopicConnection connection = factory.createTopicConnection();  
    Session session = connection.createSession(false,Session.DUPS_OK_ACKNOWLEDGE);  
    
  3. भेजें डेटा:

    Topic topic = session.createTopic("Quick and dirty topic"); 
    MessageProducer producer = session.createProducer(topic);  
    ObjectMessage message = session.createObjectMessage();  
    message.setObject((Serializable) "Object you want to send");  
    producer.send(message); 
    
  4. आप में सदस्यता लेने एप्लिकेशन (जो javax.jms.MessageListener को लागू करना चाहिए) निम्नलिखित सेटअप की जरूरत है:

    Destination dest = session.createTopic("Quick and dirty topic");  
    MessageConsumer consumer = session.createConsumer(dest);  
    consumer.setMessageListener(this); 
    
  5. सदस्यता लेने एप्लिकेशन की onMessage(Message arg0) विधि (जो यह है क्योंकि इसके एक MessageListener) को सूचित किया जाएगा प्रकाशित वस्तुओं का।

0

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

1

आपको यह करने के लिए बहुत आसान तरीका होने के लिए Terracotta मिल सकता है। टेराकोटा आपको अपने ढेर के एक हिस्से को क्लस्टर करने की अनुमति देता है (उदाहरण के लिए, हैश मैप) और सभी नोड्स पर उस मानचित्र की सामग्री देखें। इसे स्थापित करना काफी मामूली है।

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