2010-05-12 9 views
5

Quale potrebbe essere la causa del seguente ClassCastException in un'applicazione client JMS autonoma quando tenta di recuperare un factory di connessione dal provider JNDI?Perché ClassCastException su JMS ConnectionFactory cerca in JNDI?

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

Ecco una versione abbreviata del client JMS che include solo i start() e stop() metodi. L'eccezione si verifica sulla prima riga nel metodo start() che tenta di recuperare il factory di connessione dal provider JNDI, un server LDAP remoto. La factory di connessione JMS e gli oggetti di destinazione si trovano su un server JMS remoto.

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

Anche se io preferisco non rivelare i contenuti specifici del context.properties, contiene le seguenti voci generali:

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 vedere se questo può essere d'aiuto – Bozho

+0

Questo dipende interamente dal server JavaEE che si sta utilizzando. Inoltre, quale valore stai usando per 'connectionFactoryName'? – skaffman

+0

Questo è un client Java standalone che utilizza la libreria client Geronimo JMS 'geronimo-jms-1.1-spec.jar' e una libreria JMS supplementare personalizzata e una libreria correlata JNDI. –

risposta

9

scopre che il problema era dovuto ad una jarfile Tibco JMS, tibjms.jar, essendo assente dal classpath JVM. Questo jarfile implementa il protocollo Tibco JMS e quindi, poiché mancava, il client JMS non poteva recuperare la factory di connessione JMS dal provider di servizi JNDI LDAP.

+0

Ho ricevuto lo stesso errore quando il file imq-1.0.jar di Sun non si trovava nel classpath. – Pino

+0

Grazie per questa risposta, mi farai risparmiare molto tempo! – Torsten

Problemi correlati