es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo habilitar el soporte de Async para Sling Servlet – Felix

Tengo este código

@Component(service = Servlet.class, scope = ServiceScope.PROTOTYPE, property={
    HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN+"/content/*",
    HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_ASYNC_SUPPORTED+"=true",
    HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ASYNC_SUPPORTED+"=true"}
    )
@SlingServletResourceTypes(
    resourceTypes="cq/Page",
    methods=HttpConstants.METHOD_GET,
    selectors = "asynctest",
    extensions="json")
public class ReactiveServlet extends HttpServlet {

    @Override
    protected void doGet(
        HttpServletRequest  request, HttpServletResponse response)
        throws ServletException, IOException {
        AsyncContext async = request.startAsync();
        // Alguna lógica
    }
}          

Al llamar a este servlet /content/mypage.asynctest.json entonces obtengo este error

java.lang.IllegalStateException: null
at org.apache.felix.http.base.internal.dispatch.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:338) [org.apache.felix.http.jetty:4.1.10]
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:369) [org.apache.felix.http.servlet-api:1.1.2]
at javax.servlet.ServletRequestWrapper.startAsync(ServletRequestWrapper.java:369) [org.apache.felix.http.servlet-api:1.1.2]
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El código intenta utilizar la característica de servlet asíncrono de la API Servlet para mejorar el rendimiento. Sin embargo, al llamar al servlet con la URL /content/mypage.asynctest.json, se produce una java.lang.IllegalStateException.

    Esta excepción se lanza debido a que se está llamando al método startAsync() en un contexto inapropiado. Específicamente, se está llamando después de que la respuesta ya ha sido recibida por el cliente, lo cual no está permitido. El método startAsync() debe ser llamado antes de que la respuesta sea enviada al cliente.

    Para solucionar este problema, asegúrese de que el método startAsync() se llame antes de escribir cualquier dato en la respuesta. Además, asegúrese de que la respuesta no se envíe hasta que se haya completado todo el procesamiento asíncrono.

Comments are closed.