JMS avec Spring

Voici un mode d’emploi simple pour mettre en oeuvre JMS en utilisant Spring. Bien entendu il vous faut pour cela au minimum un serveur JMS (serveur d’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 rendant l’utilisation de JMS très simple :

- JmsTemplate : gère la connexion vers le serveur déclaré et l’envoi des données

- SimpleMessageListenerContainer : assure la réception des messages et l’appel à votre classe en charge de traiter la réception des objets.

1ère étape : déclaration du serveur

Dans un fichier xml de configuration Spring, insérez ces lignes (dans notre exemple, il s’agit de la déclaration des 2 serveurs ActiveMQ locaux) :

    <!-- ActiveMQ Sender -->
    <bean id="connectionFactorySender" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

    <!-- ActiveMQ Receiver -->
    <bean id="connectionFactoryListener" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:61616"/>
    </bean>

ainsi que la déclaration de la queue qui sera utilisée pour nos échanges de messages :

    <bean id="categs_backup_queue" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg value="categs_backup"/>
    </bean>

2ème étape : gestion de l’émission des messages

Dans notre exemple, nous échangerons des POJOs représentants des catégories afin de les sauvegarder sur un autre serveur.

Voici l’implémentation de la classe servant à envoyer ces messages :

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);
            }
        });
    }
}

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).

La méthode Send fait appel au template pour créer le message à partir de notre POJO via la classe MessageCreator.

Il nous reste à déclarer ce composant dans le XML de configuration Spring :

    <bean id="categorieBackupSender" class="com.bp.categories.jms.impl.CategorieBackupSenderImpl">
        <property name="connectionFactory" ref="connectionFactorySender"/>
        <property name="queue" ref="categs_backup_queue"/>
    </bean>

C’est tout pour l’émission des messages ! La bonne nouvelle c’est que la réception n’est guère plus compliquée :-)

3è étape : gestion de la réception des messages

Voici la classe gérant cette réception :

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");
        }
    }
}

Le source est assez parlant de lui-même. Suite à la réception du message, le service CategorieService est appelé afin d’effectuer le traitement approprié.

De même que pour l’émission, la configuration Spring est importante…

    <bean id="categorieBackupListener" class="com.bp.categories.jms.CategorieBackupListener">
        <property name="categorieService" ref="categorieService" />
    </bean>

    <bean id="listener" class="org.springframework.jms.listener.SimpleMessageListenerContainer">
       <property name="connectionFactory" ref="connectionFactoryListener"/>
       <property name="destination" ref="categs_backup_queue"/>
       <property name="concurrentConsumers" value="3"/>
       <property name="messageListener" ref="categorieBackupListener"/>
    </bean>

Bien entendu dans cet exemple nous échangeons des POJOs reconnus par JMS comme simple Object. Il est possible d’améliorer tout ça, ne serait-ce que pour s’assurer que l’objet reçu est bien l’objet attendu ou aussi pour échanger des objets de différents types en utilisant la même queue.

4ème étape : fonctionnement de notre exemple

Nous devons déclarer nos deux beans :

        categorieService = (CategorieService) Context.getContext().getBean("categorieService");
        categorieBackupSender = (CategorieBackupSender) Context.getContext().getBean("categorieBackupSender");

puis la récupération de nos objets et leur envoi :

        List<Categorie> categs = categorieService.getCategs();
        if (categs != null) {
            for (Categorie categ: categs) {
                categorieBackupSender.send(categ);
            }
        }

La réception se met en route automatique dès l’instanciation du listener.

Si vous voulez contrôler le fonctionnement du listener, alors il faut déclarer un troisième bean :

        listener = ((SimpleMessageListenerContainer) Context.getContext().getBean("listener"));

Voilà, cet exemple ne présente sans doute pas toutes les possibilités que l’on peut faire de JMS avec Spring, mais c’est un bon début ;-)

Commentaires (1)

Postfix et l’envoi de mails vers AOL

AOL filtre de façon drastique les mails envoyés à leurs abonnés. Le problème, c’est que leur filtre stoppe net les mails envoyés depuis un serveur connecté sur une ligne ADSL ou tout autre réseau réputé comme un réseau ne devant pas en principe héberger des serveurs.

Postfix vous permet de modifier la route empruntée par les mails envoyés à certains domaines. Il sufit pour cela d’insérer dans le fichier transport ce type de ligne :

<domaine> : [<serveur smtp de destination>]

Par exemple, pour un serveur connecté sur une ligne Free :

aol.com         :[smtp.free.fr]
.aol.com        :[smtp.free.fr]

La seconde ligne permet de gérer les cas où un sous-domaine d’aol.com serait utilisé au sein d’une adresse email.

N’oubliez pas de compiler le fichier transport à l’aide de la commande

postmap transport

et de vérifier que ce fichier transport est bien déclaré dans le fichier main.cf :

transport_maps = hash:/etc/postfix/transport

Laisser un commentaire

Aquarium V2.1

C’est le genre de post qui ne sert à rien, mais on dit que regarder un aquarium dé-stresse… alors dans ce monde de plus en plus stressant, je vous fais profiter de mon aquarium ;-)

Aquarium v2.1

Aquarium v2.1

Pourquoi v2.1 ?? d’abord par déformation professionnelle où on numérote toutes les versions d’un logiciel :-/ et ensuite car après une modification complète du décor (v2.0), je viens de lui redonner un nouvel élan en remettant quelques poissons… Mais il ne sera véritablement fini que pour Nôel. Je ne manquerai pas de republier alors une photo… si tout se passe bien ;-)

Laisser un commentaire

Transcodage de vidéos avec VLC

Qui ne connaît pas VLC ? VLC est un lecteur audio/video multi-plateformes capable de lire de nombreux formats. Il est en outre utilisé par différents providers (dont Free) et également par des matériels vidéo comme des récepteurs satellites. Mais ce qui est nettement moins connu c’est que VLC dispose de fonctions de streaming et est capable de générer une video dans n’importe quel format supporté. Ainsi, une video au format MPEG4 pourra sans problème être transformé en MPEG2. Pour faciliter encore son usage, VLC intègre un mode “ligne de comandes” très complet et très pratique pour transformer plusieurs fichiers.

Voici un exemple pour tranformer du MPEG4 en MPEG2 :

vlc <nom fichier videos mpeg4> --sout='#transcode{vcodec=mp2v, vb=3072, scale=1, width=640, height=480, acodec=mpga, ab=192, fps=25, channels=2}:std{access=file, mux=ts, dst=<nom fichier video mpeg2>}'

Laisser un commentaire

Monitorer une application Tomat avec JConsole

L’utilisation de JConsole permet de consulter toutes les données exposées en JMX par un programme Java. De nombreuses données sont en général accessibles comme par exemple l’utilisatoin de la mémoire, le nombre de threads, le nombre de classes chargées. Tomcat n’ouvre pas par défaut l’accès JMX, mais il suffit d’indiquer à la JVM utilisée par Tomcat ces quelques infos :

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

Comme vous l’aurez constaté, il n’y a aucune sécurité d’accès et cela n’est conseillé que pour un serveur présent sur un réseau protégé. Dans certain cas, il est nécessaire d’ajouter :

-Djava.rmi.server.hostname=<IP qui doit écouter sur le port JMX>

Suivant la façon de lancer Tomcat, vous pourrez insérer ces propriétés das le script de démarrage ou dans la variable d’environnement JAVA_OPTS qui est lue par les scripts Tomcat. Il ne vous restera plus qu’à vous connecter avec JConsole sur l’ip et le port indiqué et à scruter toutes les informations délivrées.


													

Commentaires (2)

Installation d’un webmail : RoundCube

Il n’est pas toujours possible d’accéder à ses mails depuis le client mail habituel. L’accès via un webmail est une solution très pratique pour les itinérants ou occasionnellement. Plusieurs solutions packagées existent. Une des plus connue est SquirrelMail, mais le look ne m’a pas franchement convaincu. Mon choix final s’est porté sur RoundCube, donc pour son look résolument plus moderne, mais aussi pour un support direct de Dovecot.

L’installation se fait relativement simplement. Voici les quelques points nécesaires :

Téléchargement de la dernière version sur http://roundcube.net/downloads

L’installation en elle-même ne pose pas particulièrement de problème car il suffit de déposer le contnu du tar.gz dans un répertoire vu par apache.

Création des cles ssl

C’est peut-être la partie la plus sensible… Vous pouvez vous aider d’un de mes posts précédents pour cela.

Création d’un vhost sur apache

Voici un exemple de vhost simple :

<IfDefine SSL>
<IfDefine !NOSSL>

<VirtualHost nom_du_serveur:443>

        #  General setup for the virtual host
        DocumentRoot "repertoire_contenant_roundcube"
        ServerName nom_du_serveur:443
        ServerAdmin email_admin_du_serveur
        ErrorLog /var/log/apache2/nom_du_serveur_error.log
        TransferLog /var/log/apache2/nom_du_serveur_access.log

        SSLEngine on
        SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

        SSLCertificateFile /etc/apache2/ssl.crt/nom_du_certificat_du_serveur
        SSLCertificateKeyFile /etc/apache2/ssl.key/nom_de_la_cle_privee_du_serveur

        SetEnvIf User-Agent ".*MSIE.*" \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0

        CustomLog /var/log/apache2/nom_du_serveur_acess.log ssl_combined

        <Directory "repertoire_contenant_roundcube">
                Options Indexes FollowSymLinks
                AllowOverride None
                Order allow,deny
                Allow from all
        </Directory>

</VirtualHost>

</IfDefine>

Bien entendu il faut activer le ssl en le redémarrant avecl’option startssl qui n’a d’autre mission que de démarrer le process en spécifiant -DSSL sur la ligne de commande.

Configuration de RoundCube

Le fichier INSTALL livré avec RoundCube décrit les opération à faire au niveau de la base de données. Il s’agit en fait de créer une base, le programme de configuration se chargeant alors de créer toutes les tables necessaires.

Il suffit ensuite d’appeler avec un browser l’url http://nom_de_votre_serveur/installer/ afin de compléter les quelques renseignements nécessaires comme la façons d’accéder au smtp, au serveur imap et à la base de données.

Une fois la configuration terminée, il est consillé de supprimer le répertoire /installer pour éviter quelques surprises ;-)

Commentaires (2)

Ajouter une Greylist à Postfix

Les spams deviennent de plus en plus envahissants, et un serveur SMTP se trouve vite submergé de mails inutiles qui augmentent sensiblement sa charge. Bien entendu, des logiciels anti-spams existent. En s’appuyant sur une analyse du contenu des mails, ceux-ci arrivent à de bons (voire très bons) résultats. Je n’en citerai que 2, un open source (SpamAssassin) et un produit commercial (Vade Retro, de Goto Software). Une approche plus simple et éliminant une bonne partie des spams consiste à installer une Greylist au sein de Postfix. Plusieurs implémentations existent. Mon choix s’est porté sur l’implémentation de David Schweikert.

L’installation ne présente pas de problèmes particuliers et les quelques opérations sont décrites dans la documentation livrée. Elle est accessible en tapant la commande :

perldoc postgrey

Le lien avec postfix se fait en ajoutant au paramètre smtpd_recipient_restrictions une option check_policy_service inet:127.0.0.1:10023 (à condition d’avoir utiliser tous les paramètres par défaut). Voici par exemple le paramètre complet :

smtpd_recipient_restrictions = permit_mynetworks,reject_non_fqdn_recipient,
        permit_sasl_authenticated,
        check_policy_service inet:127.0.0.1:10023,
        reject_unauth_destination

Une fois le process postgrey lancé (postgrey –inet=10023 -d) et postfix rechargé, les premières traces de contrôle doivent apparaître dans le log postfix.

Laisser un commentaire

Linux Mint Elyssa KDE Community Edition

Le Software Portal de Linux Mint

Le Software Portal de Linux Mint

Vous avez envie de découvrir une nouvelle distribution Linux ? Xavier a l’air très tenté par le test de la Linux Mint. Je dois dire que sur le papier les différentes fonctionnalités sont intéressantes… Pour tout vous dire, je suis en train de la télécharger pendant que j’écris ce billet. Je vous donnerai mes impressions une fois installée ;-)

Commentaires (4)

Connaître le nombre de lignes traitées par une requête MySQL

L’optimisation de requêtes MySQL est nécessaire afin d’obtenir un site performant. Des outils comme la commande EXPLAIN ou l’analyse des fichiers de log sont d’un grand secours. La commande EXPLAIN permet de connaître les plans d’exécution, les utilisations d’index, mais le nombre de lignes traitées n’est que le résultat d’un calcul approximatif. Le fichier de log ‘slow’ l’indique… à condition que la requête ait été qualifiée de suffisamment lente pour y être inscrite. Alors ? Comment lors de la construction d’une requête savoir si le nombre de lignes sera restreint ou au contraire énorme ?

Les variables status ‘handler’ nous indique cela. La méthode est donc simple, bien qu’un peu fastidieuse à la longue…

mysql> flush status;
mysql> SELECT xxxxx;
mysql> show status like 'handler%';

Le nombre de lignes traitées correspond à la somme de Handler_read_key + Handler_read_next + Handler_read_rnd + Handler_read_rnd_next.

Laisser un commentaire

Configuration de Postfix et Dovecot – partie 2

Une fois que postfix est fonctionnel il faut penser à installer ce qu’il faut pour voir lire les mails qui sont reçus ;-)

Dovecot permet la gestion des boites au format Maildir, la récupération du courrier en pop3 et impa, SSL ou non et peut assurer le service d’authentification pour Postfix afin d’autoriser nos utilisateurs à envoyer des mails en utilisant notre serveur.

Fichier dovecot.conf

Voici donc les différetns paramètres modifiés par rapport à la configuration d’origine :

disable_plaintext_auth = no

Nécessaire pour l’uthentification de base. Toutes nos connexions avec Dovecot seront faites via SSL/TLS donc pas de soucis de lecture des mots de passe sur la ligne.

ssl_disable = no

SSL sera donc activé

protocol imap {
ssl_cert_file = /var/keys/imap.mondomaine.fr_cert.pem
ssl_key_file = /var/keys/imap.mondomaine.fr_key.pem
ssl_key_password = <Password de la clé>
}
protocol pop3 {
ssl_cert_file = /var/keys/pop3.mondomaine.fr_cert.pem
ssl_key_file = /var/ssl/keys/pop3.mondomaine.fr_key.pem
ssl_key_password = <Password de la clé>
}

SSL sera alors activé pour imap et pop3. La création des clés et certificats peuvent être faits en suivant les explications ici.

mail_location = maildir:~/Maildir

Même emplacement que défini dans Postfix (c’est mieux ;-)   )

auth default {
  mechanisms = plain login
}

Permet d’autauriser les authentification en PlainText

passdb passwd-file {
  args = /etc/dovecot/dovecot.users
}
userdb passwd-file {
  args = /etc/dovecot/dovecot.users
}

Indique l’emplacement du fichier listant les utilisateurs

socket listen {
  client {
    path = /var/spool/postfix/private/auth
    mode = 0660
    user = postfix
    group = postfix
  }
}

Indique à dovecot qui a le droit d’utiliser son authentification (cf paramètre smtpd_sasl_path de la conf postfix).

Fichier dovecot.users

Il reste maintenant à lister nos utilisateurs dans le fichier dovecot.users. Une ligne type à cette forme :

<userlogin>:{<encodagepwd>}<passwd>:vmail:vmail::<chemin de la boite>::userdb_mail=maildir:~

Par exemple,

monlogin:{PLAIN}passwd:vmail:vmail::/home/vmail/monlogin::userdb_mail=maildir:~

L’enregistrement dans ce fichier des mots de passe en mode PLAIN n’est pas recommandé d’un point de vue sécurité. Différents encodage peuvent être utilisé. Il suffit d’utiliser l’outil dovecotpw qui génère la chaine encodée à insérer dans le fichier de configuration.

Laisser un commentaire

Articles Précédents »
Suivre

Get every new post delivered to your Inbox.