4

サーブレット リクエストに含まれるデータに基づいて、複数の出力テキスト データ ファイルを作成しようとしています。私のサーブレットに対する制約は次のとおりです。

  • 私のサーブレットは、ファイルを生成する前に、しきい値 (たとえば、ファイル内の 20 個の名前) に達するのに十分な数の要求を待機します。
  • そうしないと、1 分後にタイムアウトになり、ファイルが生成されます

私が書いたコードは次のようなものです:

  1. doGet同期されていません

  2. その中でdoGet、新しいスレッドプールを作成しています(サーブレットへの呼び出し元のアプリケーションは、サーブレットが応答を返すまで次の要求を送信しないため、要求を検証し、新しい要求を取得するために即時の確認応答を返します)

  3. すべてのリクエスト データを、新しいスレッド プールで作成されたスレッドに渡します

  4. 同期関数を呼び出して、スレッドのカウントとファイルの印刷を行う

を使用してwait(60000)います。問題は、コードが 1 分以内に (名前の) 正しいしきい値を持つファイルを生成することですが、1 分のタイムアウトの後、生成されたファイル (ごく少数) が容量を超えていることです。容量。

ウェイクアップ時に問題を引き起こしているスレッドと関係があると思いますか?

私のコードは

if(!hashmap_dob.containsKey(key)){
request_count=0;
hashmap_count.put(key, Integer.toString(request_count));

sb1 = new StringBuilder();
sb2 = new StringBuilder();
sb3 = new StringBuilder();

hashmap_dob.put(key, sb1);
hashmap_firstname.put(key, sb2);    
hashmap_surname.put(key, sb3);
                }

if(hashmap_dob.containsKey(key)){
    request_count = Integer.parseInt(hm_count.get(key));
    request_count++;
    hashmap_count.put(key, Integer.toString(request_count));
    hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));  
                }


          hashmap_dob.get(key).append(dateofbirth + "-");
    hashmap_firstname.get(key).append(firstName + "-");
    hashmap_surname.get(key).append(surname + "-");


    if (hashmap_count.get(key).equals(capacity)){

        request_count = 0; 

    dob = hashmap_dob.get(key).toString();
    firstname = hashmap_firstname.get(key).toString();
    surname = hashmap_surname.get(key).toString();

    produceFile(required String parameters for file printing);

    fileHasBeenPrinted = true;
    sb1 = new StringBuilder();
    sb2 = new StringBuilder();
    sb3 = new StringBuilder();

    hashmap_dob.put(key, sb1);
    hashmap_firstname.put(key, sb2);
    hashmap_surname.put(key, sb3);
    hashmap_count.put(key, Integer.toString(request_count));
    hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));
            }
    try{

    wait(Long.parseLong(listenerWaitingTime)); 


        }catch (InterruptedException ie){
            System.out.println("Thread interrupted from wait");
            }

    if(hashmap_filehasbeenprinted.get(key).equals("false")){

    dob = hashmap_dob.get(key).toString();
    firstname = hashmap_firstname.get(key).toString();
    surname = hm_surname.get(key).toString();

    produceFile(required String parameters for file printing );

    sb1 = new StringBuilder();  
    sb2 = new StringBuilder();
    sb3 = new StringBuilder();
    hashmap_dob.put(key, sb1);
    hashmap_firstname.put(key, sb2);
    hashmap_surname.put(key, sb3);
    fileHasBeenPrinted= true;
    request_count =0;
    hashmap_filehasbeenprinted.put(key, Boolean.toString(fileHasBeenPrinted));

    hashmap_count.put(key, Integer.toString(request_count));
            }

ここまで来たら、私の質問を読んでくれてありがとう。解決に向けて何か考えがあれば、事前に感謝します!

4

3 に答える 3

1

私の理解によると、次の 2 つの状況で新しいファイルを作成/生成する必要があります。

  • 事前定義されたしきい値に達したリクエストの数。
  • しきい値タイムアウトが完了します。

次のことをお勧めします。

  1. APPLICATION-SCOPED 変数: HttpServletRequest のオブジェクトを含む requestMap を使用します。
  2. サーブレットがヒットするたびに、受信したリクエストをマップに追加するだけです。
  3. ここで、requestMap の値を監視するために、適切なリスナー/フィルター requestMonitor を作成します。
  4. RequestMonitor は、requestMap が事前定義されたしきい値に達したかどうかを確認する必要があります。
  5. そうでない場合は、サーブレットがリクエスト オブジェクトを追加できるようにする必要があります。
  6. ある場合は、ファイルを出力し、requestMap を空にし、サーブレットが次のリクエストを追加できるようにする必要があります。
  7. タイムアウトについては、APPLICATION_SCOPE の LAST_FILE_PRODUCED 変数を使用して、最後のファイルがいつ生成されたかを確認できます。これは、ファイルが生成されるたびに更新する必要があります。
于 2013-07-26T11:57:47.287 に答える
1

コードを読み取ろうとしましたが、多くの情報が不足しているため、詳細を教えてください。

1) インデントがめちゃくちゃで、コードをコピーしたときに間違いがあったかどうかわかりません。

2) あなたが投稿しているコードは何ですか? doGet の後に他のスレッドで呼び出されるコードは?

3) 変数宣言を追加することもできます。それらはスレッドセーフなタイプ (ConcurrentHashMap) ですか?

4) fileHasBeenPrinted に関するすべての情報があるかどうかはわかりません。また、スレッドセーフではないブール値のようです。

5)「同期」機能について話しますが、それらを含めませんでした。

編集

コピーしたコードが同期されたメソッドである場合、つまり、多くの要求がある場合、特定の時間に実行されるのはそのうちの 1 つだけです。60秒の待機は常に呼び出されるようです(インデントでは明確ではありませんが、ファイルが書き込まれるかどうかに関係なく、常に60秒の待機があると思います)。したがって、別のスレッド (要求) が処理される前に、同期されたメソッドを 60 秒間ロックします。20 を超えるリクエストが 60 秒以内に到着する可能性があるため、20 のリクエストの後にファイルを書き込んでいない理由を説明できます。

于 2013-07-26T12:47:33.983 に答える