Почему ClassCastException при поиске JMS ConnectionFactory в JNDI? - PullRequest
5 голосов
/ 12 мая 2010

В чем может быть причина следующих 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=...

1 Ответ

9 голосов
/ 14 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...