2010-05-12 27 views
5

Điều gì có thể là nguyên nhân của ClassCastException sau trong ứng dụng khách JMS độc lập khi nó cố gắng truy xuất nhà máy kết nối từ nhà cung cấp JNDI?Tại sao nên chọn ClassCastException trên JMS ConnectionFactory trong JNDI?

Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory 

Dưới đây là một phiên bản rút gọn của khách hàng JMS bao gồm duy nhất của nó start()stop() phương pháp. Ngoại lệ xảy ra trên dòng đầu tiên trong phương thức start() cố gắng truy xuất nhà máy kết nối từ nhà cung cấp JNDI, một máy chủ LDAP từ xa. Nhà máy kết nối JMS và các đối tượng đích nằm trên một máy chủ JMS từ xa.

class JmsClient { 
    private ConnectionFactory connectionFactory; 
    private Connection connection; 
    private Session session; 
    private MessageConsumer consumer; 
    private Topic topic; 

    public void stop() throws JMSException { 
     consumer.close(); 
     session.close(); 
     connection.close(); 
    } 

    public void start(Context context, String connectionFactoryName, String topicName) throws NamingException, JMSException { 
     // ClassCastException occurs when retrieving connection factory. 
     connectionFactory = (ConnectionFactory) context.lookup(connectionFactoryName); 
     connection = connectionFactory.createConnection("username","password"); 
     session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); 
     topic = (Topic) context.lookup(topicName); 
     consumer = session.createConsumer(topic); 
     connection.start(); 
    } 

    private static Context getInitialContext() throws NamingException, IOException { 
     String filename = "context.properties"; 
     Properties props = new Properties(); 
     props.load(new FileInputStream(filename)); 
     return new InitialContext(props); 
    } 
} 

Mặc dù tôi không muốn tiết lộ nội dung cụ thể của context.properties, nó có chứa các mục chung sau đây:

java.naming.factory.initial=... 
java.naming.provider.url=... 
java.naming.security.principal=... 
java.naming.security.credentials=... 
+1

http://forums.sun.com/thread.jspa?threadID=619429 xem liệu điều này có thể giúp – Bozho

+0

Điều này phụ thuộc hoàn toàn vào máy chủ JavaEE bạn đang sử dụng hay không. Ngoài ra, bạn đang sử dụng giá trị nào cho 'connectionFactoryName'? – skaffman

+0

Đây là một máy khách Java độc lập sử dụng thư viện máy khách Geronimo JMS 'geronimo-jms-1.1-spec.jar' và một thư viện JMS bổ sung tùy chỉnh và một thư viện liên quan đến JNDI. –

Trả lời

9

Hóa ra rằng vấn đề là do một jarfile Tibco JMS, tibjms.jar, là vắng mặt từ đường dẫn lớp JVM. Jarfile này thực hiện giao thức Tibco JMS và vì vậy nó bị thiếu, máy khách JMS không thể truy xuất nhà máy kết nối JMS từ nhà cung cấp dịch vụ LDAP JNDI.

+0

Tôi gặp lỗi tương tự khi imq-1.0.jar của Sun không có trong classpath. – Pino

+0

Cảm ơn câu trả lời đó - bạn sẽ tiết kiệm được nhiều thời gian cho tôi! – Torsten

Các vấn đề liên quan