java - 为什么在 JNDI 中的 JMS ConnectionFactory 查找上出现 ClassCastException?

标签 java exception client jms

独立 JMS 客户端应用程序在尝试从 JNDI 提供程序检索连接工厂时出现以下 ClassCastException 的原因可能是什么?

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

这是 JMS 客户端的简化版本,仅包含其 start()stop() 方法。异常发生在方法 start() 的第一行,该方法试图从远程 LDAP 服务器 JNDI 提供程序检索连接工厂。 JMS 连接工厂和目标对象位于远程 JMS 服务器上。

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

虽然我不想透露 context.properties 的具体内容,但它包含以下一般条目:

java.naming.factory.initial=...
java.naming.provider.url=...
java.naming.security.principal=...
java.naming.security.credentials=...

最佳答案

原来问题是由于 JVM 类路径中缺少 Tibco JMS jar 文件 tibjms.jar。此 jarfile 实现了 Tibco JMS 协议(protocol),因此由于缺少它,JMS 客户端无法从 LDAP JNDI 服务提供商检索 JMS 连接工厂。

关于java - 为什么在 JNDI 中的 JMS ConnectionFactory 查找上出现 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819612/

相关文章:

magento - 如何在 Magento 数据库中启用 exception.log 和 system.log?

go - 如何使用两个客户端。使用golang

javascript - 如何在考虑服务器负载的同时制作多人 javascript 游戏作弊证明

JavaFX用lambda实现call方法的回调

JavaFX 窗口大小调整

java - 从XMLGregorianCalendar转换为Calendar时的日期更改

client - Jena 桌面 SPARQL 客户端 (TDB)?

java - 完成后重启迭代器

C# System.InvalidCastException

java - 抛出异常后不会正确捕获 block