Jboss JMS

Jboss JMS - Java - Programmation

Marsh Posté le 02-04-2009 à 12:04:03    

Bonjour, je dois utiliser jms avec comme serveur JBOSS. quelqu'un aurait-il quelque exemples ou documentations ?

Reply

Marsh Posté le 02-04-2009 à 12:04:03   

Reply

Marsh Posté le 02-04-2009 à 12:36:53    

Commence  par préciser la version de JBoss, parce que l'implémentation JMS a changé entre la version 4 et la 5.

Reply

Marsh Posté le 02-04-2009 à 13:33:29    

merci de ta réponse,je travail avec la version de 5.0.0 de Jboss

Reply

Marsh Posté le 02-04-2009 à 14:07:06    

JBoss Messaging (l'implémentation JMS de JBoss 5) est encore relativement récent, et si tu cherches sur le web, tu risques surtout de trouver de la doc pour JBossMQ (JBoss 4), qui ne te sera donc d'aucune utilité.
 
La configuration se trouve dans deploy/messaging. Pour une utilisation basique, il suffit d'ajouter une destination (queue ou topic) dans destinations-service.xml, ce qui va créer la destination et la placer dans JNDI. Ensuite, pour l'utiliser, ben c'est du JMS tout ce qu'il y a de plus standard, il n'y a plus rien de spécifique à JBoss.
 
Liens utiles :


Avec ça, tu devrais déjà avoir de quoi bien débuter.

Reply

Marsh Posté le 02-04-2009 à 15:53:36    

Merci de ta réponse fortement utile.J'ai suivi tes conseils et j'ai encore un souci, quand je lance mon programme j'ai l'erreur suivante :
 
Queue name is myqueue
JNDI API lookup failed: javax.naming.NameNotFoundException: QueueConnectionFactory not bound
 
J'ai modifier le fichier XML en rajoutant :
 
   <mbean code="org.jboss.jms.server.destination.QueueService"
      name="jboss.messaging.destination:service=QueueConnectionFactory,name=myqueue"
      xmbean-dd="xmdesc/Queue-xmbean.xml">
      <depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer</depends>
      <depends>jboss.messaging:service=PostOffice</depends>
   </mbean>  
   
Aurais-tu une idée?

Reply

Marsh Posté le 02-04-2009 à 15:59:34    

Tu peux poster le code que tu utilises pour accèder à ta queue et la stack trace de ton erreur stp ?

Reply

Marsh Posté le 02-04-2009 à 16:05:26    

Voila le code de ma class si c'est cela que tu veux :
 
 
public class SimpleQueueSender {
 /**
  * Main method.
  *
  * @param args the queue used by the example and,
  * optionally, the number of messages to send
  */
 public static void main(String[] args) {
  String queueName = null;
  Context jndiContext = null;
  QueueConnectionFactory queueConnectionFactory = null;
  QueueConnection queueConnection = null;
  QueueSession queueSession = null;
  Queue queue = null;
  QueueSender queueSender = null;
  TextMessage message = null;
  final int NUM_MSGS;
 
  if ( (args.length < 1) || (args.length > 2) ) {
   System.out.println("Usage: java SimpleQueueSender " +
   "<queue-name> [<number-of-messages>]" );
   System.exit(1);
  }
  queueName = new String(args[0]);
  System.out.println("Queue name is " + queueName);
  if (args.length == 2){
   NUM_MSGS = (new Integer(args[1])).intValue();
  } else {
   NUM_MSGS = 1;
  }
  /*
   * Create a JNDI API InitialContext object if none exists
   * yet.
   */
  try  
  {
   jndiContext = new InitialContext();
  } catch (NamingException e)  
  {
   System.out.println("Could not create JNDI API " +"context: " + e.toString());
   System.exit(1);
  }
  /*
   * Look up connection factory and queue. If either does
   * not exist, exit.
   */
  try  
  {
   queueConnectionFactory  = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory" );
   queue      = (Queue) jndiContext.lookup(queueName);
   
  } catch (NamingException e)  
  {
   System.out.println("JNDI API lookup failed: " +e.toString());
   System.exit(1);
  }
  /*
   * Create connection.
   * Create session from connection; false means session is
   * not transacted.
   * Create sender and text message.
   * Send messages, varying text slightly.
   * Send end-of-messages message.
   * Finally, close connection.
   */
  System.out.println("Test 1" );
  try {
   queueConnection = queueConnectionFactory.createQueueConnection();
   queueSession  = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
   
   queueSender = queueSession.createSender(queue);
   message  = queueSession.createTextMessage();
   
   for (int i = 0; i < NUM_MSGS; i++)  
   {
    message.setText("This is message " + (i + 1));
    System.out.println("Sending message: " + message.getText());
    queueSender.send(message);
   }
   /*
    * Send a non-text control message indicating end of
    * messages.
    */
   queueSender.send(queueSession.createMessage());
  } catch (JMSException e) {
   System.out.println("Exception occurred: " +
     e.toString());
  } finally {
   if (queueConnection != null) {
    try {
     queueConnection.close();
    } catch (JMSException e) {}
 
     
   }
  }
 }
}

Reply

Marsh Posté le 02-04-2009 à 16:31:26    

Code :
  1. queueConnectionFactory  = (QueueConnectionFactory)jndiContext.lookup("QueueConnectionFactory" );


 
Je pense que le problème vient de là, par défaut, la QueueConnectionFactory de JBoss se trouve sous le nom "ConnectionFactory".

Reply

Marsh Posté le 02-04-2009 à 16:57:30    

l'erreur que tu m'as indiquée est bonne mais maintenant j'en ai une nouvelle :  
 
Queue name is myqueue
Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/remoting/CannotConnectException
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Unknown Source)
 at java.lang.Class.getDeclaredField(Unknown Source)
 at java.io.ObjectStreamClass.getDeclaredSUID(Unknown Source)
 at java.io.ObjectStreamClass.access$700(Unknown Source)
 at java.io.ObjectStreamClass$2.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.io.ObjectStreamClass.<init>(Unknown Source)
 at java.io.ObjectStreamClass.lookup(Unknown Source)
 at java.io.ObjectStreamClass.initNonProxy(Unknown Source)
 at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
 at java.io.ObjectInputStream.readClassDesc(Unknown Source)
 at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
 at java.io.ObjectInputStream.readClassDesc(Unknown Source)
 at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
 at java.io.ObjectInputStream.readObject0(Unknown Source)
 at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
 at java.io.ObjectInputStream.readSerialData(Unknown Source)
 at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
 at java.io.ObjectInputStream.readObject0(Unknown Source)
 at java.io.ObjectInputStream.readObject(Unknown Source)
 at java.rmi.MarshalledObject.get(Unknown Source)
 at org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:30)
 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:514)
 at org.jnp.interfaces.NamingContext.lookup(NamingContext.java:471)
 at javax.naming.InitialContext.lookup(Unknown Source)
 at incka.jms.client.SimpleQueueSender.main(SimpleQueueSender.java:71)
Caused by: java.lang.ClassNotFoundException: org.jboss.remoting.CannotConnectException
 at java.net.URLClassLoader$1.run(Unknown Source)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClass(Unknown Source)
 at java.lang.ClassLoader.loadClassInternal(Unknown Source)
 ... 27 more
 
correspondant à la ligne :    queueConnectionFactory  = (QueueConnectionFactory)jndiContext.lookup("ConnectionFactory" );
 
si tu as un exmple qui fonctionne je suis prenneur.

Reply

Marsh Posté le 02-04-2009 à 17:09:43    

Ça doit être un problème de classpath.  
 
Ton programme, il tourne en dehors de JBoss ? Si oui, je pense qu'il doit juste te manquer un jar dans le classpatch.
 
Sinon, non, je n'ai pas d'exemple tout fait à te donner.

Reply

Marsh Posté le 02-04-2009 à 17:09:43   

Reply

Marsh Posté le 02-04-2009 à 17:24:33    

Je le fais tourner au travers d'eclipse pour l'instant, je suis d'accord avec toi sur le faite qu'il manque jar : java.lang.NoClassDefFoundError: org/jboss/remoting/CannotConnectException  
LE soucit étant que le jar manquant est relatif à une exception qui est levée.
 
En tous cas merci de ton aide.

Reply

Marsh Posté le 02-04-2009 à 17:29:05    

Apres rajout du jar manquant : l'erreur exacte est la suivante :
 
Exception in thread "main" org.jboss.jms.exception.MessagingNetworkFailureException
 at org.jboss.jms.client.delegate.DelegateSupport.handleThrowable(DelegateSupport.java:245)
 at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.org$jboss$jms$client$delegate$ClientConnectionFactoryDelegate$createConnectionDelegate$aop(ClientConnectionFactoryDelegate.java:187)
 at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate$createConnectionDelegate_N3019492359065420858.invokeNext(ClientConnectionFactoryDelegate$createConnectionDelegate_N3019492359065420858.java)
 at org.jboss.jms.client.container.StateCreationAspect.handleCreateConnectionDelegate(StateCreationAspect.java:83)
 at org.jboss.aop.advice.org.jboss.jms.client.container.StateCreationAspect_z_handleCreateConnectionDelegate_18581223.invoke(StateCreationAspect_z_handleCreateConnectionDelegate_18581223.java)
 at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate$createConnectionDelegate_N3019492359065420858.invokeNext(ClientConnectionFactoryDelegate$createConnectionDelegate_N3019492359065420858.java)
 at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.createConnectionDelegate(ClientConnectionFactoryDelegate.java)
 at org.jboss.jms.client.JBossConnectionFactory.createConnectionInternal(JBossConnectionFactory.java:205)
 at org.jboss.jms.client.JBossConnectionFactory.createQueueConnection(JBossConnectionFactory.java:101)
 at org.jboss.jms.client.JBossConnectionFactory.createQueueConnection(JBossConnectionFactory.java:95)
 at org.jboss.book.jms.ex1.SendRecvClient.setupPTP(SendRecvClient.java:58)
 at org.jboss.book.jms.ex1.SendRecvClient.sendRecvAsync(SendRecvClient.java:71)
 at org.jboss.book.jms.ex1.SendRecvClient.main(SendRecvClient.java:102)
Caused by: org.jboss.remoting.ConnectionFailedException: Timed out trying to create control socket
 at org.jboss.remoting.transport.bisocket.BisocketClientInvoker.handleConnect(BisocketClientInvoker.java:273)
 at org.jboss.remoting.MicroRemoteClientInvoker.connect(MicroRemoteClientInvoker.java:294)
 at org.jboss.remoting.Client.connect(Client.java:1596)
 at org.jboss.remoting.Client.connect(Client.java:498)
 at org.jboss.remoting.callback.ServerInvokerCallbackHandler.connect(ServerInvokerCallbackHandler.java:166)
 at org.jboss.remoting.ServerInvoker.getCallbackHandler(ServerInvoker.java:2047)
 at org.jboss.remoting.ServerInvoker.handleInternalInvocation(ServerInvoker.java:1663)
 at org.jboss.remoting.transport.bisocket.BisocketServerInvoker.handleInternalInvocation(BisocketServerInvoker.java:863)
 at org.jboss.remoting.ServerInvoker.invoke(ServerInvoker.java:895)
 at org.jboss.remoting.transport.socket.ServerThread.completeInvocation(ServerThread.java:742)
 at org.jboss.remoting.transport.socket.ServerThread.processInvocation(ServerThread.java:695)
 at org.jboss.remoting.transport.socket.ServerThread.dorun(ServerThread.java:549)
 at org.jboss.remoting.transport.socket.ServerThread.run(ServerThread.java:230)
 at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:163)
 at org.jboss.remoting.Client.invoke(Client.java:1544)
 at org.jboss.remoting.Client.addCallbackListener(Client.java:1613)
 at org.jboss.remoting.Client.addListener(Client.java:907)
 at org.jboss.jms.client.remoting.JMSRemotingConnection.addInvokerCallbackHandler(JMSRemotingConnection.java:230)
 at org.jboss.jms.client.remoting.JMSRemotingConnection.start(JMSRemotingConnection.java:340)
 at org.jboss.jms.client.delegate.ClientConnectionFactoryDelegate.org$jboss$jms$client$delegate$ClientConnectionFactoryDelegate$createConnectionDelegate$aop(ClientConnectionFactoryDelegate.java:154)
 ... 11 more

Reply

Marsh Posté le 02-04-2009 à 17:52:39    

J'ai une petite question,quand on fait :
 queue      = (Queue) jndiContext.lookup(queueName);  
 
queueName doit être déclarer ou dans les fichiers XML ?

Reply

Marsh Posté le 02-04-2009 à 17:57:46    

b16d a écrit :

J'ai une petite question,quand on fait :
 queue      = (Queue) jndiContext.lookup(queueName);  
 
queueName doit être déclarer ou dans les fichiers XML ?


 
Ici : <mbean code="org.jboss.jms.server.destination.QueueService"
      name="jboss.messaging.destination:service=QueueConnectionFactory,name=myqueue"
 
L'objet sera mis dans un sous-contexte "queue", donc tu y accèderas par le nom "queue/myqueue"

Reply

Marsh Posté le 03-04-2009 à 11:16:51    

vraimment merci je comprend beaucoup mieux le principe. je plante par contre un peu plus loin :
 
   queueConnection = queueConnectionFactory.createQueueConnection();
 
Mon client qui reçoit le message doit il être lancé à ce moment là ?

Reply

Marsh Posté le 03-04-2009 à 11:31:04    

JMS est un protocole asynchrone, les messages n'ont pas besoin d'être lus au moment où ils sont envoyés. S'il n'y a personne pour lire les messages, ils resteront stockés dans la queue jusqu'à ce que quelqu'un vienne les chercher. Ça fonctionne un peu sur le même principe que l'email, le service JMS de JBoss servant de boite aux lettres.
 
Donc pour répondre à ta question : ton application client, tu la lances quand tu veux :)

Reply

Marsh Posté le 03-04-2009 à 11:35:27    

Ok c'est bien ce que j'avais compris,  aurais-tu une idée pourquoi lors de la création de ma queue :
   queueConnection = queueConnectionFactory.createQueueConnection();  
 
L'exception suivante est levée:
Exception occurred: org.jboss.jms.exception.MessagingNetworkFailureException
 
Sur le server j'ai le message suivant qui apparait :
11:22:49,234 ERROR [BisocketServerInvoker] received new control socket for unrecognized listenerId: 4p7222-aufgj0-ft2o3rwl-1-ft2o3shu-9
 

Reply

Marsh Posté le 03-04-2009 à 11:38:14    

J'ai jamais utilisé JMS en dehors de JBoss, mais d'après le message d'erreur, je pense qu'il s'attend à une forme d'authentification pour les connexions qui viennent de l'extérieur. Mais là, on sort complètement de mon domaine de compétence...

Reply

Marsh Posté le 03-04-2009 à 11:44:34    

En prennant l'example fournit avec Jboss Messaging j'ai aussi une exception .... Exception in thread "main" org.jboss.jms.exception.MessagingNetworkFailureException

Reply

Marsh Posté le 03-04-2009 à 12:38:49    

j'aurais un petite question a te poser? comment installes-tu jboss messaging j'ai l'impression que l'installation ce passe passe mal.

Reply

Marsh Posté le 06-04-2009 à 16:18:07    

Problème résolut, encore merci de ton aide Riokmij. Il restait comme problème une mauvaise version de jboss-remoting.jar

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed