2010-05-12 11 views
5

¿Cuál podría ser la causa del siguiente ClassCastException en una aplicación de cliente JMS independiente cuando intenta recuperar una fábrica de conexiones del proveedor JNDI?¿Por qué ClassCastException en JMS ConnectionFactory búsqueda en JNDI?

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

Aquí es una versión abreviada del cliente JMS que incluye sólo sus métodos start() y stop(). La excepción se produce en la primera línea del método start() que intenta recuperar la fábrica de conexiones del proveedor JNDI, un servidor LDAP remoto. La fábrica de conexiones JMS y los objetos de destino se encuentran en un servidor 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); 
    } 
} 

Aunque prefiero no revelar el contenido específico de context.properties, que contiene las siguientes entradas generales:

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 vea si esto puede ayudar – Bozho

+0

Esto depende completamente del servidor JavaEE que esté utilizando. Además, ¿qué valor está utilizando para 'connectionFactoryName'? – skaffman

+0

Este es un cliente de Java independiente que utiliza la librería cliente de Geronimo JMS 'geronimo-jms-1.1-spec.jar' y una biblioteca JMS suplementaria personalizada y una biblioteca relacionada con JNDI. –

Respuesta

9

resulta que el problema se debía a un jarfile Tibco JMS, tibjms.jar, estando ausente desde el classpath JVM. Este archivo jar implementa el protocolo Tibco JMS y, debido a que faltaba, el cliente JMS no pudo recuperar la fábrica de conexiones JMS del proveedor de servicios LDN JNDI.

+0

Obtuve el mismo error cuando Sun's imq-1.0.jar no estaba en el classpath. – Pino

+0

Gracias por esa respuesta, ¡me ahorrarás mucho tiempo! – Torsten

Cuestiones relacionadas