Соединения Server-Sent-Events (SSE) исчерпывают пул потоков JettyJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Соединения Server-Sent-Events (SSE) исчерпывают пул потоков Jetty

Сообщение Anonymous »

Мы пытаемся реализовать события, отправленные сервером (SSE), используя
  • RESTEasy (6.2.11.Final)
  • Jetty (12.0.15)
но у нас возникла проблема: каждая подписка SSE использует и удерживает поток в пуле потоков Jetty. в течение всего срока действия подписки.
Есть ли способ предоставлять события 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;
}
}
Наконец, у нас есть основной класс, в котором мы запускаем Jetty с нашим приложением, и минимальный пул потоков из 5 потоков:

Код: Выделить всё

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();
}
}
Исчерпание пула потоков Jetty
При подписке на 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!

...
Если мы запустим две параллельные команды Curl, пул потоков Jetty будет исчерпан, и третий запрос зависнет в ожидании потока.

Подробнее здесь: https://stackoverflow.com/questions/792 ... hread-pool
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»