2011-11-04 10 views
17

Javaサーブレットは複数のリクエストを同時に処理していますが、私はStackOverflowとGoogleを検索しました。しかし、私は今はかなり混乱しています。私は、ブロック動作を示すような単純なサーブレットを書いています。サーブレットは複数の同時ブラウザリクエストを同期して処理しているようです

ので、私は簡単なサーブレットがあります。そして、私は2つのブラウザウィンドウを持って

public class MyServlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 2628320200587071622L; 

    private static final Logger logger = Logger.getLogger(MyServlet.class); 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
     logger.info("[doGet] Test before"); 

     try { 
      Thread.sleep(60000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     logger.info("[doGet] Test after"); 

    resp.setContentType("text/plain"); 
    resp.getWriter().write("OK"); 

    } 
} 

を、私は私のサーブレットをヒット〜同時に開きます。 その結果、最初の要求が2番目の要求をブロックします。ログも示しています

10:49:05,088 [http-8383-Processor14] INFO MyServlet - [doGet] Test before 
10:50:05,096 [http-8383-Processor14] INFO MyServlet - [doGet] Test after 
10:50:05,106 [http-8383-Processor22] INFO MyServlet - [doGet] Test before 
10:51:05,112 [http-8383-Processor22] INFO MyServlet - [doGet] Test after 

私は何か...同時リクエストを処理することができるようになってサーブレットをしないのですように私は感じるが、それはそれをやっているように見えるdoes notの。私はdoGetの代わりにサービスメソッドについても上記と同じことを行い、同じことをします。

任意のポインタ?

ありがとうございました

+1

お使いのブラウザは要求をシリアル化する可​​能性があります。これを2台の異なるコンピュータまたは2台の異なるブラウザから試すとどうなりますか? (つまりiexploereとfirefox)HTTPアクセスログをチェックして、リクエストがサーブレットコンテナに同時に到着しているかどうかを確認することもできます。 – rsp

+0

'web.xml'と(これはtomcatと仮定して)' server.xml'を表示できますか? – beny23

+0

@beny:問題の原因を理解するうえで、それがどの程度正確に役立つかはわかりません。あなたは精緻化できますか? – BalusC

答えて

25

お使いのブラウザは、明らかに異なるウィンドウで同じHTTP接続を使用しています。サーブレットコンテナは、HTTPリクエストごとではなく、HTTP接続ごとに1つのスレッドを使用します。これを正しくテストするには、2つの物理的に異なるWebブラウザーを実行する必要があります。例えば。 1つのFirefoxと1つのChrome

+0

****************************************************************************************************** 2つの要求は異なるスレッドで処理されますが、実際にはサーバーごとに単一スレッドの要求**ポリシーが適用されるのに対し、クライアント側ではHTTPパイプラインなしで同じTCP接続が使用されます(ブラウザで待ち行列に入れられますか?)これは異なるスレッドが関わっているにもかかわらず順次処理を説明するでしょう –

+0

@BalusC:このスレッドを汚染するのではなく、別のスレッドを発生させることを検討しました。参照してください - http://stackoverflow.com/questions/37360731/how-does-a-servlet-container-synchronise-access-for-multiple-requests-to-a-parti –

関連する問題