2011-09-07 21 views
9

Tôi không thể nhận được javax.jms.ConnectionFactory được tiêm vào máy khách JMS độc lập của mình. Tôi nhận được java.lang.NullPointerException tại connectionFactory.createConnection() trong mã bên dưới.JavaEE 6: Cách nạp tài nguyên JMS vào một máy khách JMS độc lập?

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

} 

Tôi đã tạo ra các máy kết nối tương ứng và Resource Destination tại mở MQ (MoM) sử dụng Glassfish 3.1 Admin Console.

Ai đó có thể giúp tôi hiểu tôi đang thiếu gì không?

+2

'@ Resource' không hoạt động nhưng tìm kiếm bằng cách sử dụng tên JNDI. \t 'Ngữ cảnh jndiContext = new InitialContext(); \t \t Kết nốiKết nối nhà máyFactory = (ConnectionFactory) jndiContext.lookup ("jms/QueueConnectionFactory"); \t Hàng đợi đích = (Hàng đợi) jndiContext.lookup ("jms/ShippingRequestQueue"); ' – skip

+0

Cảm ơn, điều này đã làm việc cho tôi. – Puckl

Trả lời

7

Hoạt động phun tài nguyên chỉ hoạt động trong môi trường được quản lý, chẳng hạn như máy chủ ứng dụng Java EE hoặc vùng chứa Spring. Trong một ứng dụng độc lập JNDI là lựa chọn duy nhất của bạn.

Chú thích nói chung có nghĩa là được xử lý bởi một số công cụ/khung công tác và JVM đơn giản thực hiện phương thức main() của bạn chỉ đơn giản là không chứa như vậy. Các chú thích duy nhất tôi biết được chú thích được JVM xử lý ra khỏi hộp là thời gian biên dịch @Deprecated, @Override@SuppressWarnings.

Trả lời cho bình luận của bạn: Tôi không có quyền truy cập vào các cuốn sách, vì vậy tôi sẽ chỉ đoán rằng họ có thể mô tả việc chạy một bộ phận khách hàng ứng dụngkhôngđộc lập ứng dụng client. Nó không giống nhau — check Glassfish EJB FAQ. Các ACC thường được triển khai vào một máy chủ ứng dụng và có thể được thực hiện thông qua Java Web Start hoặc không có nó, nhưng theo một cách cụ thể AS. Xem Glassfish example (bạn không nói những gì AS EJB của bạn thực hiện trong).

+0

'lớp công khai ShippingRequestJMSNhà sản xuất { @Resource (tên =" jms/ShippingRequestQueue ", mappedName =" ShippingRequestQueue ") riêng tĩnh Điểm đến đích; @Resource (name = "jms/QueueConnectionFactory") kết nối tĩnh riêng Kết nối nhà máyFactory; public static void main (String [] args) {// \t còn lại của mã }} '. Đây là một phần của đoạn mã từ chương 4 trong cuốn sách ** EJB 3 in Action **. Sự phụ thuộc vào việc tiêm các tài nguyên đang được thực hiện trong máy khách độc lập này. Làm thế nào nó hoạt động? – skip

+0

@skip Xem câu trả lời đã chỉnh sửa của tôi. – MaDa

+0

Phải. Với ** gf-client.jar ** trong đường dẫn xây dựng, bạn chỉ có thể sử dụng phương thức 'lookup' với tên JNDI để đến tài nguyên. Nhưng đối với việc tiêm phụ thuộc để làm việc trong một máy khách độc lập, nó cần phải được triển khai tới một thùng chứa EJB để nhận được thêm nước JavaEE. http://www.ensode.net/glassfish_rich_ejb_clients.html hữu ích. Với Glassfish 3.1 'appclient -client myappclient.jar' hoạt động. Cảm ơn. – skip

1

@skip: thử @Resource(name="jms/QueueConnectionFactory") instead of @Resource(mappedName="jms/QueueConnectionFactory")

name = tên JNDI theo javax.annotation.Resource java doc.

+0

Tôi đã thử nó, nhưng nó vẫn không hoạt động: ( – skip

+0

Tôi đã thử '@Resource (lookup =" jms/QueueConnectionFactory ")' nhưng tôi vẫn nhận được lỗi tương tự như đã đề cập ở trên vì tôi không thể nhận được – skip

+0

@skip, điều này thật lạ, bởi vì nếu bạn nhìn vào liên kết: - http://java.sun.com/javaee/5/docs/api/javax/annotation/Resource.html tên thuộc tính liên quan đến JNDI Bạn đã cố gắng giải quyết tên JNDI này một cách rõ ràng thông qua NamingContext API? – ag112