3

(サーブレット内の)接続レートを特定の外部サービスに制限する必要があったため、ScheduledExecutorServiceを試してみることにしました。スケジューリング自体は問題なく機能しているように見えますが、出力が出力されるのはたまにしかありません。ほとんどの場合、何も出力されません。なぜそんなことが起こるのですか?テストサーバーとしてTomcat7を使用しています。

int waitingtimeinmilliseconds = 5000;

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();

ScheduledFuture scheduledFuture = scheduledExecutorService.schedule() {

    public void run() {

        Fetcher fetcher = new Fetcher(loginname, password);
        List<Item> items = fetcher.fetchItems();
        // do something with the results

        //ServletOutputStream
        out.print("teststring" + items.size());

    }

}, waitingtimeinmilliseconds, TimeUnit.MILLISECONDS);
scheduledExecutorService.shutdown();
4

1 に答える 1

2

問題の原因についての非常に網羅的な説明は、次の場所にあります。HttpServletResponseは定期的に時期尚早に送信しているようです(また、サーブレットで新しいスレッドを開始することも確認してください)。

基本的に、外部スレッドを使用してサーブレット出力に書き込むことはできません。doGet()/を離れるdoPost()と、サーブレットコンテナは完了したと見なし、クライアントにフラッシュした後に出力を破棄します。ただし、ストリームに非同期で書き込んでいるため、出力が通過する場合もあれば、破棄される場合もあります。

レート制限を非常にスケーラブルにしたい場合は、asyncサーブレット(3.0以降)を検討してください。一部のクライアントを抑制したいだけの場合は、RateLimiterから1が機能します。

1-RateLimiterを参照-私のブログでGoogleGuavaを発見。

于 2012-10-08T21:45:17.773 に答える