2010-05-12 3 views
5

Quelle peut être la cause du ClassCastException suivant dans une application client JMS autonome lorsqu'il tente de récupérer une fabrique de connexions auprès du fournisseur JNDI?Pourquoi ClassCastException sur la recherche JMS ConnectionFactory dans JNDI?

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

Voici une version abrégée du client JMS qui ne comprend que ses méthodes start() et stop(). L'exception se produit sur la première ligne de la méthode start() qui tente de récupérer la fabrique de connexions auprès du fournisseur JNDI, un serveur LDAP distant. La fabrique de connexions JMS et les objets de destination se trouvent sur un serveur JMS distant.

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

Bien que je préfère ne pas divulguer le contenu spécifique de context.properties, il contient les entrées générales suivantes:

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 voir si cela peut aider – Bozho

+0

Cela dépend entièrement du serveur JavaEE que vous utilisez. De plus, quelle valeur utilisez-vous pour 'connectionFactoryName'? – skaffman

+0

Il s'agit d'un client Java autonome qui utilise la bibliothèque client Geronimo JMS 'geronimo-jms-1.1-spec.jar' et une bibliothèque JMS supplémentaire personnalisée et une bibliothèque associée à JNDI. –

Répondre

9

avère que le problème était dû à une jarfile JMS Tibco, tibjms.jar, étant absent à partir du classpath JVM. Ce jarfile implémente le protocole Tibco JMS et, comme il manquait, le client JMS n'a pas pu extraire la fabrique de connexions JMS du fournisseur de services JNDI LDAP.

+0

J'ai eu la même erreur lorsque le fichier imq-1.0.jar de Sun ne se trouvait pas dans le chemin de classe. – Pino

+0

Merci pour cette réponse - vous économiserez beaucoup de temps pour moi! – Torsten

Questions connexes