2009-08-25 6 views
7

मैं यह समझ के रूप में, एक J2EE कंटेनर एक JMS प्रदाता को शामिल करने के लिए आवश्यक है। क्या कंटेनर द्वारा प्रदान की गई जेएमएस कतार में संदेश भेजने के लिए एक स्टैंडअलोन जावा एप्लिकेशन के लिए यह संभव है? यदि हां, तो मैं कंटेनर के बाहर से जेएनडीआई लुकअप का उपयोग कैसे करूं?मैं अनुप्रयोग सर्वर बाहर से एक JMS कतार करने के लिए संदेश भेज सकते हैं?

(मैं अगर यह किसी भी फर्क नहीं पड़ता Geronimo के साथ इस कोशिश कर रहा हूँ, लेकिन मैं आशा करता हूं वहाँ ऐसा करने का एक मानक तरीका है।)

उत्तर

5

आप एक InitialContext Geronimo में JNDI सर्वर का उपयोग करता है बनाने के लिए सक्षम होना चाहिए। फिर आप अपने जेएमएस कनेक्शन फैक्टरी और कतार को देखने के लिए इसका उपयोग कर सकते हैं।

निम्न उदाहरण का उपयोग करने के लिए Geronimo JNDI फैक्टरी http://forums.sun.com/thread.jspa?threadID=5283256 से रूपांतरित किया गया।

Context     jndiContext = null; 
ConnectionFactory connectionFactory = null; 
Connection    connection = null; 
Session     session = null; 
Queue     queue = null; 
MessageProducer  messageProducer = null; 

try 
{ 
    //[1] Create a JNDI API InitialContext object. 
    Hashtable properties = new Hashtable(2); 

    // CHANGE these to match Geronimos JNDI service 

    properties.put(Context.INITIAL_CONTEXT_FACTORY, "org.apache.openejb.client.RemoteInitialContextFactory"); 
    properties.put(Context.PROVIDER_URL, "ejbd://127.0.0.1:4201"); 
    jndiContext = new InitialContext(properties); 

    //[2] Look up connection factory and queue. 
    connectionFactory = (ConnectionFactory)jndiContext.lookup("jms/ConnectionFactory"); 
    queue = (Queue)jndiContext.lookup("jms/Queue"); 

    //[3] 
    // - Create connection 
    // - Create session from connection; false means session is not transacted. 
    // - Create sender and text message. 
    // - Send messages, varying text slightly. 
    connection = connectionFactory.createConnection(); 
    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
    messageProducer = session.createProducer(queue); 

    //send a message 
    TextMessage message = session.createTextMessage(this.jTextSend.getText()); 
    messageProducer.send(message); 

    //example for send some object 
    //ObjectMessage message = session.createObjectMessage(); 
    //MyObj myObj = new MyObj ("Name"); //this class must be serializable 
    //message.setObject(myObj); 
    //messageProducer.send(message); 
} 
catch(Exception ex) 
{ 
    LOG.error(ex); 
} 
finally 
{ 
    if(connection !=null) 
    { 
     try 
     { 
      connection.close(); 
     } 
     catch(JMSException e) 
     { 
       LOG.error(e); 
     } 
    } 
} 
+0

आप जोड़ने के लिए इस मानता है कि आप एक स्थानीय JNDI चल रहा है चाहते हो सकता है। – Robin

0

आप एक आवेदन सर्वर के बिना एक JMS कतार में संदेश दे सकते हैं। के बाद से है कि JavaEE आवेदन सर्वर द्वारा प्रदान की गई, JNDI का उपयोग किए बिना -

हालांकि, अगर आप सीधे JMS प्रदाता को पाने के लिए कैसे पता करने के लिए की आवश्यकता होगी।

0

आप यह कर सकते हैं, और वहाँ पतली ग्राहक है कि कतार तक पहुँच रहा है पर निर्भर करता है के लिए कई तरीके हो सकते हैं। उदाहरण @pjp द्वारा दिए गए प्रश्न में सर्वर एक्सेस करने, एक जार जो एक JNDI उदाहरण के साथ अपने आवेदन प्रदान करेगा सहित के लिए उपलब्ध कराने के आप सही जार फ़ाइलें काम करेंगे। ये जार विक्रेता द्वारा प्रदान किए जाने चाहिए, और इसमें जेएनडीआई का उपयोग किये बिना कनेक्ट करने के निर्देश भी शामिल हो सकते हैं। हालांकि मुझे लगता है कि जेएनडीआई विधि सबसे सरल है और सर्वर पर चालू और बंद दोनों को लगातार संहिता रखती है।

प्रत्येक विक्रेता के पास आईबीएम के मामले में ग्राहक पहुंच प्रदान करने के लिए अलग-अलग जार होंगे, वे आंतरिक जेएमएस प्रदाता बनाम वेबस्पियर एमक्यू के लिए अलग हैं (क्योंकि वे दो अलग-अलग कार्यान्वयन हैं)।

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