Какова могла бы быть причина следующего 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=...
Оказалось, что проблема была связана с отсутствием в пути классов JVM jarfile Tibco JMS, tibjms.jar
. Этот jar-файл реализует протокол Tibco JMS, поэтому из-за его отсутствия JMS-клиент не мог получить фабрику JMS-соединений от поставщика услуг LDAP JNDI.