Pourquoi ClassCastException sur JMS ConnectionFactory de recherche dans JNDI?
Ce qui pourrait être la cause de l'suivantes ClassCastException
dans un standalone client JMS application lorsqu'il tente de récupérer une usine de raccordement à partir de la JNDI fournisseur?
Exception in thread "main" java.lang.ClassCastException: javax.naming.Reference cannot be cast to javax.jms.ConnectionFactory
Ici est une version abrégée de la JMS client qui ne comprend que son start()
et stop()
méthodes. L'exception se produit sur la première ligne de la méthode start()
qui tente de récupérer l'usine de raccordement à partir de la JNDI fournisseur, un serveur LDAP distant. La fabrique de connexions JMS et objets de destination sont sur une distance de serveur 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);
}
}
Mais je préfère ne pas divulguer le contenu spécifique de context.properties
, il contient les entrées:
java.naming.factory.initial=...
java.naming.provider.url=...
java.naming.security.principal=...
java.naming.security.credentials=...
Cela dépend entièrement de ce qui JavaEE serveur que vous utilisez. Aussi, quelle est la valeur que vous utilisez pour
connectionFactoryName
?C'est un standalone client Java qui utilise Geronimo client JMS bibliothèque
geronimo-jms-1.1-spec.jar
et personnalisé supplémentaire JMS bibliothèque et un JNDI liés à la bibliothèque.contextFactoryName
suit une syntaxe personnalisés qui correspond à une entrée dans un serveur LDAP.Merci pour la référence. Ce problème ne semble pas être un général de la recherche JNDI problème et n'est pas JMS spécifiques.
OriginalL'auteur Derek Mahar | 2010-05-12
Vous devez vous connecter pour publier un commentaire.
S'avère que le problème était dû à un Tibco JMS jarfiles,
tibjms.jar
, d'être absent de la JVM classpath. Cette jarfiles met en œuvre la Tibco JMS protocole et donc parce que c'était manquant, le client JMS n'a pas pu récupérer la fabrique de connexions JMS à partir du LDAP JNDI fournisseur de services.Merci pour cette réponse vous permettra d'économiser beaucoup de temps pour moi!
OriginalL'auteur Derek Mahar