JMS: Un exemple vraiment simple 0

JMS : Java Messaging Service

L’API JMS est une API de messagerie qui permet à des applications de créer, envoyer, recevoir et lire des messages. C’est un système de communication distribué, faiblement lié (» loosely coupled» ), fiable et asynchrone.

C’est une norme.

C’est un des piliers de J2EE.

Je propose un exemple ultra-simple, permettant de se familiariser avec cette API.
Je ne fait pas appel volontairement à JNDI, ce qui limite la portée de JMS à une seule application: cela suffit parfois (et j’aime cette idée de juste suffisant), et cela permet de se familiariser avec cette API.

Il faut une implémentation de la l’API jms : Sun propose un produit … gratuit: Sun Java System Message Queue 3 2005Q1 Platform Edition.
Après l’avoir télécharger, il faut mettre jms.jar et imq.jar dans le classpath de notre exemple.

Voilà le fichier source SimpleQueueSender.java (A mettre donc dans les répertoires bg/testJms/):

  1.  
  2. package bg.testJms;
  3.  
  4. import javax.jms.QueueConnectionFactory;
  5. import javax.jms.QueueConnection;
  6. import javax.jms.QueueSession;
  7. import javax.jms.QueueSender;
  8. import javax.jms.QueueReceiver;
  9. import javax.jms.Queue;
  10. import javax.jms.Session;
  11. import javax.jms.Message;
  12. import javax.jms.TextMessage;
  13.  
  14. public class SimpleQueueSender {
  15.  
  16.     private static int nbMessagesTest = 5;
  17.  
  18.     public static void main(String[] args) throws Exception {
  19.  
  20.         QueueConnectionFactory myQConnFactory = new com.sun.messaging.QueueConnectionFactory();
  21.         QueueConnection myQConn = myQConnFactory.createQueueConnection();
  22.         QueueSession myQSess = myQConn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  23.         Queue myQueue = new com.sun.messaging.Queue("world");
  24.         QueueSender myQueueSender = myQSess.createSender(myQueue);
  25.         for (int i = 0; i < nbMessagesTest; i++) {
  26.             TextMessage myTextMsg = myQSess.createTextMessage();
  27.             myTextMsg.setText("Hello World " + i);
  28.             System.out.println("Sending Message: " + myTextMsg.getText());
  29.             myQueueSender.send(myTextMsg);
  30.         }
  31.  
  32.         //envoyer un message de fin de session
  33.         myQueueSender.send(myQSess.createMessage());
  34.  
  35.         //
  36.         QueueReceiver myQueueReceiver = myQSess.createReceiver(myQueue);
  37.         myQConn.start();
  38.         Message msg;
  39.         boolean isOn = true;
  40.         int j=0;
  41.         while (isOn) {
  42.             j++;
  43.             msg = myQueueReceiver.receive();
  44.             if (msg instanceof TextMessage) {
  45.                 TextMessage txtMsg = (TextMessage) msg;
  46.                 System.out.println("Read Message: " + txtMsg.getText());
  47.             }else {
  48.                 isOn = false;
  49.             }
  50.         }
  51.         System.out.println("byby");
  52.         myQSess.close();
  53.         myQConn.close();
  54.     }
  55. }

Quelques commentaires:

  1. QueueConnectionFactory, QueueConnection, QueueSession, QueueSender,QueueReceiver, Queue, Session, Message: appartiennent à l’API jms (Dans jms.jar dans notre cas) et sont des Interfaces. C’est la traduction de la norme jsr 914. Ce sont des javax (Lire java eXtension) , et donc des classes de base. (Elles sont dans jeejava.jar). elles ne sont cependant pas (Ou pas encore) cependant dans la JRE de base.
    com.sun.messaging.QueueConnectionFactory est une implémentation de l’API Jms. Elle est livrée dans un autre jar (imq.jar dans notre exemple). Il existe de nombreuses implémentations (Certaines libre, d’autre payantes ….) de l’API jms.
  2. Le principe à retenir est le suivant: Un message est écrit dans une queue, et il est lu une seule fois à un autre rythme par un seul destinataire.
    Par exemple vous voulez réaliser une fonction qui prend du temps (Faire un transfert ftp, envoyer un mail à un serveur smtp, commiter des données dans une base de donnée …) vous un envoyé un message par jms, et la tache est réalisée quand le client destinataire est disponible .
  3. L’inconvénient sur cet exemple, c’est que l’envoyeur et le destinataire doivent s’exécuter dans la même JRE et doivent partager une référence commune.Ouep ! Pas très réparti! Un peu limité!
    Attendez de découvrir JNDI! Un prochain tuto peut être….
  4. Nous avons vu sur notre exemple un communication dit Point To Point. Il existe un autre mode de communication (publish/souscribe) où les consommateurs s’abonne à un sujet (topic) et ou l’émetteur ne connait pas les destinataires. Essayer de le trouver tout seul!

Ce tutoriel vous a aidé?

Ecrire un Web-Service en Java: JAX-WS 1

Ce ne sera pas long!
1- Il faut écrire la classe dont les méthodes seront accessibles par Web-Service

  1.  
  2. package com.bg.test.webService;
  3.  
  4. import javax.jws.WebMethod;
  5. import javax.jws.WebParam;
  6. import javax.jws.WebResult;
  7. import javax.jws.WebService;
  8.  
  9. @WebService
  10. public class ValidationVisaCard {
  11.  
  12.     public ValidationVisaCard() {
  13.     }
  14.  
  15.     @WebMethod
  16.     @WebResult( name="CardStatus")
  17.     public String validate(@WebParam(name="numero") String numero,@WebParam(name="name")  String name,@WebParam(name="date")  String date){
  18.         // Ecrire un traitement ici! Le plus leger possible cependant
  19.         return "ok";
  20.     }
  21.  
  22.     @WebMethod
  23.     @WebResult(name="helloResult")
  24.     public String sayHello(){
  25.         System.out.println("Hello");
  26.         return "Hello";
  27.     }
  28.  
  29. }
  30.  

On remarque les annotations. Leur sens est clair , et ne demande pas plus d’explications .
Ensuite , il faut prevoir une methode pour lancer le ws :
(Et oui, java comporte un serveur http en standard! Mais ou est passé le soap ? On rève!)

  1.  
  2. package com.bg.test.webService;
  3.  
  4. import javax.xml.ws.Endpoint;
  5.  
  6. public class MainWS_Simple {
  7.  
  8.     public static void main(String[] args) {
  9.         String r = "http://localhost:8083/bg/monPremierTest";
  10.         System.out.println("WS wsdl  "+r+"?wsdl");
  11.         Endpoint endpoint = Endpoint.publish(r, new ValidationVisaCard());
  12.     }
  13. }
  14.  

Si vous exécutez , a ce stade , vous allez avoir une exception:
class: com.bg.test.webService.jaxws.ValidateCard could not be found

La compilation est un plus délicate : Il faut générer des classes qui permettront de lancer le Web-Service.

Soit on appelle directement l’outil wsgen qui est fourni dans le jdk; soit on utilise ant pour activer cet outil..

Il faut bien compiler avec les options target et source pour java 1.6

Je suppose également que le directory jdk1.6.xx/bin est dans le path system (Pour trouver l’utilitaire wsgen)
Voilà le fichier ant qui permet de compiler et d’appeler wsgen:

  1.  
  2. <project name="testWS" default="bg-generate-server-artifacts">
  3.  
  4.     <target name="bg-compile" depends="">
  5.        <mkdir dir="classes"/>
  6.        <javac srcdir="src/main/java"
  7.                       destdir="classes"
  8.                     source="1.6"
  9.                     target="1.6"
  10.                       deprecation="on">
  11.        </javac>
  12.     </target>
  13.  
  14.     <target name="bg-generate-server-artifacts" depends="bg-compile">
  15.         <echo message="Generates the server artifacts"/>
  16.         <mkdir dir="classesGenerated"/>
  17.         <mkdir dir="srcGenerated"/>
  18.         <exec executable="wsgen" failonerror="true">
  19.              <arg line=" -cp classes"/>
  20.              <arg line=" -d classesGenerated"/>
  21.              <arg line=" -keep"/>
  22.              <arg line=" -wsdl"/>
  23.              <arg line=" -r srcGenerated"/>
  24.              <arg line=" -s srcGenerated"/>
  25.              <arg line=" com.bg.test.webService.ValidationVisaCard"/>
  26.          </exec>
  27.      </target>  
  28. </project>
  29.  

On peut (Il est même vivement conseillé!) regarder les fichiers générés (Les .java, les wsdl, les shema)
C’est presque fini.
Il y a plus qu’à mettre le directory « classesGenerated»  dans le classpath, et lancer notre application.

Il y a une trace :
WS wsdl http://localhost:8083/bg/monPremierTest?wsdl

Prenez un navigateur, et contemplez votre wsdl!

Il y a d’autres API qui permettent de générer des Web-Services (Voir Axis, et cxf, 2 produits fabuleux d’apache).
Tel que nous l’avons fait, l’emploi de wsgen est un peu lourd peut être?
Qu’en pensez vous ?

Ecrire un client d’un Web-Service en java 0

Je veux écrire un client du Web-Service « globalweather»  (Un service de météo).
http://www.webservicex.net/globalweather.asmx?wsdl
La démarche est la même pour n’importe quel Web-Service dont on connait le wsdl.

Pour examiner ce Web-Service à la main, on peut utiliser un client SOAP générique, par exemple celui ci: http://www.soapclient.com/soaptest.html
Il suffit alors de lui indiquer l’url du wsdl « globalweather»  pour voir les méthodes accessibles.On remarque la méthode « getWeather»  qui retourne …. la méteo (par exemple : CityName : Toulouse, CountryName:France).

Pour écrire un client java de ce Web-Service, il faut utiliser l’utilitaire « wsimport» . Cet utilitaire se trouve dans le directory bin du jdk, « wsimport.exe» .

« wsimport»  permet de générer les classes et les sources java d’un client au Web Service.
Ensuite, il faut invoquer ces classes: C’est vraiment simple. Tout a été conçu pour simplifier la vie au développeur.

Personellement, je prefère l’invoquer à travers une tache ant, voilà le contenu du fichier build.xml:

  1.  
  2. <project name=“testWS” default=“bg-generate-client-artifacts”>
  3.    <target name=“bg-generate-client-artifacts” depends=“”>
  4.       <mkdir dir=“classesGenerated”/>
  5.       <mkdir dir=“srcGenerated”/>
  6.       <exec executable=“wsimport” failonerror=“true”>
  7.          <arg line=” -d classesGenerated”/>
  8.          <arg line=” -keep”/>
  9.          <arg line=” -s srcGenerated”/>
  10.          <arg line=” http://www.webservicex.net/globalweather.asmx?wsdl”/>
  11.       </exec>
  12.    </target>
  13. </project>

Et c’est tout!
Faites exécuter par ant ce fichier build.xml, et observez les directory créés et leurs contenus: Vous verrez les sources d’un coté et les classes de l’autre.

si certains préfèrent utiliser les fichiers de commandes voilà le même exemple pour windows (Vous pouvez soit taper les commandes dans un fenêtre de commande, soit mettre ces lignes dans un fichier .bat):
mkdir classesGenerated
mkdir srcGenerated
wsimport -d classesGenerated -keep -s srcGenerated http://www.webservicex.net/globalweather.asmx?wsdl
pause

Examinons les classes générées:
Elles sont dans le package « net.webservicex»  (logique, rien à dire!). On peut voir la classe « GloabaWeather»  et l’interface « GlobalWeatherSoap»  qui comporte des méthodes qui nous interessent..
Bien sûr, il faut mettre les classes générées dans le classpath ….

  1.  
  2. package bg.test.ws;
  3. import net.webservicex.GlobalWeather;
  4. import net.webservicex.GlobalWeatherSoap;
  5. public class MainTestWS {
  6.    public static void main(String[] args) {
  7.       GlobalWeather globalWeather = new GlobalWeather();
  8.       GlobalWeatherSoap gws = globalWeather.getGlobalWeatherSoap();
  9.       String s = gws.getWeather("Toulouse", "France"); System.out.println("-result: "+s);
  10.    }
  11. }

Voilà c’est tout. Dans le prochain tutoriel vous apprendrez à créer votre propre web-service.

Les outils de développement java: Eclipse, ant, maven, JUnit 0

Lors du developpment d’un projet java, beaucoup d’outils, de produits, de technologies sont utilisés . Une liste de ceux que j’utilise constamment est dressée ici.

Les IDE

IDE

Un environnement de développement intégré (EDI ou IDE en anglais pour « Integrated Development Environment» ) est une application regroupant au minimum un éditeur de texte, un compilateur, des outils automatiques de publication, et un débogueur.

* Eclipse (Sans doute le plus populaire)
* jBuilder
* Net Beans

Gestionnaire de version

Permet d’archiver les sources et de remonter dans l’historique.
Dans le monde java, les plus répandus sont les suivant.

* cvs (Un peu ancien)
* subversion
o Il existe un plugin eclipse: Help>Software Updates>Find And Install>new Feature>…
url: http://subclipse.tigris.org/update_1.0.x
o Google propose un hebergement sur serveur subversion libre et gratuit pour projets sous licence GNU:
exemple :https://bertrand123.googlecode.com/svn
user bertrand2.guiral password: ********

Bug Tracking

Un « bug tracking»  system ou « système de suivi de bogues»  aide les développeurs et utilisateurs à reporter et suivre les bugs. On peut le faire par mail, mais c’est vite ingérable. Les utilisateurs soumettent les bogues rencontrés dans le logiciel. Les développeurs les gère et essaye de les corriger. Parfois ce qui est un bug pour l’utilisateur n’en est pas un pour le developpeur!!

Bugzilla

Bugzilla ancien outil de Netscape a été libéré en 1998. Il est maintenant géré par Mozilla (Plus connu pour Firefox et Thunderbird).

Ant: Langage de script

Ant , « Another Neat Tool»  (un autre chouette outil), la fourmi in English, a un nom particulièrement bien choisi. Ant vise à assurer les opérations répétitives, un peu comme les « Make»  du monde unix.
Ant est principalement utilisé pour automatiser la construction de projets Java, mais peut être utilisé pour tout autre type d’automatisation dans n’importe quel langage.
Parmi les tâches typiques réalisées par Ant, citons : la compilation, la génération des javadoc, la génération de jar, la copie de fichiers, le déploiement sur les serveurs …..

Maven:Gestion de projet java

Maven est un outil logiciel libre pour la gestion et l’automatisation de production des projets . C’est génial, sauf qu’il y a 2 versions (maven 1 et maven 2 !!) qui ne sont pas compatibles.

Apache nous avais habitué à mieux (Maven est un produit Apache). Il y a certains recoupements des fonctionnaltés avec ant.

JUnit: Tests Automatisés

L’on peut distinguer les tests unitaires et les tests d’intégration.JUnit est l’outil très répandu dans le monde java pour la réalisation de tests unitaires.
Junit est un des outils clés des methodes « Test Driven Development»  ou « Développement piloté par les tests» .

Les outils livrés avec le jdk:
Ces outils sont dans le repertoire bin du jdk:

* javaws.exe L’application « Java Web start» , qui est associé au type de fichier .jnlp à l’installation de java sous windows, permet de lancer des applications simplement à partie du web. Ces fichiers remplacent avantageusement les applets.
* javap.exe Simple Desassembleur .
* jdb.exe Un debuger java.
* jconsole.exe Une console jmx
* jar.exe Permet de créer des fichier jar (Java Archive)

Voilà les essentiels.

Moi, j’utilise Eclipse, Ant, Maven pour gérer les dépendances, JUnit quotidiennement.

Et Vous, qu’utilisez vous? Quels sont vos outils?

« Page précédente