为什么JMS上的ClassCastException会在JNDI中查找ConnectionFactory?

Der*_*har 5 java client jms exception

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

Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory
Run Code Online (Sandbox Code Playgroud)

这是JMS客户端的缩写版本,仅包含其start()stop()方法.在方法的第一行上发生异常,该方法start()尝试从JNDI提供程序(远程LDAP服务器)检索连接工厂.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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

java.naming.factory.initial=...
java.naming.provider.url=...
java.naming.security.principal=...
java.naming.security.credentials=...
Run Code Online (Sandbox Code Playgroud)

Der*_*har 9

事实证明,问题是由于tibjms.jar缺少JVM类路径的Tibco JMS jar文件引起的.此jarfile实现了Tibco JMS协议,因为它缺少,JMS客户端无法从LDAP JNDI服务提供程序检索JMS连接工厂.