package kr.debop4j.web.examples.async; import com.google.common.base.Charsets; import kr.debop4j.core.tools.StringTool; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.nio.client.DefaultHttpAsyncClient; import org.apache.http.nio.client.HttpAsyncClient; import org.apache.http.util.EntityUtils; 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; import java.io.PrintWriter; import java.util.concurrent.Future; /** * examples.async.AsyncLoadPage * * @author 배성혁 ( sunghyouk.bae@gmail.com ) * @since 13. 2. 17. */ @Slf4j @WebServlet(urlPatterns = "/async", asyncSupported = true) public class AsyncLoadPage extends HttpServlet { private static final long serialVersionUID = 8839854702079067625L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { AsyncContext asyncContext = req.startAsync(req, resp); AsyncLoadResource asyncTask = new AsyncLoadResource(asyncContext, "http://daum.net"); asyncContext.start(asyncTask); } public static class AsyncLoadResource implements Runnable { private final AsyncContext ctx; private final String url; public AsyncLoadResource(final AsyncContext ctx, final String url) { this.ctx = ctx; this.url = url; } @Override public void run() { // To change body of implemented methods use File | Settings | File Templates.if (log.isDebugEnabled()) log.debug("URI=[{}] 의 웹 컨텐츠를 비동기 방식으로 다운로드 받아 캐시합니다.", url); try { String responseStr; HttpAsyncClient httpClient = new DefaultHttpAsyncClient(); httpClient.start(); HttpGet request = new HttpGet(url); Future<HttpResponse> future = httpClient.execute(request, null); HttpResponse response = future.get(); responseStr = EntityUtils.toString(response.getEntity(), Charsets.UTF_8.toString()); httpClient.shutdown(); if (log.isDebugEnabled()) log.debug("URI=[{}]로부터 웹 컨텐츠를 다운로드 받았습니다. responseStr=[{}]", url, StringTool.ellipsisChar(responseStr, 255)); ctx.getResponse().setCharacterEncoding("UTF-8"); PrintWriter writer = ctx.getResponse().getWriter(); writer.write(responseStr); writer.close(); ctx.complete(); } catch (Exception ignored) { throw new RuntimeException(ignored); } } } }