fbpx

PHP5 et le queue messaging Stomp via l’extension PECL/Stomp

Le protocole Stomp

Streaming Text Orientated Message Protocol (STOMP), connu auparavant sous le nom de TTMP, est un protocole simple de communication avec du middleware orienté message (message queue). Il offre un format d’échange interopérable qui permet au clients Stomp de parler avec des courtiers supportant ce protocole (broker). Compte tenu de la simplicité de son design, on retrouve des clients pour presque la totalité des langages et plateformes. Le plus populaire des courtiers supportant Stomp est sans doute ActiveMQ de Apache.

Globalement, le concept des messages queues est simple, on peut créer et gérer plusieurs queues, et on peut envoyer et recevoir des messages dans et depuis ces queues. Le broker s’occupe de toute la gestion des queues et messages, des transactions, de l’exclusion mutuelle etc.

Les commandes Stomp

  • SEND : envoie un message au broker
  • SUBSCRIBE : s’enregistrer pour écouter une certaine queue
  • UNSUBSCRIBE : se desinscrire d’une queue déterminée
  • BEGIN : commence une transaction
  • COMMIT : commite une transaction
  • ABORT : annule une transaction en cours
  • ACK : confirme la consommation d’un message

Utiliser Stomp avec PHP :

Pour communiquer avec des brokers supportant Stomp, il suffit d’installer l’extension PECL/Stomp qui est désormais a sa version 1.0.0. L’extension requiert La version 5.2.2 ou plus de PHP. Il faut aussi avoir installe un broker, ou avoir les accès pour se connecter a un broker distant.

Installation

L’installation de l’extension est tres simple. Il faut avoir PECL installe, si vous n’avez pas PECL, consultez cette page : Installer une extension PECL.
La commande suivante va télécharger et installer l’extension :

pecl install stomp

Modifiez par la suite votre fichier php.ini en y ajoutant la ligne suivante :

extension=stomp.so

Redemarrez votre Serveur et essayer un phpinfo() pour voir si tout s’est bien passe.

Variables de configuration

Vous pouvez définir dans le fichier php.ini ( ou via vos ini_set() ) un ensemble de variables de configuration :

  • stomp.default_broker L’adresse de votre broker si aucune adresse n’est spécifiée a la connection
  • stomp.default_connection_timeout_sec Le nombre de secondes pour un arrêt de connection
  • stomp.default_connection_timeout_usec Le nombre de microsecondes pour un arrêt de connection
  • stomp.default_read_timeout_sec Le nombre de secondes pour un arrêt de lecture.
  • stomp.default_read_timeout_usecLe nombre de microsecondes pour un arrêt de lecture.

Souscrire a une queue

Vous pouvez utiliser l’extension via le mode procédural ou le mode objet. Dans les exemples suivants, je vais utiliser le mode objet. Je vais aussi utiliser ActiveMQ comme broker. Pour plus d’informations sur le mode procédural, vous pouvez vous référer a la documentation de l’extension.

$stomp = new Stomp('tcp://127.0.0.1:61613');
$queue = '/queue/myQueue';
try {
    $stomp->subscribe($queue);
    unset($stomp);
} catch(StompException $e) {

    echo $stomp->getMessage();
}

Dans le code précédant, on se connecte au serveur en utilisant une chaine de connexion (tcp://127.0.0.1:61613). Par la suite, on essaye de souscrire a la queue $queue. En cas d’erreur, le code nous renvoie une exception de type StompException.
Pour se desinscrire d’une queue $queue, utiliser la méthode unsubscribe($queue).
Pour fermer une connexion simplement résilier l’objet.

Envoyer un message

Pour envoyer un message, il suffit d’appeler la méthode send() en spécifiant la queue et le message.

$stomp = new Stomp('tcp://127.0.0.1:61613');
$queue = '/queue/myQueue';
$stomp->send($queue, 'Un message simple');

Recevoir un message

$stomp = new Stomp('tcp://127.0.0.1:61613');
$queue = '/queue/myQueue';
$stomp->subscribe($queue);
try
{
    if ($stomp->hasFrame())
    {
        $frame = $stomp->readFrame();
        $stomp->ack($frame);
        var_dump("Acknoledged frame {$frame->headers['message-id']}");
    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}

Le code précédent montre comment recevoir un message depuis une queue. On peut tester si il y a un message a prendre avec la méthode hasFrame(). Par la suite, on lit le message via la méthode readFrame(). Pour indiquer au broker qu’on a reçu le message, on envoie une acceptation avec ack().

La valeur de retour de readFrame est un objet StompFrame. Cet Objet contient une entête headers et un corps body. L’entête contient des informations tel que le numéro du message, le temps de réception Timestamp, ou encore des headers applicatifs (voir la section sélecteurs). Le corps contient le message lui même.

Utiliser les transactions

Il est possible d’utiliser une transaction pour envoyer un certain nombre de message. Les méthodes begin(), commit() et abort() servent respectivement a commencer une transaction, la commiter ou l’annuler. Voici un exemple :

try {
    $stomp = new Stomp('tcp://localhost:61613');
} catch(StompException $e) {
    die('Connection failed: ' . $e->getMessage());
}

// Debut de la transaction t1
$stomp->begin('t1');

// Envoyer un message a la queue
$stomp->send('/queue/foo', 'bar', array('transaction' => 't1'));

// commiter la transaction
$stomp->commit('t1');

// Fermer la connection
unset($stomp);

Utiliser les selecteurs

Il est possible d’envoyer des informations supplémentaires dans l’entête du message, des informations qui vont servir a des fins de sélection ou de traitement sans avoir pour autant a utiliser le corps du message. Plusieurs brokers offrent la notion de “Sélecteurs” pour filtrer, ou encore requêter selon ces propriétés ou entêtes. ActiveMQ permet d’utiliser les sélecteurs. La syntaxe utilisée est celle du SQL 92. Si vos messages ont une propriété couleur par exemple, et que vous voulez filtrer par couleur lorsque vous recevez les messages, vous pouvez envoyer un header couleur et filtrer lors de la lecture. Exemple :

$queue = '/queue/colors';
$stomp = new Stomp('tcp://127.0.0.1:61613');
$stomp->send($queue, 'Un message Bleu!', array('couleur' => 'bleu'));
sleep(5);
try
{
    $stomp->subscribe($queue, array('selector' => "couleur='bleu'"));
    if ($stomp->hasFrame())
    {
        $frame = $stomp->readFrame();
        $stomp->ack($frame);
        var_dump("Acknoledged frame {$frame->headers['message-id']}");
    }
}
catch(Exception $e)
{
    echo $e->getMessage();
}

Dans le code précédent, on envoie un message avec un header couleur ‘bleu’. Après une pause de 5 secondes (juste pour avoir le temps d’afficher votre console de broker et de voir la propriété dans les headers du message), nous souscrivons a la queue en spécifiant le sélecteur “selector” avec notre condition. Ceci permettra de filtrer uniquement les messages qu’on veut.

Conclusion

Le protocole Stomp est un protocole de communication simple et efficace. De plus, en utilisant une extension, vous augmentez la performance de vos scripts. L’utilisation d’un tel système vous permettra de résoudre plusieurs problèmes d’interopérabilité et de faciliter la communication entre plusieurs tiers applicatifs.

Plus d’informations, documentation et exemples sur l’extension PECL/Stomp sur : http://pecl.php.net/package/stomp ou sur http://php.net/stomp

Plus d’informations sur ActiveMQ : http://activemq.apache.org

Anis Berejeb

Anis est avant tout un passioné de l'agilité et du développement. Avec plus de 15 ans dans le domaine du développement web, son expertise combine des connaissances accrues dans l'ensemble des notions partant du développement logiciel jusqu'à l'organisation des équipes dans les environnements agiles à grande échelle.

You may also like...