2013-07-24 14 views
8

Napisałem program w języku Java, aby połączyć się z Websphere MQ w celu opublikowania wiadomości. Utworzono przestrzeń nazw JNDI, fabrykę połączeń, miejsca docelowe i menedżera kolejek w przeglądarce Websphere MQ Explore. Kiedy uruchamiam program, wyświetlany jest kod ClassCastException dla odlewania od string do ConnectionFactory.ClassCastException: javax.naming.Reference nie może być rzutowany na javax.jms.ConnectionFactory

Oto mój kod. Czy ktoś może pomóc rozwiązać ten problem.

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

     }  
    }   
} 

Uzyskiwanie błąd na tych liniach:

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

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

Odpowiedz

1

Co otrzymaniu z powrotem z kontekstu JNDI było odniesienie. To jest przepis na zbudowanie fabryki połączeń i podejrzewam, że nie można znaleźć klasy odpowiedzialnej za to, ponieważ wymagane słoiki MQ nie znajdują się w ścieżce klas. Komunikat o błędzie nie jest intuicyjny.

W przeciwnym razie, dobrym sposobem na debugowanie problemów z wyszukiwaniem jndi jest uzyskanie kontekstu i wykonanie listy() na niej, wydrukowanie szczegółów każdego zwracanego obiektu, tak abyś dokładnie wiedział, co dokładnie znajduje się w katalogu.

0

Dodaj poniższej słoiki do classpath:

sibc.jms 
sibc.jndi 
2

Brakuje niektórych JAR z MQ Client uzyskać tej pracy. Miałem ten sam błąd, a po pewnym dalszych badań, skończyło się na tej liście słoików w celu uzyskania tej pracy:

  • com.ibm.mq.jmqi.jar
  • com .ibm.mqjms.jar
  • dhbcore.jar
  • fscontext.jar
  • providerutil.jar
  • com.ibm.mq.headers.jar
Powiązane problemy