<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Bertrand PERALTA &#187; Spring</title>
	<atom:link href="http://bertrand.peralta.fr/tag/spring/feed/" rel="self" type="application/rss+xml" />
	<link>http://bertrand.peralta.fr</link>
	<description></description>
	<lastBuildDate>Thu, 21 Jan 2010 21:20:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>JMS avec Spring</title>
		<link>http://bertrand.peralta.fr/2008/11/26/jms-avec-spring/</link>
		<comments>http://bertrand.peralta.fr/2008/11/26/jms-avec-spring/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 20:47:28 +0000</pubDate>
		<dc:creator>bperalta</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://bperalta.wordpress.com/?p=117</guid>
		<description><![CDATA[Voici un mode d&#8217;emploi simple pour mettre en oeuvre JMS en utilisant Spring. Bien entendu il vous faut pour cela au minimum un serveur JMS (serveur d&#8217;application, ou ActiveMQ ou encore OpenJMS). Comme vous allez le voir, le codage et la paramétrage sont assez simples en fait  
Spring met à votre disposition 2 dispositifs [...]]]></description>
			<content:encoded><![CDATA[<p>Voici un mode d&#8217;emploi simple pour mettre en oeuvre JMS en utilisant Spring. Bien entendu il vous faut pour cela au minimum un serveur JMS (serveur d&#8217;application, ou ActiveMQ ou encore OpenJMS). Comme vous allez le voir, le codage et la paramétrage sont assez simples en fait <img src='http://bertrand.peralta.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Spring met à votre disposition 2 dispositifs rendant l&#8217;utilisation de JMS très simple :</p>
<p>- JmsTemplate : gère la connexion vers le serveur déclaré et l&#8217;envoi des données</p>
<p>- SimpleMessageListenerContainer : assure la réception des messages et l&#8217;appel à votre classe en charge de traiter la réception des objets.</p>
<p><strong>1ère étape : déclaration du serveur</strong></p>
<p>Dans un fichier xml de configuration Spring, insérez ces lignes (dans notre exemple, il s&#8217;agit de la déclaration des 2 serveurs ActiveMQ locaux) :</p>
<pre>    &lt;!-- ActiveMQ Sender --&gt;
    &lt;bean id="connectionFactorySender" class="org.apache.activemq.ActiveMQConnectionFactory"&gt;
        &lt;property name="brokerURL" value="tcp://localhost:61616"/&gt;
    &lt;/bean&gt;

    &lt;!-- ActiveMQ Receiver --&gt;
    &lt;bean id="connectionFactoryListener" class="org.apache.activemq.ActiveMQConnectionFactory"&gt;
        &lt;property name="brokerURL" value="tcp://localhost:61616"/&gt;
    &lt;/bean&gt;</pre>
<p>ainsi que la déclaration de la queue qui sera utilisée pour nos échanges de messages :</p>
<pre>    &lt;bean id="categs_backup_queue" class="org.apache.activemq.command.ActiveMQQueue"&gt;
        &lt;constructor-arg value="categs_backup"/&gt;
    &lt;/bean&gt;</pre>
<p><strong>2ème étape : gestion de l&#8217;émission des messages</strong></p>
<p>Dans notre exemple, nous échangerons des POJOs représentants des catégories afin de les sauvegarder sur un autre serveur.</p>
<p>Voici l&#8217;implémentation de la classe servant à envoyer ces messages :</p>
<pre>public class CategorieBackupSenderImpl implements CategorieBackupSender {
    private JmsTemplate jmsTemplate;
    private Queue queue;

    @Required
    public void setConnectionFactory(ConnectionFactory cf) {
        this.jmsTemplate = new JmsTemplate(cf);
    }

    @Required
    public void setQueue(Queue queue) {
        this.queue = queue;
    }

    /* (non-Javadoc)
     * @see com.bp.jms.CategorieBackupSender#simpleSend()
     */
    public void send(final Categorie categ) {
        this.jmsTemplate.send(this.queue, new MessageCreator() {
            public ObjectMessage createMessage(Session session) throws JMSException {
              return (ObjectMessage) session.createObjectMessage(categ);
            }
        });
    }
}</pre>
<p>Les deux setters servent à Spring pour renseigner les propriétés nécessaires au bon fonctionnement de cette classe : le template (JmsTemplate) qui utilise la connexion au serveur JMS (ConnectionFactory) et la queue (Queue).</p>
<p>La méthode Send fait appel au template pour créer le message à partir de notre POJO via la classe MessageCreator.</p>
<p>Il nous reste à déclarer ce composant dans le XML de configuration Spring :</p>
<pre>    &lt;bean id="categorieBackupSender" class="com.bp.categories.jms.impl.CategorieBackupSenderImpl"&gt;
        &lt;property name="connectionFactory" ref="connectionFactorySender"/&gt;
        &lt;property name="queue" ref="categs_backup_queue"/&gt;
    &lt;/bean&gt;</pre>
<p>C&#8217;est tout pour l&#8217;émission des messages ! La bonne nouvelle c&#8217;est que la réception n&#8217;est guère plus compliquée <img src='http://bertrand.peralta.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><strong>3è étape : gestion de la réception des messages</strong></p>
<p>Voici la classe gérant cette réception :</p>
<pre>public class CategorieBackupListener implements MessageListener {

    private CategorieService categorieService;

    /**
     * @param categorieService the categorieService to set
     */
    @Required
    public void setCategorieService(CategorieService categorieService) {
        this.categorieService = categorieService;
    }

    public void onMessage(Message message) {
        if (message instanceof ObjectMessage) {
            try {
                Categorie categ = (Categorie) ((ObjectMessage) message).getObject();
                categorieService.backup(categ);
            }
            catch (JMSException ex) {
                throw new RuntimeException(ex);
            }
        }
        else {
            throw new IllegalArgumentException("Message must be of type ObjectMessage");
        }
    }
}</pre>
<p>Le source est assez parlant de lui-même. Suite à la réception du message, le service CategorieService est appelé afin d&#8217;effectuer le traitement approprié.</p>
<p>De même que pour l&#8217;émission, la configuration Spring est importante&#8230;</p>
<pre>    &lt;bean id="categorieBackupListener" class="com.bp.categories.jms.CategorieBackupListener"&gt;
        &lt;property name="categorieService" ref="categorieService" /&gt;
    &lt;/bean&gt;

    &lt;bean id="listener" class="org.springframework.jms.listener.SimpleMessageListenerContainer"&gt;
       &lt;property name="connectionFactory" ref="connectionFactoryListener"/&gt;
       &lt;property name="destination" ref="categs_backup_queue"/&gt;
       &lt;property name="concurrentConsumers" value="3"/&gt;
       &lt;property name="messageListener" ref="categorieBackupListener"/&gt;
    &lt;/bean&gt;</pre>
<p>Bien entendu dans cet exemple nous échangeons des POJOs reconnus par JMS comme simple Object. Il est possible d&#8217;améliorer tout ça, ne serait-ce que pour s&#8217;assurer que l&#8217;objet reçu est bien l&#8217;objet attendu ou aussi pour échanger des objets de différents types en utilisant la même queue.</p>
<p><strong>4ème étape : fonctionnement de notre exemple</strong></p>
<p>Nous devons déclarer nos deux beans :</p>
<pre>        categorieService = (CategorieService) Context.getContext().getBean("categorieService");
        categorieBackupSender = (CategorieBackupSender) Context.getContext().getBean("categorieBackupSender");</pre>
<p>puis la récupération de nos objets et leur envoi :</p>
<pre>        List&lt;Categorie&gt; categs = categorieService.getCategs();
        if (categs != null) {
            for (Categorie categ: categs) {
                categorieBackupSender.send(categ);
            }
        }</pre>
<p>La réception se met en route automatique dès l&#8217;instanciation du listener.</p>
<p>Si vous voulez contrôler le fonctionnement du listener, alors il faut déclarer un troisième bean :</p>
<pre>        listener = ((SimpleMessageListenerContainer) Context.getContext().getBean("listener"));</pre>
<p>Voilà, cet exemple ne présente sans doute pas toutes les possibilités que l&#8217;on peut faire de JMS avec Spring, mais c&#8217;est un bon début <img src='http://bertrand.peralta.fr/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://bertrand.peralta.fr/2008/11/26/jms-avec-spring/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
