springmvc 비동기 요청 처리 예시
springmvc3.2 이후 비동기 요청을 지원하여 controller에서 Callable 또는 DeferredResult를 되돌려줍니다.Callable로 돌아갈 때 대략적인 실행 과정은 다음과 같습니다.
springmvc 비동기 설정 요청
1. 웹에서 필요합니다.xml + servlet 3.0 scheme 라이브러리
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
...
</web-app>
2. 웹에서.xml의 servlet 및 filter 추가
<!-- springMVC Servlet -->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:META-INF/dispatcher-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!-- -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<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>
3. 그리고 컨트롤러에서 비동기 요청을 실행할 수 있습니다Callable을 사용하여 비동기식 요청을 수행하고 보기로 돌아갑니다.
@RequestMapping("/mvc25")
public Callable<String> mvc25() {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "task/task";
}
};
}
Callable를 이용하여 비동기적인 요청을 실행하고 요청 결과를 @response를 통해 httpmessageconverter로 전환하여 클라이언트에게 되돌려줍니다.
@RequestMapping("/mvc26")
@ResponseBody
public Callable<String> mvc26() {
return new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
return "hello task";
}
};
}
클라이언트 시간 초과 사용자 정의 가능
@RequestMapping("/mvc27")
@ResponseBody
public WebAsyncTask<String> mvc27() {
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(10000);
return "hello task";
}
};
return new WebAsyncTask<String>(10000, callable);
}
루틴을 실행하는 과정에서 이상이 발생하면 일반적인 요청과 같이 @ExceptionHandler로 처리하거나 전역적인 HandlerExceptionResolver를 정의하여 처리할 수 있습니다
@RequestMapping("/mvc28")
@ResponseBody
public Callable<String> mvc28() {
Callable<String> callable = new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(2000);
throw new RuntimeException();
}
};
return callable;
}
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public JSONObject handlerException(){
JSONObject jsonObject = new JSONObject();
jsonObject.put("aaa", 123);
return jsonObject ;
}
또한 DeferredResult로 되돌아갈 수 있습니다. DeferredResult의 역할은 다른 라인에 실례를 되돌려 이 비동기적인 요청을 처리하는 것입니다.
@RequestMapping("/mvc29")
@ResponseBody
public DeferredResult<String> mvc29() {
DeferredResult<String> deferredResult = new DeferredResult<String>();
dealInOtherThread(deferredResult);
return deferredResult;
}
private void dealInOtherThread(DeferredResult<String> deferredResult) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
deferredResult.setResult("hello task");
}
dealInOtherThread 처리가 완료되면 setResult가 발생할 때springmvc에서 Request를 Dispatcher Servlet에 분배한 다음, Dispatcher Servlet이 DeferredResult의 결과를 처리하고 보기를 되돌려줍니다.DeferredResult는 또 다른 반환을 제공하여 스레드 요청을 처리합니다. 예를 들어 onTimeout(Runnable)과 onCompletion(Runnable)입니다. onTimeout은 스레드 리셋을 등록할 수 있습니다. 요청이 지연될 때의 리셋 함수이고, onCompletion은 요청이 끝난 리셋 함수를 등록할 수 있습니다.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
springmvc application/octet-stream problemmistake: Source code: Solution: Summarize: application/octet-stream is the original binary stream method. If the convers...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.