Пробуждение спящего потока с помощью SSE EventSource listener

#java #multithreading #server-sent-events

#java #многопоточность #отправленные сервером события

Вопрос:

У меня многопоточное приложение. Предполагается, что каждый поток прослушивает потоковые данные и обрабатывает события из потока.

Метод run() в настоящее время выглядит следующим образом :

 public void run() {

    Client client ClientBuilder.newBuilder().register(SseFeature.class).build();
    WebTarget target = client.target("https://stream.example.com/");

    org.glassfish.jersey.media.sse.EventSource eventSource = 
            new org.glassfish.jersey.media.sse.EventSource(target) {

        @Override
        public void onEvent(InboundEvent inboundEvent) {
            System.out.println(inboundEvent.getName()  " :: "   threadId);

            ...

        }
    };


    while (true) {

        try{
            Thread.sleep(500L); 
        }catch(InterruptedException e){
            ...
        }           
    }
}
  

Чего я хотел бы достичь, так это того, что поток спит как можно дольше и будет пробужден только тогда, когда в потоке появится событие. Таким образом, большинство моих потоков могут спать и избегать загрузки процессора. Я не уверен, что когда поток находится в спящем режиме с использованием Thread.sleep(), событие пробуждается. В конце концов, EventSource listener находится в том же потоке, который был переведен в спящий режим.

Итак, мой вопрос по сути заключается в том, есть ли способ, которым EventSource может пробудить поток?

Ответ №1:

Кажется, что следующее сделало свое дело .. поскольку eventInput.read() должен блокироваться до тех пор, пока не появится что-то для чтения.

 public void run() {
    Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
    WebTarget target = client.target("https://stream.example.com/");

    EventInput eventInput = target.request().get(EventInput.class);
    while (!eventInput.isClosed()) {
        final InboundEvent inboundEvent = eventInput.read();
        if (inboundEvent == null) {
            // connection has been closed
            break;
        }

        onEvent(inboundEvent);          
    }
}

protected void onEvent(InboundEvent inboundEvent) {
     ....
}