package kr.debop4j.web.async; import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import javax.servlet.AsyncContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 비동기 방식으로 작업을 수행하는 Servlet의 기본 클래스입니다. * <b /> * 서블릿에서 여러 작업이 동시에 이루어지던가, 네트웍이나 파일 작업이 주로 하는 경우 비동기 방식을 사용하면 확장성에 좋다. * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 2. 19 */ @Slf4j @WebServlet( asyncSupported = true ) public abstract class AsyncServletBase extends HttpServlet { private static final long serialVersionUID = 3628741189209483408L; @Getter @Setter private AsyncServletRunnable asyncDoGet; @Getter @Setter AsyncServletRunnable asyncDoPost; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final AsyncServletRunnable getHandler = getAsyncDoGet(); if (getHandler == null) return; if (log.isDebugEnabled()) log.debug("비동기 방식으로 get method를 처리합니다..."); final AsyncContext asyncCtx = req.startAsync(req, resp); AsyncServletRunnable asyncRun = new AsyncServletRunnable() { @Override public void run() { try { getHandler.setAsyncContext(asyncCtx); getHandler.run(); } catch (Exception e) { log.error("비동기 방식으로 GET 메소드를 처리하는 동안 예외가 발생했습니다.", e); throw new RuntimeException(e); } finally { asyncCtx.complete(); } } }; if (log.isDebugEnabled()) log.debug("비동기 방식으로 GET method 처리를 시작했습니다..."); asyncCtx.start(asyncRun); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { final AsyncServletRunnable postHandler = getAsyncDoPost(); if (postHandler == null) return; if (log.isDebugEnabled()) log.debug("비동기 방식으로 POST method를 처리합니다..."); final AsyncContext asyncCtx = req.startAsync(req, resp); AsyncServletRunnable asyncRun = new AsyncServletRunnable() { @Override public void run() { try { postHandler.setAsyncContext(asyncCtx); postHandler.run(); } catch (Exception e) { log.error("비동기 방식으로 POST 메소드를 처리하는 동안 예외가 발생했습니다.", e); throw new RuntimeException(e); } finally { asyncCtx.complete(); } } }; if (log.isDebugEnabled()) log.debug("비동기 방식으로 POST method 처리를 시작했습니다..."); asyncCtx.start(asyncRun); } }