0

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 で動作させるにはどうすればよいですか?

4

1 に答える 1

0

問題が見つかりました。すべてのリクエストに対してフィルタ(Log4jServletFilter)を自動的に登録する Log4jServletContainerInitializer を使用していました。ここでの問題は、使用していたバージョンにありました。Log4j2.0-beta-9 (問題あり)、問題は、Log4jServletFilter が登録されたときに AsyncSupport (つまり、async-supported true) に登録されなかったことです。そこで、問題を解決した log4j2.0-rc1 にアップグレードしました。:)

于 2014-05-19T07:02:46.953 に答える