ClassCastException:无法将javax.naming.Reference强制转换为javax.jms.ConnectionFactory [英] ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory

查看:526
本文介绍了ClassCastException:无法将javax.naming.Reference强制转换为javax.jms.ConnectionFactory的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我编写了一个Java程序来连接到Websphere MQ以发布消息.我在Websphere MQ Explore中创建了JNDI命名空间,连接工厂,目标和队列管理器.当我运行程序时,它显示ClassCastException用于从stringConnectionFactory的类型转换.

I wrote a Java program to connect to Websphere MQ to publish messages. I created a JNDI namespace, connection factory, destinations, and queue manager in Websphere MQ Explore. When I am running my program it is showing ClassCastException for type casting from string to ConnectionFactory.

这是我的代码.任何人都可以帮助解决此问题.

Here is my code. Can anyone help resolve this problem.

JNDIUtil.java

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

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

        }    
    }           
}

在这些行上获取错误:

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

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

推荐答案

您缺少 MQ Client 的某些 JAR ,因此无法正常工作. 我遇到了同样的错误,经过进一步调查后,我最终得到了这个Jars列表,以使其正常工作:

You are missing some JARs of MQ Client to get this working. I had the same error, and after some further investigation, I ended up with this list of Jars in order to get this working:

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

这篇关于ClassCastException:无法将javax.naming.Reference强制转换为javax.jms.ConnectionFactory的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆