2011-09-07 8 views
9

मुझे अपने स्टैंडअलोन जेएमएस क्लाइंट में इंजेक्शन javax.jms.ConnectionFactory नहीं मिल सकता है। मुझे नीचे दिए गए कोड में java.lang.NullPointerExceptionconnectionFactory.createConnection() पर मिलता है।जावाईई 6: एक स्टैंडअलोन जेएमएस क्लाइंट में जेएमएस संसाधन कैसे इंजेक्ट करें?

JmsClient.java

public class JmsClient { 

    @Resource(mappedName="jms/QueueConnectionFactory") 
    private static ConnectionFactory connectionFactory;  

    @Resource(mappedName="jms/ShippingRequestQueue") 
    private static Destination destination; 

    public static void main(String[] args) {   
     try { 
      Connection connection = connectionFactory.createConnection(); 
      connection.start(); 

      Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
      MessageProducer producer = session.createProducer(destination); 
      ObjectMessage message = session.createObjectMessage(); 

      ShippingRequestQueue shippingRequest = new ShippingRequestQueue(1, "107, Old Street"); 

      message.setObject(shippingRequest); 
      producer.send(message); 
      session.close(); 
      connection.close(); 

      System.out.println("Shipping request message sent .."); 
     } catch (Throwable ex) { 
      ex.printStackTrace(); 
     }   
    } 

} 

मैं ओपन MQ (MoM) पर इसी कनेक्शन फैक्टरी और गंतव्य संसाधन बनाया है Glassfish 3.1 व्यवस्थापक कंसोल का उपयोग।

क्या कोई मुझे समझने में मदद कर सकता है कि मुझे क्या याद आ रहा है?

+2

'संसाधन 'काम नहीं करता है लेकिन जेएनडीआई नाम का उपयोग करके देख रहा है। \t 'संदर्भ jndiContext = नया InitialContext(); \t \t कनेक्शन फैक्टरी कनेक्शन फैक्टरी = (कनेक्शन फैक्टरी) jndiContext.lookup ("jms/QueueConnectionFactory"); \t कतार गंतव्य = (कतार) jndiContext.lookup ("jms/ShippingRequestQueue"); ' – skip

+0

धन्यवाद, यह मेरे लिए काम करता है। – Puckl

उत्तर

7

संसाधन इंजेक्शन केवल एक प्रबंधित वातावरण में काम करता है, जैसे जावा ईई अनुप्रयोग सर्वर, या एक स्प्रिंग कंटेनर, उदाहरण के लिए। एक स्टैंडअलोन एप्लिकेशन में जेएनडीआई आपकी एकमात्र पसंद है।

सामान्य रूप से एनोटेशन को कुछ टूल/ढांचे द्वारा संसाधित किया जाना है, और सादा JVM जो आपके main() विधि को निष्पादित करता है, इसमें बस ऐसा नहीं होता है। बॉक्स के बाहर जेवीएम द्वारा संसाधित की जाने वाली एकमात्र एनोटेशन संकलित-समय @Deprecated, @Override और @SuppressWarnings हैं।

अपनी टिप्पणी का उत्तर देने से: मैं किताब करने के लिए पहुँच नहीं है, इसलिए मैं केवल अनुमान लगा होगा कि वे शायद एक आवेदन ग्राहक घटक और नहींस्वतंत्र अनुप्रयोग ग्राहक चल वर्णन करते हैं। यह वही — check Glassfish EJB FAQ नहीं है। एसीसी आमतौर पर एक एप्लीकेशन सर्वर में तैनात होते हैं और जावा वेब स्टार्ट या इसके बिना निष्पादित किए जा सकते हैं, लेकिन एक एएस-विशिष्ट तरीके से। Glassfish example देखें (आपने यह नहीं कहा था कि आपके ईजेबी के रूप में क्या निष्पादित होता है)।

+0

'पब्लिक क्लास शिपिंगिंगवेस्टजेएमएस प्रोड्यूसर { @ संसाधन (नाम = "जेएमएस/शिपिंगिंगवेक्व्यूक्यूयू", मैप्डनाम = "शिपिंगिंगवेक्व्यूक्यूयू") निजी स्थैतिक गंतव्य गंतव्य; @ संसाधन (नाम = "jms/QueueConnectionFactory") निजी स्थैतिक कनेक्शन फैक्टरी कनेक्शन फैक्टरी; public static void (String [] args) } '{ \t // कोड के बाकी}। यह ** ** एजेबी 3 में एक्शन ** से अध्याय 4 से कोड का एक हिस्सा है। इस स्टैंडअलोन क्लाइंट में संसाधनों का निर्भरता इंजेक्शन किया जा रहा है। यह कैसे काम करता है? – skip

+0

@skip मेरा संपादित उत्तर देखें। – MaDa

+0

दाएं। ** gf-client.jar ** के साथ निर्माण पथ में आप केवल संसाधनों के लिए JNDI नाम के साथ 'लुकअप' विधि का उपयोग कर सकते हैं। लेकिन एक स्टैंडअलोन क्लाइंट में काम करने के लिए निर्भरता इंजेक्शन के लिए इसे अतिरिक्त जावाईई रस प्राप्त करने के लिए इसे ईजेबी कंटेनर में तैनात करने की आवश्यकता है। http://www.ensode.net/glassfish_rich_ejb_clients.html उपयोगी था। ग्लासफ़िश 3.1 'एपक्लिएंट-क्लाइंट myappclient.jar' के साथ काम करता है। धन्यवाद। – skip

1

@skip: प्रति javax.annotation.Resource जावा दस्तावेज़ के रूप में @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

नाम = JNDI नाम का प्रयास करें।

+0

मैंने इसे आजमाया, लेकिन यह अभी भी काम नहीं करता है :( – skip

+0

मैंने '@ संसाधन (लुकअप =" jms/QueueConnectionFactory ") की कोशिश की है, लेकिन अभी भी मुझे ऊपर बताए गए एक ही त्रुटि मिल रही है क्योंकि मैं प्राप्त नहीं कर पा रहा हूं संसाधन इंजेक्शन। – skip

+0

@skip, यह अजीब है। क्योंकि यदि आप लिंक देखते हैं: - http://java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html विशेषता JNDI से संबंधित विशेषता नाम। क्या आपने इस जेएनडीआई नाम को स्पष्ट रूप से NamingContext API के माध्यम से हल करने का प्रयास किया था? – ag112

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