2

Spring MVCコントローラーの最新の非同期機能をテストしようとしていますが、動作させることができませんでした。

これが私の非同期メソッドのコードです:

@RequestMapping(value = "/hello")
    public Callable<String> async(final Model model) {
        System.out.println("entered async controller method");
        return new Callable<String>() {
            public String call() throws Exception {
                Thread.sleep(2000L);
                model.addAttribute("message", "asyncRequest dealt with");
                System.out.println("about to return from call()");
                return "hello";
            }
        };
}

web.xmlの関連部分は次のとおりです。

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

ただし、「call()から戻るところ」がコンソールに出力されることはなく、次のようなログが表示されることもありません。08: 25: 17[MvcAsync1]WebAsyncManager-...コンソールで...

参考までに、Spring3.2.RC2を使用しています

4

3 に答える 3

6

async-support実装をさらに構成するにはAsyncTaskExecutor

デフォルトでは、Spring MVCはを使用してSimpleAsyncTaskExecutor、コントローラーメソッドによって返されるCallableインスタンスを実行します。AsyncTaskExecutor本番環境では、環境に合わせて適切に構成された実装に置き換える必要があります。

AsyncTaskExecutorを作成します

<beans:bean id="asyncTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <beans:property name="corePoolSize" value="5" />
    <beans:property name="maxPoolSize" value="10" />
    <beans:property name="queueCapacity" value="25" />
</beans:bean>

次に、を割り当てますtask-executor

<mvc:annotation-driven >
    <mvc:async-support default-timeout="30000" task-executor="asyncTaskExecutor" />
</mvc:annotation-driven>

http://blog.springsource.org/2012/05/10/spring-mvc-3-2-preview-making-a-controller-method-asynchronous/

于 2013-07-27T02:14:52.413 に答える
2

私はついに私のサンプルが機能しなかった理由を見つけました:web-mvc構成ファイルに以下を追加する必要があります:

<mvc:annotation-driven>
    <mvc:async-support default-timeout="3000"/>
</mvc:annotation-driven>
于 2012-11-30T20:02:32.867 に答える
0

こんにちは、次のコードで同様のアプリケーションを実行しています:

public String doSlowWork() {

     System.out.println("Start  slow work");
    try {
      Thread.sleep(3000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    System.out.println("finish slow work");

    return "index";       // return view's name
  }

インデックスを返しますが、メソッドのログ情報は提供しません

于 2015-09-28T08:49:38.293 に答える