2017-10-07 16 views
0

私はサーバーのファイルシステムからビデオをストリーミングしようとしています。 SpringからStreamingResponseBodyを使用してレスポンスとして返されます。だから私はストリーミングを非同期に処理しなければならない。 私はweb.xmlとSpring MVCの設定方法について多くの研究を行いました。私はこの簡単なチュートリアルに従いました:http://shengwangi.blogspot.de/2015/09/asynchronous-spring-mvc-hello-world.html しかし残念ながら成功しません! "非同期サポートは、サーブレットと非同期リクエスト処理に関連するすべてのフィルタで有効にする必要があります。これは、サーブレットAPIを使用するJavaコード、またはサーブレットとフィルタ宣言に" true "を追加することで行われます。 web.xml "とは言いましたが、私はすべてのことを正しく行いました。 は、ここにweb.xmlでの私のサーブレット構成だServlet 3 Spring MVCでの非同期サポートが機能しません。

<servlet> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>/WEB-INF/mvc-config.xml</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
     <async-supported>true</async-supported> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcherServlet</servlet-name> 
     <url-pattern>/</url-pattern> 
    </servlet-mapping> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/application-context.xml</param-value> 
    </context-param> 
    <context-param> 
     <param-name>spring.profiles.active</param-name> 
     <param-value>production</param-value> 
    </context-param> 
    <filter> 
     <filter-name>encodingFilter</filter-name> 
     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
     <init-param> 
      <param-name>encoding</param-name> 
      <param-value>UTF-8</param-value> 
     </init-param> 
     <init-param> 
      <param-name>forceEncoding</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </filter> 
    <filter-mapping> 
     <filter-name>encodingFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>ASYNC</dispatcher> 
    </filter-mapping> 
    <filter> 
     <display-name>springSecurityFilterChain</display-name> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>ASYNC</dispatcher> 
    </filter-mapping> 

Spring MVCの構成のコードsnipt:以来、私は任意の助けに感謝

@GetMapping("/videos/play") 
    public StreamingResponseBody stream(@RequestParam("code") String code, @RequestParam("locale") String locale) throws FileNotFoundException{ 
     File video = videoService.getVideo(code, locale); 
     final InputStream videoInputStream = new FileInputStream(video); 
     return (outputStream) -> { 
      copyToStream(videoInputStream, outputStream); 
     }; 
    } 
private void copyToStream(final InputStream is, OutputStream os) 
      throws IOException { 
     byte[] data = new byte[2048]; 
     int read = 0; 
     while ((read = is.read(data)) > 0) { 
      os.write(data, 0, read); 
     } 
     os.flush(); 
    } 

:ここ

<mvc:annotation-driven> 
    <mvc:async-support default-timeout="30000" task-executor="taskExecutor"> 
    </mvc:async-support> 
</mvc:annotation-driven> 
<bean id="taskExecutor" 
     class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> 
    <property name="corePoolSize" value="5" /> 
    <property name="maxPoolSize" value="50" /> 
    <property name="queueCapacity" value="10" /> 
    <property name="keepAliveSeconds" value="120" /> 
</bean> 

が要求ハンドラです私は3日前に苦労している! 私はTomcat8.0とSpring 4.3.6を使用しています

答えて

0

私はそれがTomcat 7または8のバグであることを示唆する多くのスレッドを読んでいますが、例外ではありません。すべてのフィルタで有効にする。私はそれをやろうとしましたが、問題はweb.xmlファイルのフィルターに非同期サポートを追加した方法でした。 私がやったことは

<filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>ASYNC</dispatcher> 
</filter-mapping> 

次これは実際にマッピングがASYNC要求(私は推測)受け入れることを伝えているが、それは、フィルタ自体に非同期サポートを有効にしません。 springSecurityFilterChain定義がなるようしたがって、各フィルタ定義では、我々は、非同期のサポートを有効にする必要があります。

<filter> 
    <display-name>springSecurityFilterChain</display-name> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    <async-supported>true</async-supported> 
</filter> 
+0

こんにちは - 私は同様の問題に直面し、フィルタの装飾を追加するソリューションを試してみましたよ。しかし、エラーが発生しました - org.springframework.beans.factory.NoSuchBeanDefinitionException: 'springSecurityFilterChain'という名前のBeanはありませんplsは私をガイドできますか? – csharpnewbie

関連する問題