Почему ClassCastException на поиске JMS ConnectionFactory в JNDI?

Какова могла бы быть причина следующего ClassCastException в автономном клиентском приложении JMS, когда это пытается получить фабрику соединения от поставщика JNDI?

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

Вот сокращенная версия клиента 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);
    }
}

Хотя я предпочитаю не раскрывать определенное содержание context.properties, это содержит следующие общие записи:

java.naming.factory.initial=...
java.naming.provider.url=...
java.naming.security.principal=...
java.naming.security.credentials=...
5
задан Derek Mahar 12 May 2010 в 14:31
поделиться

1 ответ

Оказалось, что проблема была связана с отсутствием в пути классов JVM jarfile Tibco JMS, tibjms.jar. Этот jar-файл реализует протокол Tibco JMS, поэтому из-за его отсутствия JMS-клиент не мог получить фабрику JMS-соединений от поставщика услуг LDAP JNDI.

9
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: