2010-09-22 3 views
1

Je travaille sur un récepteur JMS multithread et un code éditeur. Un message XML est reçu d'une file d'attente, les procédures stockées (70 secondes à exécuter) sont appelées et la réponse est envoyée à la rubrique dans les 90 secondes. Je dois gérer une condition lorsque le courtier est en panne. c'est-à-dire une condition dans laquelle les messages sont reçus de la file d'attente et sont en cours de traitement dans java, pendant ce temps à la fois la file d'attente et le sujet seront en panne. Ensuite, comment gérer ces messages qui ne sont pas dans la file d'attente et ne pas envoyer au sujet, mais sont en mémoire java? Différentes options disponibles:Application JMS multithread

1.Pour utiliser CLIENT_ACKNOWLEDGE 2.Pour séparer le code éditeur du code récepteur. 3.To ont une utilité d'erreur qui prendra des messages du journal et de les traiter et envoyer à la rubrique (moins préféré)

S'il vous plaît me suggérer la bonne option

Répondre

3

Utilisez une session traitées. Consommez le message et envoyez la réponse sous une seule unité de travail et appelez explicitement COMMIT après avoir envoyé la réponse. Ensuite, si le courtier meurt pendant que la transaction est en cours, le message d'entrée sera annulé. Si vous incluez la mise à jour de la base de données dans une transaction coordonnée en deux phases, celle-ci peut également être annulée. Cela nécessite que le consommateur et le répondeur soient dans le même thread, car JMS étend les sessions par thread, mais vous pouvez avoir plusieurs threads exécutant des sessions en parallèle. Sachez que l'ouverture de nombreuses transactions pendant 90 secondes peut nécessiter une optimisation du courtier.

+1

Je crois que si la session a été traitée, le mode d'accusé de réception (par exemple CLIENT_ACKNOWLEDGE) est ignoré :) –

+0

Oui, je pense avec mon chapeau WMQ. Nous définissons généralement CLIENT_ACKNOWLEDGE dans l'objet géré car il doit être défini sur * quelque chose * et cela indique à quiconque le lit que le code doit être explicitement validé. Cependant, du point de vue du JMS, cela ne fait rien. J'ai modifié cela dans ma réponse. +1 pour la bonne prise. –

+0

Merci beaucoup! si au lieu de connection.createSession (false, javax.jms.Session.CLIENT_ACKNOWLEDGE), j'utiliser connection.createSession (true, javax.jms.Session.CLIENT_ACKNOWLEDGE); alors la session est traitée et le mode d'accusé de réception est ignoré. Après avoir envoyé la réponse à Sujet, je vais commettre() la session. Ma question est que si la session est annulée en cas d'exception (comme le courtier et la réponse ne peut pas être envoyée au sujet) alors ce message existe toujours dans la file d'attente quand le courtier est de retour après 10 minutes alors ce message est toujours en file d'attente? – Jyoti

1

Une solution consiste à utiliser db pour une procédure stockée intermédiaire. Ainsi, les étapes seraient:

1. Consume Message from Queue and store into db and use Client_Acknowledge. 
2. Run stored procedures on the consumed message. 
3. Once the procedure is over, send message from db to the topic. 
4. Delete message once acknowledgement is recieved. 

Si la file d'attente et le sujet va vers le bas entre les deux, il vous suffit d'envoyer un message à nouveau lorsque la reconnaissance est pas reçu de ce sujet. Eh bien, je ne sais pas si c'est la meilleure alternative et je veux voir comment la communauté répond à cette question.

+0

qu'est ce que db? base de données ? – Jyoti

+0

oui ... je veux dire stocker le message dans la base de données. –

+0

le stockage de message dans la base de données n'est pas réalisable, besoin d'appeler la procédure stockée à partir de Java uniquement (certaines contraintes de base de données) – Jyoti