独立 JMS 客户端应用程序在尝试从 JNDI 提供程序检索连接工厂时出现以下 ClassCastException
的原因可能是什么?
Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory
这是 JMS 客户端的简化版本,仅包含其 start()
和 stop()
方法。异常发生在方法 start()
的第一行,该方法试图从远程 LDAP 服务器 JNDI 提供程序检索连接工厂。 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 类路径中缺少 Tibco JMS jar 文件 tibjms.jar
。此 jarfile 实现了 Tibco JMS 协议(protocol),因此由于缺少它,JMS 客户端无法从 LDAP JNDI 服务提供商检索 JMS 连接工厂。
关于java - 为什么在 JNDI 中的 JMS ConnectionFactory 查找上出现 ClassCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2819612/