2010-08-11 5 views

Répondre

1

La principale exigence que je rencontre est que les consommateurs ne peuvent pas rivaliser pour un seul message sur un sujet. Par exemple, j'ai un client qui publie des événements de centre d'appels. Plusieurs systèmes s'abonnent à ces événements. L'un de ces systèmes est l'application de routage d'appel réelle qui a plusieurs instances en cours d'exécution. Si chaque instance s'abonne, l'appel est routé vers chacun d'eux. Cependant, si le message est déposé dans une file d'attente et que toutes les instances utilisent la même file d'attente, un seul recevra le message et l'appel sera dirigé vers cet opérateur. Si l'application de publication convertit des sujets en file d'attente, le centre d'appels fonctionne mais toutes les autres applications abonnées n'obtiennent pas le message.

La solution (telle que mise en œuvre dans WebSphere MQ) consistait à créer un abonnement administratif sur le sujet et à livrer les messages à une file d'attente dont toutes les instances d'application consomment. Ainsi, les applications du producteur sont toujours des éditeurs, tous les abonnés dynamiques reçoivent toujours des copies du message et les instances de l'application du centre d'appels sont en concurrence pour une seule instance de chaque message publié. De plus, vous ne pouvez pas utiliser la sémantique de navigation sur un sujet alors que vous pouvez le faire dans une file d'attente. Avec les sujets, vous pouvez spécifier des sélecteurs pour filtrer les messages qui sont retournés mais c'est à peu près tout. Avec les files d'attente, vous pouvez parcourir, réinitialiser le pointeur de navigation, puis en parcourir d'autres.

Si vous placez un message dans une file d'attente et qu'il n'y a rien pour le recevoir, le message reste en file d'attente. Si vous mettez un message à un sujet et qu'il n'y a pas d'abonnés actifs ou d'abonnements durables, le message est ignoré. Par conséquent, les messages dans une file d'attente sont naturellement durables tandis que les messages sur un sujet peuvent ou ne peuvent pas l'être. D'un point de vue purement JMS, la file d'attente et le sujet sont des instances de destination et sont interchangeables si vous n'essayez pas de naviguer. Une application peut ne pas savoir si la destination qu'elle ouvre est une file d'attente ou un sujet sauf si elle utilise instanceOf() à l'exécution pour le savoir.

Questions connexes