2012-02-13 83 views
2

我在Tomcat 7中部署了一個Web應用程序,並且其中一個事務正在將文本文件加載到應用程序中,然後應用程序將逐行讀取它,然後將所有記錄插入數據庫。在Tomcat中取消請求

我想在頁面上放一個取消按鈕,讓用戶決定是否想要取消交易,特別是如果他們正在上傳大文件。我正在考慮只是把一個鏈接,到另一個頁面作爲取消按鈕。這會工作嗎?

如果客戶端上傳一個15MB的文件(需要大約10分鐘的時間才能處理),然後決定通過點擊我提供的作爲取消按鈕的鏈接取消它,線程是否會繼續?

回答

1

一旦文件上傳到服務器,啓動一個線程進行處理並在某處存儲引用(如Hashtable)併爲其指定一個唯一的ID。然後使用取消按鈕將頁面呈現給用戶,並存儲您之前使用的ID以保持對頁面中的線程的引用。

當用戶單擊取消時,返回到Hashtable,獲取帶有ID的線程併發送消息以使其停止導入。

當然,您的方法會阻止線程導入數據,因此需要考慮當前數據庫事務,以確保不會使數據庫處於無效狀態。

+0

因此如果用戶只要點擊我提供的鏈接上的線不會取消? – JZares 2012-02-13 07:49:19

+0

我認爲@Jf Beaulac暗示的是您在Servlet/Endpoint上編寫了一個額外的方法(取消方法),該方法將ID作爲參數。如果用戶使用該ID調用該方法,則取消該事務。 – blong 2012-02-14 17:12:30

0

我認爲不可能停止傳輸到服務器的請求。一旦你點擊上傳你發出一個HTTP請求,並且過程開始並且稍後點擊「提供的cancel/link u」將會是一個不同的HTTP請求,並且由於HTTP是無狀態的,它不知道什麼發生了什麼,停止。如預期的那樣,這是不可能的。但是現在可能有些事情可以做到,我現在還不知道。但是,如果您按「Esc」鍵將終止發送到服務器的請求。而且,因爲這是唯一的解決方案至今然後在UI上你可以寫這段JavaScript代碼:

$('.your_link').click(function(){ 
     window.stop(); 
    }); 

window.stop()將無法在IE瀏覽器。 IE瀏覽器,你可以使用:

document.execCommand("Stop");