- RESTEasy (6.2.11.Final)
- Jetty (12.0.15)
Есть ли способ предоставлять события SSE с помощью RESTEasy/JAX-RS, не удерживая поток в пуле потоков Jetty?
Код, реализующий SSE
Класс ресурсов для обработки подписок SSE и отправки событий подписчику каждую секунду:
Код: Выделить всё
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.Context;
import jakarta.ws.rs.sse.OutboundSseEvent;
import jakarta.ws.rs.sse.Sse;
import jakarta.ws.rs.sse.SseEventSink;
@Path("/events")
public class EventsResource {
@GET
@Produces("text/event-stream")
public void subscribe(@Context SseEventSink sink, @Context Sse sse) throws InterruptedException {
for (int i = 0; i < 100000; ++i) {
final OutboundSseEvent event = sse.newEventBuilder()
.name("message")
.data(String.class, i + ": Hello client!")
.build();
sink.send(event);
Thread.sleep(1000);
}
}
}
Код: Выделить всё
import java.util.HashSet;
import java.util.Set;
import jakarta.ws.rs.core.Application;
public class RestApplication extends Application {
/** {@inheritDoc} */
@Override
public Set> classes = new HashSet();
classes.add(EventsResource.class);
return classes;
}
}
Код: Выделить всё
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.ee10.servlet.ServletHolder;
import org.eclipse.jetty.server.Connector;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.ServerConnector;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
import org.example.rest.RestApplication;
import org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher;
public class Main {
public static void main(String[] args) throws Exception {
Server server = new Server(new QueuedThreadPool(5));
ServerConnector serverConnector = new ServerConnector(server);
serverConnector.setPort(8081);
server.setConnectors(new Connector[] { serverConnector });
ServletHolder servletHolder = new ServletHolder(new HttpServletDispatcher());
servletHolder.setInitParameter("jakarta.ws.rs.Application", RestApplication.class.getName());
ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
servletContextHandler.addServlet(servletHolder, "/*");
server.setHandler(servletContextHandler);
server.start();
server.join();
}
}
При подписке на SSE мы получаем:
Код: Выделить всё
% curl "http://localhost:8081/events" -H 'Accept: text/event-stream'
event: message
data: 0: Hello client!
event: message
data: 1: Hello client!
event: message
data: 2: Hello client!
...
Подробнее здесь: https://stackoverflow.com/questions/792 ... hread-pool
Мобильная версия