2010-09-02 4 views
1

S'il vous plaît un peu de conseil sur ce qui suit:Exécuteur transactionnel avec réessayer?

J'utilise un ThreadPoolTaskExecutor pour exécuter des tâches lentes externes comme l'envoi de courriels.

J'ai besoin d'améliorer ceci: 1) Quand une tâche est passée à l'exeuctor, elle doit attendre son exécution jusqu'à ce que la transaction soit terminée. Exemple: il est illogique d'envoyer un email lorsque le processus de commande échoue et génère une exception qui se produit lors de l'engagement

2) Lorsque la tâche échoue, un nouveau mécanisme est utilisé pour relancer la tâche. Exemple: lors de l'envoi de l'e-mail échoue, il sera réessayé après 5,10 minutes, puis déclenche une exception.

Comment faire face à ces problèmes? de devrais-je intégrer une file d'attente juste offre cette fonctionnalité ..

Ed

Répondre

1

Je dirais: oui utiliser une file d'attente dans une infrastructure de messagerie.

Personnellement j'utiliserais Camel pour cela parce que je suis complètement frappé par Camel et je l'utiliserais si je reprogrammais mon grille-pain pour griller les tranches dorées au petit-déjeuner.

Puisque vous allez envoyer du courrier, il sera basé sur un message de toute façon, donc l'utilisation d'un système basé sur un message réduira déjà la discordance d'impédance.

Maintenant, les choses comme les transactions, réessaye et garer le message sur une file d'attente de lettre morte vient en standard avec ces choses. C'est sympa, car vous pouvez ensuite écrire un script pour éviter les problèmes en cas de sinistre du serveur de messagerie, en renvoyant les messages de la file d'attente des lettres mortes.

L'intégration d'un ActiveMQ ou d'un Camel ajoute simplement quelques dépendances et 5 à 10 lignes dans votre configuration de ressort. Une fois qu'il est là, il est beau d'organiser le traitement en arrière-plan, notifier les systèmes distants, automatiser les réponses par e-mail, informer les administrateurs système d'une catastrophe imminente, ... Vous envoyez un message, continuez ce que vous faites, répondez au client , tandis qu'en arrière-plan les roues tournent.

Ok, désolé: je me suis laissé emporter et je suis devenu trop lyrique.

+0

Merci pour votre réponse rapide. Donc, basiquement, je n'ai pas besoin de démarrer un serveur de mise en file d'attente "séparé" mais plutôt d'ajouter quelques jar et il commencera automatiquement ... Je veux dire: je n'aime que le printemps et pas d'autres choses à tester simple ... – edbras

+0

Oui. Pour tester, ces choses sont des implémentations d'interfaces qui sont simples à se moquer. L'envoi d'un email est un composant standard dans Camel, il ne nécessite donc pas de tests unitaires, seuls des tests pour vérifier qu'il est correctement configuré. –

+0

Juste une chose: j'ai lu que Camel est très bon dans le trafic de routage. Outre le courrier électronique, je souhaite également exécuter du code (capturé dans un modèle de commande) qui établira une connexion HTTP pour récupérer certaines informations devant être placées dans la base de données locale. Camel est-il également bien adapté à ce type d'opérations? Donc, en gros: faites asynchroniser ces opérations et laissez-les réessayer en cas d'échec ... – edbras

Questions connexes