2008-12-22 8 views
6

Dans une application Web Java, j'ai une charge de message récurrente de type A (par exemple, 20 000 toutes les heures). Ensuite, j'ai un deuxième type de messages (type B) qui apparaissent occasionnellement mais qui ont une priorité plus élevée que le type A (disons 3 000). Je veux être capable de traiter ces messages sur une ou plusieurs machines en utilisant un logiciel open source. Il me semble que je pourrais le faire avec JMS si j'avais un serveur JMS qui enverrait des messages de sa file d'attente en fonction des priorités (par exemple, envoyer trois messages de type B, puis un de type A même si tous les messages de type A sont en haut de la file d'attente de messages). Connaissez-vous un serveur JMS capable de le faire - ou connaissez-vous une autre façon de l'implémenter?Traitement des messages avec priorités

Répondre

2

Définissez la priorité du message lorsque vous appelez "send (..)" sur MessageProducer (QueueSender, etc.). Ou, vous pouvez définir la priorité par défaut sur le MessageProducer de 0-9 (9 est le plus élevé). Définir la priorité sur le message lui-même ne fonctionnera pas. C'est dépassé par le producteur. Uri est correct - que la priorité soit respectée ou non est spécifique à l'implémentation. Je crois qu'OpenJMS respecte généralement la priorité dès le départ, mais ne la garantit pas.

JMS états Spec: "JMS does not require that a provider strictly implement priority ordering of messages; however, it should do its best to deliver expedited messages ahead of normal messages."

6

La norme JMS prend en charge les priorités de message par défaut est 4, vous pouvez spécifier d'autres). Je pense que vous devez définir cela dans le producteur de message ET dans le message lui-même (il y a des méthodes sur les deux).

Je pense qu'ActiveMQ le supporte.

Toutefois, de nombreux courtiers JMS ont la gestion des priorités désactivée par défaut. Il y a un drapeau que vous devrez peut-être changer, quelque chose comme "supportJMSPriority", quelque part dans la configuration du courtier. Apache Camel vous permet également d'écrire vos propres reséquenceurs de message afin que vous puissiez implémenter toute forme de priorité que vous souhaitez.

0

Pourquoi ne pas utiliser une autre MDB pour traiter explicitement l'autre type de message. Les détails de priorité ci-dessus s'appliquent toujours, plus vous aurez plus de contrôle sur le traitement simultané pour chaque type de message.

Pour la plupart des situations je préfère 1 mdb ou récepteur de message par type de message. De cette façon, si une transaction est annulée vous savez immédiatement quel type de messages a causé le problème

Karl

0

Vous pouvez utiliser plus d'un sujet. Même avec des priorités, si votre processeur est attaché en traitant un message de priorité inférieure, il n'arrêtera pas ce qu'il fait.

Si vous avez des processeurs séparés, un message de haute priorité peut commencer le traitement dès qu'il peut être remis, sans attendre que d'autres messages soient traités.

Questions connexes