2012-01-19 234 views
1

我有一個web應用程序(java,tomcat),它允許用戶通過水晶報告生成報告。問題是如果用戶請求一個需要幾個小時才能完成的巨大報告,我的整個應用程序就會停下來。有沒有辦法阻止這樣的請求,比如5分鐘後它還沒有完成?除了優化速度和限制報告大小外,還有其他解決方法嗎?停止服務器請求

+0

_Why_您的應用程序停頓下來? –

+0

,因爲報告生成佔用CPU和tomcat的memomey資源我認爲 – ha1ogen

+1

在事務處理系統上運行這樣的報告不是一個好主意 - 你應該考慮重新設計... – home

回答

2

我認爲你沒有在另一個線程中運行你的報告生成。最好在另一個線程中運行報告生成,並在準備就緒時將鏈接發回給用戶。

您可以使用java的ExecutorService併爲線程設置一些超時,如果超過分配給它的時間,它將過期。

搜索Java的ExecutorService的,未來的,可贖回教程

示例代碼:

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

謝謝我會看看這個 – ha1ogen

1

另一種方法是在單獨的線程中運行報告生成(或者可能使用ExecutorService),並在生成時間超過某個閾值時調用Thread.interrupt()。如果當前阻塞I/O(網絡,數據庫),線程將被中斷。