7
votes

Pourquoi ma recherche JNDI est-elle une question de renvoi de la QueueConnectionnelle?

J'essaie de rechercher un QueueConnectionFactory et File d'attente via JNDI de Geronimo. La file d'attente est retournée bien, mais la recherche queueConnectionfactory retourne toujours null. Il ne jette pas un namingexception , ce qui est ce que je m'attendais si le nom JNDI était incorrect.

Quelqu'un peut-il voir ce que je fais mal? Le code de test ci-dessous Sorties: xxx xxx

au cas où il fait une différence: j'ai ajouté Openejb-Client-3.0.1.jar, geronimo-ejb_3.0_spec-1.0.1.jar et activemq-core-4.1.2-g20090207.jar à mon chemin de classe et mon fichier jndi.properties a les propriétés: xxx


0 commentaires

4 Réponses :


0
votes

Il y a deux participants ici, vous cherchez à JNDI pour quelque chose. Quelqu'un a dû le mettre là-bas. Je ne connais pas les détails de votre environnement, mais mon approche de tels problèmes est

  • explorez l'espace de noms - ce qui est là? Avez-vous des outils de pincement JNDI?
  • look carfeully dans les journaux du service censé être enregistré avec JNDI, signalez-vous des erreurs?

2 commentaires

Geronimo fournit un outil de navigation JNDI et les deux noms JNDI semblent être là. Changer les noms de mon outil de test produisent une nommante exception, il doit donc trouver quelque chose .


Droite, mais qu'est-ce qu'il trouve et qui la mett-il là-bas? Pour moi, tous ces points sur le problème étant dans le fournisseur JMS plutôt que votre code.



14
votes

La raison pour laquelle il ne lance pas une exception est que - il existe une classe classloadexception qui vient lorsque la ressource est accessible.

Et la raison pour laquelle cela se passe parce que la classe: com.sun.jndi.url.jca .jCaulContextFactory est recherché par le chargeur de classe appelé à partir de ResourceManager. P>

Si vous modifiez le nom d'usine à un autre nom, vous verrez la nommageException - mais dans le cas de la recherche, des exceptions telles que ClassNotFound / Illegalstate - Aucune exception n'est soulevée. P>

Les dépendances d'ActiveMQ doivent donc être analysées. Mise à jour1: L'une des raisons possibles est que l'objet d'usine ne peut être instancié que dans un environnement géré. Exécutez votre code en tant que client d'application?. P>

update2: quelques autres pointeurs trouvés pour la cause de ce comportement: i> p>

la mise en œuvre de l'openejb JNDI uniquement expose les EJB, pas d'autres ressources. Si vous avez un client d'application J2EE, et Vous souhaitez utiliser JMS, vous devez Déployez une copie de l'adaptateur ActiveMQ sur le client. Vous pouvez ensuite utiliser le J2EE Java: Comptoir Comp / env vos trucs. p> blockQuote>

a trouvé cela sur Site ActivEMQ: P>

La mise en œuvre JNDI de ActiveMQ ne parle pas au serveur de nommage. C'est une version dépouillée d'un client JNDI qui permet simplement d'obtenir des sujets et Files d'attente directement à partir d'une instance JMS. Ainsi, au lieu de fournir l'adresse du serveur de nommage, vous devez fournir à l'adresse JMS Server. La plupart des implémentations JNDI utilisent la propriété Java.Naming.Provider.url pour spécifier l'adresse du serveur de nommage. ActiveMQ utilise le Brokerurl B> un. Utilisation du Java.Naming.Provider.url One donnera à la place à l'activemq en essayant de charger tout le courtier. P> blockQuote>

Voir plus sur comment Connectez-vous à l'aide de JNDI : p>

L'usine de contexte initiale utilisée dans l'explication est la suivante: org.apache.activemq.jndi.activemqInitialContextFactory p>

Quelque exemple de code à tester avec JNDI peut être trouvé ici P>

J'ai écrit un simple client Java - Remarque ci-dessous L'URL du fournisseur est le courtier utilisé. P>

    Properties props = new Properties();            
props.put(Context.INITIAL_CONTEXT_FACTORY,
             "org.apache.activemq.jndi.ActiveMQInitialContextFactory");
    //props.put(Context.PROVIDER_URL,"vm://localhost");//Either this or below
    props.put(Context.PROVIDER_URL,"tcp://localhost:65432"); 
    props.put("queue.SendReceiveQueue",
         "org.apache.geronimo.configs/activemq-ra/JCAAdminObject/SendReceiveQueue");
      
    InitialContext context = new InitialContext(props);   
    QueueConnectionFactory connectionFactory = (QueueConnectionFactory)context.lookup
                                                               ("ConnectionFactory");
    Queue q = (Queue) context.lookup("SendReceiveQueue");
    System.out.println("conn is : "  + connectionFactory.getClass().getName());
    System.out.println("queue is : " + q.getQueueName());


1 commentaires

Wow. Merci pour la réponse réfléchie et approfondie.



1
votes

J'ai une configuration quelque peu équivalente Tomcat / geronimo J2EE JAR / GERONIMO JMS JAR / ActiveMQ 4 Et je suis un peu confus sur votre fichier Jndi.Properttie. Le mien ressemble à ceci:

java.naming.factory.initial = org.apache.activemq.jndi.activemqinitialContextFactory

java.naming.provider.url = TCP: // localhost: 61616

ConnectFactoryNames = ConnectifFactory, TopicConnectionFactory

La grande différence est manifestement que votre contexte initial est éloigné. À côté de cela, je dois fournir un nom de ConnectionFactory Naming


0 commentaires

1
votes

Je ne sais pas pourquoi, mais pour moi, utiliser un contexte n'a pas fonctionné. Il semble que le message soit envoyé, mais l'Onmessage de mon consommateur n'est pas appelé.

Utiliser un contexte Ne lancez pas d'exception mais ne fonctionne pas: P>

import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.TopicConnection;
import javax.jms.TopicConnectionFactory;
import javax.jms.TopicSession;

public class HelloClient {

    public static void main(String[] args) throws Exception {

        TopicConnectionFactory factory = new org.apache.activemq.ActiveMQConnectionFactory("tcp://localhost:61616");
        TopicConnection connection = factory.createTopicConnection();
        TopicSession session = connection.createTopicSession(false, Session.AUTO_ACKNOWLEDGE);
        Topic topic = session.createTopic("MessageDestinationTopic");

        MessageProducer producer = session.createProducer(topic);

        TextMessage msg = session.createTextMessage();
        msg.setText("this is a test message");
        producer.send(msg);
        producer.close();
        session.close();
        System.out.println("Message published. Please check application server's console to see the response from MDB");
        System.exit(0);

    }

}


0 commentaires