Der*_*har 5 java client jms exception
ClassCastException当独立JMS客户端应用程序尝试从JNDI提供程序检索连接工厂时,可能是以下原因?
Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory
Run Code Online (Sandbox Code Playgroud)
这是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);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我不愿透露具体内容context.properties,但它包含以下一般条目:
java.naming.factory.initial=...
java.naming.provider.url=...
java.naming.security.principal=...
java.naming.security.credentials=...
Run Code Online (Sandbox Code Playgroud)
事实证明,问题是由于tibjms.jar缺少JVM类路径的Tibco JMS jar文件引起的.此jarfile实现了Tibco JMS协议,因为它缺少,JMS客户端无法从LDAP JNDI服务提供程序检索JMS连接工厂.