2010-06-09 7 views
2

J'ai besoin d'exécuter certaines tâches de manière asynchrone après l'appel d'une méthode EJB. Ce besoin semble être satisfait dans EJB 3.1 mais malheureusement nous ne sommes pas encore là et nous devons utiliser la version 3.0.EJB et traitement asynchrone

Que suggérez-vous comme le moyen le plus simple et y at-il des mises en garde? Je peux penser aux approches suivantes:

  • JMS (peut-être overkill)
  • TimerService (semble assez simple)
  • Spring TaskExecutor (comment est-ce configuré)

Cela doit travailler un seul serveur Weblogic. Il n'y aura pas de charge énorme ou de traitement parallèle massif, je veux juste que ce soit simple et agréable.

Répondre

2

Vous devez d'abord décider si vous souhaitez que la transaction asynchrone soit traitée ou non. C'est-à-dire, si la transaction de méthode EJB régulière échoue, la chose asynchrone est-elle toujours déclenchée ou non.

JMS et TimerService sont transactionnels. Un printemps TaskExecutor, n'est probablement pas (je devrais vérifier cela).

Avec Timer vous pouvez retarder l'exécution (même avec 0) de la chose de sorte qu'après le retour de la méthode EJB, la chose asynchrone s'exécute alors immédiatement en arrière-plan. Si la chose asynchrone échoue, le service de minuterie essaie de la relancer plusieurs fois.

Avec JMS, vous n'avez pas de contrôle strict sur le moment où la chose sera traitée. Une fois le message envoyé, vous savez qu'il sera traité, mais le courtier est théoriquement libre de reporter son traitement pour gérer la charge.

Je ne connais pas votre cas d'utilisation particulier, mais en utilisant TimerServicesemble un bon ajustement si la charge n'est pas un souci, et il est facile à utiliser.

+0

TimerService semble le plus facile, mais d'après ce que j'ai lu, il ne donne pas beaucoup de garanties sur la précision et je préférerais commencer le processus immédiatement si possible. – yedd

+0

@yedd D'après ma propre expérience dans Glassfish, vous pouvez configurer quelques valeurs pour l'intervalle d'interrogation et de relivraison pour les temporisateurs expirés http://docs.sun.com/app/docs/doc/820-7695/beahw?l=fr&n = 1 & a = vue. Nous l'avions configuré avec une précision de 1 seconde, et cela a bien fonctionné. Je suppose qu'il y a quelque chose de similaire dans weblogic. Vous pouvez essayer de réduire l'intervalle afin qu'il devienne suffisamment "immédiat" pour vous. – ewernli

2

Le WorkManager est conçu à cette fin et est supporté nativement par WebSphere et WebLogic. Il existe également d'autres implémentations pour d'autres serveurs d'applications.

Il est conçu pour effectuer un travail asynchrone tout en permettant au serveur de gérer les unités d'exécution.

+0

Pourrait essayer, il semble que Spring a même une implémentation TaskExecutor pour cela. Je ne m'occupe pas vraiment de la portabilité maintenant. – yedd

Questions connexes