programing

servlets 3.0 API에서의 비동기 지원을 이해할 수 없습니다.

copysource 2023. 3. 26. 14:21
반응형

servlets 3.0 API에서의 비동기 지원을 이해할 수 없습니다.

저는 Java SE 출신입니다.서블릿 튜토리얼을 몇 개 하고 헤드퍼스트 JSP & 서블릿을 읽었습니다.지금 비동기 지원에 대한 JavaWorld.com 기사를 읽고 있는데 잘 모르겠습니다.

단순 비동기란 무엇입니까?Ajax와 Servlet Async의 차이점은 무엇입니까?

p.s 저는 Ajax를 사용한 PHP 배경을 가지고 있으며 컨셉은 알고 있지만 Java를 사용한 것은 아닙니다.

기존 Servlet 모델에서는 일반적으로 1개의 요청이 1개의 스레드에 해당합니다.

일반적으로 이러한 스레드는 Servlet 컨테이너에 의해 관리되는 풀에서 가져옵니다.Servlet 컨테이너는 이 풀에 사용 가능한 스레드가 있는 경우에만 새 요청을 처리할 수 있습니다.자신의 코드가 요청을 처리하는 동안 쓰레드는 비어 있지 않습니다.

상황에 따라서는 이 모델을 깨는 것이 가치가 있을 수 있습니다.이러한 Servlet 컨테이너 관리 스레드를 통해 요청이 Servlet에 도착하면 코드가 비동기 실행을 요청합니다.그런 다음 Servlet 요청에서 돌아오면 컨테이너 스레드가 해방됩니다.

동기 요구 처리와 달리, 이것은 응답을 커밋하지 않고 연결을 닫지 않습니다.대신 비동기 콘텍스트를 다른 스레드풀로 넘겨주면 해당 콘텍스트를 픽업할 수 있으며, 일부 스레드가 처리 가능한 경우 해당 콘텍스트를 처리하여 응답에 쓸 수 있습니다.

예:

@WebServlet(urlPatterns = "/somepath", asyncSupported = true)
public class AsyncServlet extends HttpServlet {

    @EJB
    private AsyncBean asyncBean;

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        AsyncContext asyncContext = request.startAsync();

        // The following line will not block and return immediately
        asyncBean.doAsyncStuff(asyncContext);

    } // Shortly after this method has ended, thread will be returned to pool
}

를 사용하여AsyncBean다음과 같이 구현됩니다.

@Stateless
public class AsyncBean {

    @Asynchronous
    public void doAsyncStuff(AsyncContext asyncContext) throws IOException {
        asyncContext.getResponse().getWriter().write("test");
    }
}

위의 코드에서, 당신이 에서 돌아온 직후의 어딘가에서AsyncServlet#doGet()메서드. Servlet 스레드가 풀로 반환됩니다.실행을 위한 '요청'(태스크)AsyncBean#doAsyncStuff()는 EJB 스레드 풀을 픽업하기 위해 큐에 배치됩니다.

이것을 사용하는 이유와 시기에 대한 답은 그리 간단하지 않습니다.스레드만 보존하려면 위의 경우 스레드 풀 하나를 다른 스레드 풀로 교환해야 하며(이 경우 Servlet 풀 대 EJB 비동기 풀) 순이익은 그다지 크지 않습니다.서블릿 스레드 풀에 여분의 스레드를 추가해도 됩니다.

그러나 고급 시나리오에서는 요청을 보다 세밀하게 관리하여 여러 작업으로 나누고 스레드 풀에서 이러한 작업을 처리할 수 있습니다.예를 들어 라운드 로빈이 한 번에 100KB를 보내는 10MB 파일에 대해 10개의 스레드로 처리되는 100개의 다운로드 요청을 상상해 보십시오.

또 다른 애플리케이션은 외부 시스템으로부터의 데이터를 대기해야 하는 요구로, 이 외부 시스템이 요청자에게 릴레이할 수 있는 메시지를 전송할 수 있는 경우입니다.즉, 응답을 기다리는 다른 스레드가 필요하므로 데이터베이스 호출은 의미가 없습니다.그런 다음 한 스레드를 다른 스레드로 다시 바꾸게 됩니다.그러나 수신 전자 메일을 기다려야 하는 경우 하나의 스레드가 전자 메일을 대기하고 일시 중단된 요청으로 릴레이할 수 있습니다.

언급URL : https://stackoverflow.com/questions/10065553/i-dont-understand-async-support-in-servlets-3-0-api

반응형