非同期コンテキストからのリクエストを完了しないと、タイムアウト時に元のリクエストが再度再生されるという Jetty の問題に直面しています。動作は次のとおりです。リクエストごとにタイムアウト付きの非同期リスナーを設定するため、2 つのスレッドが実行されJetty Thread1
ますThread2
。ここで、クライアントへのデータの書き込みがタイムアウトよりも長くかかるとしましょう。リクエストが完了していないため、タイムアウト スレッドがトリガーされ、誰かがデータを書き込んでいることを確認して、サイレントに戻ります。Jetty は黙って戻るのが好きではありません。リクエストをリプレイして、別のサービングおよびタイムアウト スレッドが作成され、データが書き込まれ、非同期コンテキストが完了するまで続行します。
問題のコードはこちら - In HttpChannelState
in expired()
method
if (aListeners!=null)
{
for (AsyncListener listener : aListeners)
{
try
{
listener.onTimeout(event);
}
catch(Exception e)
{
LOG.debug(e);
event.setThrowable(e);
_channel.getRequest().setAttribute(RequestDispatcher.ERROR_EXCEPTION,e);
break;
}
}
}
boolean dispatch=false;
synchronized (this)
{
if (_async==Async.EXPIRING)
{
_async=Async.EXPIRED;
if (_state==State.ASYNC_WAIT)
{
_state=State.ASYNC_WOKEN;
dispatch=true;
}
}
}
if (dispatch)
scheduleDispatch(); // <------------ dispatch again why
}