2011-09-07 46 views
9

我無法將javax.jms.ConnectionFactory注入到我的獨立JMS客戶端中。 我在下面的代碼中獲得java.lang.NullPointerExceptionconnectionFactory.createConnection()JavaEE 6:如何在獨立的JMS客戶端中注入JMS資源?

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(); 
     }   
    } 

} 

我已經使用Glassfish的3.1管理控制檯創建相應的連接工廠和目標資源在打開MQ(MOM)。

有人能幫我理解我錯過了什麼嗎?

+2

'@ Resource'不起作用,但使用JNDI名稱查找。 \t'Context jndiContext = new InitialContext(); \t \t ConnectionFactory connectionFactory =(ConnectionFactory)jndiContext.lookup(「jms/QueueConnectionFactory」); \t隊列目的地=(隊列)jndiContext.lookup(「jms/ShippingRequestQueue」);' – skip

+0

謝謝,這對我很有用。 – Puckl

回答

7

資源注入僅適用於託管環境,例如Java EE應用程序服務器或Spring容器。 在獨立應用程序中,JNDI是您唯一的選擇

註解一般意味着被某些工具/框架處理,並且執行您的main()方法的普通JVM根本不包含此類。我知道的唯一註釋是JVM開箱即用的編譯時間@Deprecated,@Override@SuppressWarnings

回覆您的評論:我沒有訪問到這本書,所以我只能猜測,他們可能提供運行的應用程序客戶端組件獨立的應用程序客戶端。這是不一樣的— check Glassfish EJB FAQ。 ACC通常部署到應用程序服務器中,可以通過Java Web Start或沒有它的情況下執行,但是以AS特定的方式執行。請參閱Glassfish example(您沒有說明您的EJB執行的內容)。

+0

'公共類ShippingRequestJMSProducer {@Resource(name =「jms/ShippingRequestQueue」,mappedName =「ShippingRequestQueue」) private static Destination destination; @Resource(name =「jms/QueueConnectionFactory」) private static ConnectionFactory connectionFactory; 公共靜態無效的主要(字串[] args){ \t //其餘的代碼 的}} ' 。這是本書第3章代碼的一部分** EJB 3 in Action **。這個獨立的客戶端正在完成對資源的依賴注入。它是如何工作的? – skip

+0

@skip查看我編輯的答案。 – MaDa

+0

對。在構建路徑中使用** gf-client.jar **,您只能使用帶有JNDI名稱的'lookup'方法來獲取資源。但是爲了依賴注入在獨立客戶端中工作,需要將它部署到EJB容器以獲得額外的JavaEE汁液。 http://www.ensode.net/glassfish_rich_ejb_clients.html很有用。使用Glassfish 3.1'appclient -client myappclient.jar'工作。謝謝。 – skip

1

@skip:儘量@Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

名= JNDI名稱爲每javax.annotation.Resource Java文檔。

+0

我試過了,但它仍然不起作用:( – skip

+0

我試過'@Resource(lookup =「jms/QueueConnectionFactory」)'',但是我仍然收到上面提到的錯誤,因爲我無法獲得注入的資源 – skip

+0

@skip,這很奇怪,因爲如果你看鏈接: - http://java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html屬性名稱與JNDI相關你嘗試通過NamingContext API明確解析這個JNDI名字 – ag112