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