2013-07-24 22 views
8

Ho scritto un programma Java per connettersi a Websphere MQ per pubblicare messaggi. Ho creato uno spazio dei nomi JNDI, factory di connessione, destinazioni e gestore code in Websphere MQ Explore. Quando eseguo il mio programma, viene visualizzato ClassCastException per il casting di tipo da string a ConnectionFactory.ClassCastException: javax.naming.Riferimento non può essere eseguito su javax.jms.ConnectionFactory

Ecco il mio codice. Qualcuno può aiutare a risolvere questo problema.

JNDIUtil.java

package com.tradefinance.jms.util; 

//JMS classes 
import javax.jms.JMSException; 
import javax.jms.ConnectionFactory; 
import javax.jms.Destination; 

//JNDI classes 
import javax.naming.InitialContext; 
import javax.naming.Context; 
import javax.naming.NamingException; 

//Standard Java classes 
import java.util.Hashtable; 
import java.util.Properties; 

/** 
* 
* A wrapper class for JNDI calls 
* 
*/ 
public class JNDIUtil 
{ 
    private Context context; 

    public JNDIUtil(String icf, String url) throws JMSException, NamingException 
    { 
     Hashtable environment = new Hashtable(); 

     environment.put(Context.INITIAL_CONTEXT_FACTORY, icf); 
     environment.put(Context.PROVIDER_URL, url); 

    context= new InitialContext(environment); 

    } 

    /** 
    * @param ObjName Object Name to be retrieved 
    * @return Retrieved Object 
    * @throws NamingException 
    */ 
    private Object getObjectByName(String ObjName) throws NamingException 
    { 

     return context.lookup(ObjName); 
    } 

    /** 
    * @param factoryName Factory Name 
    * @return ConnectionFactory object 
    * @throws NamingException 
    */ 
    public ConnectionFactory getConnectionFactory(String factoryName) throws NamingException 
    { 
     return (ConnectionFactory) getObjectByName(factoryName); 
    } 

    /** 
    * @param destinationName Destination Name 
    * @return ConnectionFactory object 
    * @throws NamingException 
    */ 
    public Destination getDestination(String destinationName) throws NamingException 
    { 
     return (Destination) getObjectByName(destinationName); 

    } 
} 

NewPublisher.java

package com.tradefinance.jms.topics; 

//JMS classes 
import javax.jms.JMSException; 
import javax.jms.ConnectionFactory; 
import javax.jms.Connection; 
import javax.jms.Session; 
import javax.jms.Destination; 
import javax.jms.MessageProducer; 
import javax.jms.TextMessage; 

//JNDI classes 
import javax.naming.NamingException; 

import com.tradefinance.jms.util.JNDIUtil; 

/** 
* A class to demonstrate how to a publish to a topic. 
*/ 
public class NewsPublisher 
{ 

    public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory"; 
    public static String url = "file:/C:/JNDI-Directory/"; 

    public static void main(String[] vars) throws JMSException, NamingException 
    { 

     ConnectionFactory factory = null; 
     Connection connection = null; 
     Session session = null; 
     Destination destination= null; // a destination can be a topic or a queue 
     MessageProducer producer= null; 


     try 
     { 

      JNDIUtil jndiUtil= new JNDIUtil(icf,url); 

      factory= jndiUtil.getConnectionFactory("TestQM1ConnectionFactory"); 

      connection = factory.createConnection();    
      connection.start(); 

      // Indicate a non-transactional session 
      boolean transacted = false; 
      session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE);   

      destination = jndiUtil.getDestination("NewsTopic"); 

      producer = session.createProducer(destination); 

      TextMessage message = session.createTextMessage("No News is Good News!"); 
      producer.send(message); 

      System.out.println("NewsPublisher: Message Publication Completed"); 

     } 
     finally 
     { 
      // Always release resources 

      if (producer!= null) 
       producer.close(); 

      if (session!= null) 
       session.close(); 

      if (connection!= null) 
       connection.close(); 

     }  
    }   
} 

ottenere l'errore su queste linee:

return (ConnectionFactory) getObjectByName(factoryName); 
in JNDIUtil.java 

factory= jndiUtil.getConnectionFactory("TestQM1ConnectionFactory"); 
in NewPublisher.java 

risposta

1

quello che hai ricevuto indietro dal contesto JNDI è stato un punto di riferimento. Questa è una ricetta per costruire il factory di connessione e sospetto che la classe responsabile di questo non possa essere trovata perché i jar MQ richiesti non sono nel classpath. Il messaggio di errore non è intuitivo.

In caso contrario, trovo un buon modo per eseguire il debug di problemi di ricerca jndi è quello di acquisire il contesto ed eseguire una lista() su di esso, stampando i dettagli di ogni oggetto restituito, solo così sei chiaro su cosa risiede esattamente nella directory.

0

Aggiungi i vasetti seguito alla classpath:

sibc.jms 
sibc.jndi 
2

Vi manca qualche JAR di MQ client per ottenere questo lavoro. Ho avuto lo stesso errore, e dopo un po 'ulteriori indagini, ho finito con questa lista delle Giare, al fine di ottenere questo lavoro:

  • com.ibm.mq.jmqi.jar
  • com .ibm.mqjms.jar
  • dhbcore.jar
  • fscontext.jar
  • providerutil.jar
  • com.ibm.mq.headers.jar
Problemi correlati