2013-07-24 37 views
8

Tôi đã viết một chương trình Java để kết nối với Websphere MQ để xuất bản các tin nhắn. Tôi đã tạo không gian tên JNDI, nhà máy kết nối, đích đến và trình quản lý hàng đợi trong Websphere MQ Explore. Khi tôi đang chạy chương trình của tôi, nó đang hiển thị ClassCastException để nhập loại từ string đến ConnectionFactory.ClassCastException: javax.naming.Reference không thể chuyển sang javax.jms.ConnectionFactory

Đây là mã của tôi. Bất cứ ai có thể giúp giải quyết vấn đề này.

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

     }  
    }   
} 

Bắt lỗi trên những dòng này:

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

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

Trả lời

1

Những gì bạn nhận được trở lại từ bối cảnh jndi là một tài liệu tham khảo. Đây là một công thức để xây dựng nhà máy kết nối và tôi nghi ngờ rằng lớp học chịu trách nhiệm về điều này không thể được tìm thấy bởi vì các lọ MQ được yêu cầu không có trong classpath. Thông báo lỗi không trực quan.

Nếu không, tôi thấy cách tốt để gỡ lỗi các vấn đề tra cứu jndi là lấy ngữ cảnh và thực thi một danh sách() trên đó, in ra các chi tiết của từng đối tượng được trả về. trong thư mục.

0

Thêm lọ Dưới đây đến classpath:

sibc.jms 
sibc.jndi 
2

Bạn đang thiếu một số lọ của MQ Khách hàng để làm việc này. tôi đã có lỗi tương tự, và sau khi một số nghiên cứu thêm, tôi đã kết thúc với danh sách này Chum để làm việc này:

  • com.ibm.mq.jmqi.jar
  • com .ibm.mqjms.jar
  • dhbcore.jar
  • fscontext.jar
  • providerutil.jar
  • com.ibm.mq.headers.jar
Các vấn đề liên quan