스프링 mvc의 비동기 요청 처리

spring mvc3.2 및 상기 버전에서 요청에 대한 비동기 처리를 추가했고 servlet3를 바탕으로 봉인되었습니다.
1. 웹을 수정합니다.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
...
</web-app>
1.1, 성명 version="3.0", 성명 웹-app_3_0.xsd
1.2 servlet 또는 filter 설정을 위한 비동기식 지원: true, WEB 응용 프로그램의 웹 수정.xml

<!-- spring mvc -->
<servlet>
<servlet-name>SpringMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>...</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
2. controller 클래스가 async를 지원하도록 하기
2.1,java로 돌아갑니다.util.concurrent.비동기식 처리를 위한 Callable

package org.springframework.samples.mvc.async;
 
import java.util.concurrent.Callable;
 
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.async.WebAsyncTask;
 
@Controller
@RequestMapping("/async/callable")
public class CallableController {
  @RequestMapping("/response-body")
  public @ResponseBody Callable<String> callable() {
 
    return new Callable<String>() {
      @Override
      public String call() throws Exception {
        Thread.sleep(2000);
        return "Callable result";
      }
    };
  }
 
  @RequestMapping("/view")
  public Callable<String> callableWithView(final Model model) {
 
    return new Callable<String>() {
      @Override
      public String call() throws Exception {
        Thread.sleep(2000);
        model.addAttribute("foo", "bar");
        model.addAttribute("fruit", "apple");
        return "views/html";
      }
    };
  }
 
  @RequestMapping("/exception")
  public @ResponseBody Callable<String> callableWithException(
      final @RequestParam(required=false, defaultValue="true") boolean handled) {
 
    return new Callable<String>() {
      @Override
      public String call() throws Exception {
        Thread.sleep(2000);
        if (handled) {
          // see handleException method further below
          throw new IllegalStateException("Callable error");
        }
        else {
          throw new IllegalArgumentException("Callable error");
        }
      }
    };
  }
 
  @RequestMapping("/custom-timeout-handling")
  public @ResponseBody WebAsyncTask<String> callableWithCustomTimeoutHandling() {
 
    Callable<String> callable = new Callable<String>() {
      @Override
      public String call() throws Exception {
        Thread.sleep(2000);
        return "Callable result";
      }
    };
 
    return new WebAsyncTask<String>(1000, callable);
  }
 
  @ExceptionHandler
  @ResponseBody
  public String handleException(IllegalStateException ex) {
    return "Handled exception: " + ex.getMessage();
  }
 
}

2.2 비동기 처리가 완료되면 org로 돌아갑니다.springframework.web.context.request.async.DeferredResult JMS 또는 AMQP 메시지, Redis 알림 등의 추가 스레드:

@RequestMapping("/quotes")
@ResponseBody
public DeferredResult<String> quotes() {
 DeferredResult<String> deferredResult = new DeferredResult<String>();
 // Add deferredResult to a Queue or a Map...
 return deferredResult;
}
  
// In some other thread...
deferredResult.setResult(data);
// Remove deferredResult from the Queue or Map
3.spring 프로필 수정
spring mvc의 dtd 성명은 3.2보다 커야 합니다

<mvc:annotation-driven>
<!--  ,  -->
  <mvc:async-support default-timeout="3000"/>
</mvc:annotation-driven>
실제 사용 예:

function deferred(){
  $.get('quotes.htm',function(data){
    console.log(data);
    deferred();// , , 
  });
}
이렇게 하면 웹 서버의 연결 탱크가 장기적으로 점용되어 성능 문제를 일으키는 것을 피할 수 있다. 호출된 후에 웹이 아닌 서비스 라인을 생성하여 처리하고 웹 서버의 흡수량을 증가시킨다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기