【问题标题】:Why ClassCastException on JMS ConnectionFactory lookup in JNDI?为什么在 JNDI 中查找 JMS ConnectionFactory 时出现 ClassCastException?
【发布时间】:2011-02-18 15:53:49
【问题描述】:

当独立 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=...

【问题讨论】:

  • 这完全取决于您使用的 JavaEE 服务器。另外,connectionFactoryName 使用什么值?
  • 这是一个独立的 Java 客户端,它使用 Geronimo JMS 客户端库 geronimo-jms-1.1-spec.jar 和一个自定义的补充 JMS 库和一个 JNDI 相关库。
  • contextFactoryName 遵循映射到 LDAP 服务器中的条目的自定义语法。
  • @Bozho:谢谢你的参考。这个问题似乎是一般的 JNDI 查找问题,不是 JMS 特有的。

标签: java exception client jms


【解决方案1】:

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

【讨论】:

  • 当 Sun 的 imq-1.0.jar 不在类路径中时,我得到了同样的错误。
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2023-03-30
  • 2010-09-07
相关资源
最近更新 更多