#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) {
....
}