CXF に実装された REST API を公開する春のアプリがあります。SuspendedとともにAsyncResponseを使用したロング ポーリングを実装しようとしています。このコードを tomcat (maven プラグインまたはスタンドアロン) で実行すると、動作します。しかし、maven プラグイン (mvn jetty:run) を使用して jetty で同じコードを実行すると失敗します。CXF は NPE をスローします。私はそれをデバッグし、ContinuationProvider が要求に対して設定されていないことを確認しました。したがって、さらにデバッグすると、フィルターを適用する前に jetty 内部で Request オブジェクトの AsyncSupport ブール変数を false に設定し、最後にブロックで再度 true に設定していることがわかりました。ただし、フィルタ チェーンにはサーブレットも含まれているため、サーブレットは AsyncSupport false でリクエストを解釈します。
jetty maven プラグイン バージョン 9.1.3vxxxxxx ServletHandler.java from jetty codebase
@Override
public void doFilter(ServletRequest request, ServletResponse response)
throws IOException, ServletException
{
final Request baseRequest=(request instanceof Request)?((Request)request):HttpChannel.getCurrentHttpChannel().getRequest();
// pass to next filter
if (_filterHolder!=null)
{
if (LOG.isDebugEnabled())
LOG.debug("call filter " + _filterHolder);
Filter filter= _filterHolder.getFilter();
if (_filterHolder.isAsyncSupported())
filter.doFilter(request, response, _next);
else
{
final boolean suspendable=baseRequest.isAsyncSupported();
if (suspendable)
{
try
{
baseRequest.setAsyncSupported(false);
filter.doFilter(request, response, _next);
}
finally
{
baseRequest.setAsyncSupported(true);
}
}
else
filter.doFilter(request, response, _next);
}
return;
}
フィルタ チェーンにサーブレットが含まれているのはなぜですか? doFilter の前に reuest が変更されるのはなぜですか? jetty maven plugin で動作させるにはどうすればよいですか?