【发布时间】:2011-02-18 15:53:49
【问题描述】:
当独立 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=...
【问题讨论】:
-
这完全取决于您使用的 JavaEE 服务器。另外,
connectionFactoryName使用什么值? -
这是一个独立的 Java 客户端,它使用 Geronimo JMS 客户端库
geronimo-jms-1.1-spec.jar和一个自定义的补充 JMS 库和一个 JNDI 相关库。 -
contextFactoryName遵循映射到 LDAP 服务器中的条目的自定义语法。 -
@Bozho:谢谢你的参考。这个问题似乎是一般的 JNDI 查找问题,不是 JMS 特有的。