LINUX.ORG.RU

Jetty, Continuations, почему так?


0

2
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package contiunation1;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.continuation.Continuation;
import org.eclipse.jetty.continuation.ContinuationSupport;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.AbstractHandler;

/**
 *
 * @author vertexua
 */

class RequestHandler extends AbstractHandler {
    
    List<Continuation> conts = Collections.synchronizedList(new ArrayList<Continuation>());
    
    @Override
    public void handle(String string, Request rqst, HttpServletRequest hsr, HttpServletResponse hsr1) throws IOException, ServletException {
        rqst.setContentType("text/html");
        hsr1.setStatus(HttpServletResponse.SC_OK);
        PrintWriter writer = hsr1.getWriter();
        
        if (string.endsWith("wakeup")) {
            synchronized(conts){
                System.out.println("begin");
                for (Continuation cc: conts){
                    System.out.println("Resuming "+cc);
                    cc.resume();
                }
                conts.clear();
                System.out.println("end");
                
            }
            writer.println("Woken up " + new Date());
            rqst.setHandled(true);
        } else {
            Continuation cc = ContinuationSupport.getContinuation(rqst);
            if (cc.isInitial()) {
                System.out.println("initial");
                writer.println("Hello world " + new Date());
                cc.suspend(hsr1);
                conts.add(cc);
            } else {
                System.out.println("resumed");
                writer.println(" Hello world " + new Date());
            }
            rqst.setHandled(true);
        }
        
    }
}

public class Contiunation1 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Server server = new Server(9999);
        server.setHandler(new RequestHandler());
        try {
            server.start();
        } catch (Exception ex) {
            Logger.getLogger(Contiunation1.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
   }
}

Этот код не совсем правильный, попрошу не придираться к мелочам, это такой экспериментальный Hello World. Если открыть три вкладки с разным URL, а потом зайти на /wakeup, то все три вкладки загружаются. Если зайти в трех вкладках на один URL, то работает совсем странно, /wakeup нужно вызвать 3 раза чтобы разбудить всех.

Вопросы: причем URL к Continuations? Как правильно такое написать?

★★★★★

Последнее исправление: vertexua (всего исправлений: 2)
Ответ на: комментарий от vertexua

Я бы на твоем месте смотрел на Grizzly и его ассинхронные фильтры. Эти континуешны через хаки реализованы. То, что творится какая-то чертворщина совершенно не удивительно.

dizza ★★★★★
()
Ответ на: комментарий от vertexua

Ну или вообще через Netty, это наверно будет самое труъ.

dizza ★★★★★
()
Ответ на: комментарий от dizza

Ненагуглилось, но позволяют ли они отправить запрос в стороннюю систему, оборвать выполение обработчика, а потом вызвать его продолжение когда прийдет результат? Все с целью освободить на время поток. Поток не используется, а дело делается

vertexua ★★★★★
() автор топика
Ответ на: комментарий от vertexua

На вскидку - да. Вот из javadoc:

Asynchronous Web Server servicing Servlet The example below delay the request processing for 10 seconds, without holding a thread.

        GrizzlyWebServer ws = new GrizzlyWebServer("/var/www");
        try{
            ws.addAsyncFilter(new AsyncFilter() {
                private final ScheduledThreadPoolExecutor scheduler = 
                        new ScheduledThreadPoolExecutor(1);
                public boolean doFilter(final AsyncExecutor asyncExecutor) {
                    //Throttle the request
                    scheduler.schedule(new Callable() {
                        public Object call() throws Exception {
                            asyncExecutor.execute();
                            asyncExecutor.postExecute();
                            return null;
                        }
                    }, 10, TimeUnit.SECONDS);

                    // Call the next AsyncFilter
                    return true;
                }
            });

            ServletAdapter sa = new ServletAdapter();
            sa.setRootFolder("/Path/To/Exploded/War/File");
            sa.setServlet(new MyServlet());
            ws.addGrizzlyAdapter(sa);

            ws.start();
        } catch (IOException ex){
            // Something when wrong.
        }

dizza ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.