2011-10-13 17 views
1

有什麼方法可以阻止新的客戶端請求到servlet,直到舊的客戶端請求在servlet中完成執行爲止?我不想使用​​關鍵字,而是我想識別servlet中的每個請求線程。我怎樣才能做到這一點?識別Servlet中的每個請求線程

+2

我很難理解這個需求。你真的**想要在整個應用程序範圍內將servlet的使用限制爲1個併發請求嗎?或者您是否想在會話範圍內限制爲1個請求? (即每個瀏覽器會話1個同時請求)?無論如何,**爲什麼**?你的servlet不是線程安全的嗎?或者它是一項長期運行的工作,在完成之前不應該重新執行? – BalusC

+0

親愛的BalusC,我想要的是:,我如何識別每個線程來到我的servlet?並按照我喜歡的方式管理它們 – Tahani

+0

是的,我明白你在「如何實現這個解決方案?」中要求的*,但我不明白你真正需要的東西*,例如「什麼是合適的這個解決方案?「。功能要求完全不清楚。我不想發表如何實現完全錯誤解決方案的答案。 – BalusC

回答

0

乍一看,我猜應該可以在上下文中存儲一個bool。 任何到達的請求都會檢查context-bool(讓我們將其命名爲「bBusy」)。 第一個到達的請求設置它,並在處理它時重置它。 第二個到達的人檢查:如果第一個人仍在處理,它將被識別,然後它是由你的幻想會發生什麼... :)

我希望這是你在想什麼?編輯: 它必須是正確的上下文。我的Servlet時間在很久以前...我猜ApplicationContext? - 不確定,但你應該能夠自己找到它。

+0

你的想法很好,但是你的意思是在servlet上下文中存儲布爾值? – Tahani

+0

但是第二個問題呢,當我在web應用中使用關鍵字assert時,它不起作用:( – Tahani

+0

ServletContext是可能的。無論上下文是否被請求共享,我在一段時間內沒有對servlet做任何事情,所以對不起'布特我的褪色記憶 我不知道'布特斷言 - 問題你到達那裏,對不起。 – Fildor

0
  1. 在servlet或過濾器中使用synchronized關鍵字。在servlet方法,你可以寫:

     
    synchronized(this) { 
        //code handling the request that will be executed 
        //by only one thread/request at a time 
    } 
    

  2. 您可以使用一個對象,會爲你(根據您的需要)提供同步 - 見java.util.concurrent中

  3. 你可以嘗試使用不使用原語的線程同步算法。 (CS類通常會告訴這樣的算法)

  4. 您可以嘗試配置您的服務器以順序執行請求。 參見http://tomcat.apache.org/tomcat-6.0-doc/config/executor.html

+0

@Tahani寫道:「請做\ [no \] t要求我使用同步關鍵字」;) – Fildor

0

保持一個的AtomicBoolean /在ServletContext揮發性以同步塊可以達到的效果。另一種方法是使用SingleThreadModel接口(不建議使用),但它仍然會執行作業。

我仍然想知道爲什麼你想這樣做。

您可以在Web應用程序代碼(servlet等)中使用斷言。但請確保Web /應用程序服務器使用控制斷言的-ea或相應參數啓動。

+0

我怎樣才能確保服務器啓動與控制斷言的-ea或相應的參數。 – Tahani

+0

對於大多數服務器來說,它是啓動服務器時命令行的一部分。請參閱此鏈接以及http://www.coderanch.com/t/82690/Tomcat/enable-JDK-assertions-Tomcat –