2012-01-19 1 views
1

J'ai une application Web (java, tomcat) qui permet aux utilisateurs de générer des rapports à l'aide de rapports Crystal. Le problème est que si un utilisateur demande un énorme rapport qui prend des heures pour terminer, mon application entière s'arrête. Y at-il un moyen d'arrêter une demande comme celle-ci, disons si après 5 minutes, il n'a pas été complet? Outre l'optimisation de la vitesse et la limitation des tailles de rapports, y a-t-il d'autres solutions de rechange?Arrêt d'une demande de serveur

+0

_Why_ que votre mouture de l'application à l'arrêt? –

+0

parce que la génération de rapports est monopolisant le processeur et les ressources memomey de tomcat je pense – ha1ogen

+1

Exécuter des rapports comme ceci sur un système transactionnel n'est pas une bonne idée - vous devriez penser à la refonte ... – home

Répondre

2

Je pense que vous n'exécutez pas la génération de rapport dans un autre thread. Il est préférable d'exécuter la génération de rapport dans un autre thread et d'envoyer un lien à l'utilisateur lorsqu'il est prêt.

Vous pouvez utiliser ExecutorService de java et définir un certain délai pour le thread et il expirera si cela prend plus que le temps que vous avez alloué pour cela.

Rechercher Java ExecutorService, Future, tutoriel appelable

Exemple de code:

Callable<Integer> callable = new CallableImpl(2); 
    ExecutorService executor = new ScheduledThreadPoolExecutor(5); 
    Future<Integer> future = executor.submit(callable); 
    Integer result = future.get(600,TimeUnit.seconds)); 
+0

merci, je vais jeter un oeil à cette – ha1ogen

1

Une autre approche consiste à exécuter la génération de rapport dans un thread distinct (ou peut-être en utilisant ExecutorService) et d'appeler Thread.interrupt() lorsque le temps de génération dépasse un certain seuil. Les chances sont que le thread sera interrompu s'il se bloque actuellement sur les E/S (réseau, base de données).