2010-07-29 2 views
3

J'ai besoin de générer un rapport avec Java (exportant des données d'Oracle) qui peut prendre plusieurs minutes, par la quantité de données impliquées, donc quand je soumets mon formulaire, l'écran se bloque jusqu'à ce qu'il se termine.Java EE Soumettre un formulaire et laisser fonctionner le processus d'arrière-plan?

Comment puis-je générer le rapport dans un processus d'arrière-plan, afin que l'utilisateur puisse continuer à naviguer?

JMS? Comment puis-je faire cela avec JMS? (Tout exemple ou explication est le bienvenu)

Existe-t-il un autre moyen? Quelle serait la meilleure option selon la spécification Java EE?

Répondre

1

Oui, JMS peut être une option. Vous envoyez simplement un message à une file d'attente, et un Message Driven Bean - un type particulier d'EJB - reçoit et traite le message. Le message agit dans ce cas comme une commande. Vous pouvez utiliser JMS sans Message Driven Bean, mais c'est un peu plus compliqué. Si vous êtes dans un environnement EJB 3.1, essayez asynchronous EJB.

Sinon, bien que cela ne soit pas recommandé par la spécification, vous pouvez démarrer un thread dans le conteneur Web. Vous pouvez soit démarrer un thread par tâche, soit démarrer/arrêter un thread d'arrière-plan dans un ServletContextListener, qui traite les commandes que vous stockez, par exemple, dans une table d'une base de données. L'utilisation de tâches asynchrones est superficiellement très simple, mais pour la production, vous devrez réfléchir à la manière de gérer les erreurs, surveiller la progression, réessayer les tâches échouées, s'assurer que deux tâches identiques ne s'exécutent pas en même temps, etc. a sa propre force et faiblesse. Portez aussi attention à la stratégie dont vous avez besoin pour les transactions (JMS est traité, je ne sais pas exactement pour EJB 3.1., Et le thread personnalisé et la table de base de données peuvent être traités si vous faites les choses correctement avec la transaction JDBC ou UserTransaction).

Espérons que ça aide.

+0

Salut merci pour la réponse, et désolé de ma réponse tardive, je vais essayer. mais y at-il de toute façon à consulter l'état du processus asynchrone ? – ErVeY