React\Java EE SSE не завершаетсяJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 React\Java EE SSE не завершается

Сообщение Anonymous »

Я создаю приложение реагирования на Java среднего уровня и пытаюсь заставить работать серверные события (SSE). Я добился определенного успеха, но есть несколько деталей, которые вызывают у меня затруднения. Самая большая проблема — возможность вызова onComplete. Я думал, что если я закрою источник событий, который вызовет onComplete, и мы сможем удалить запрос из очереди текущих запросов, но, похоже, этого не происходит. Единственное, о чем я могу думать, это отправить отдельный запрос на что-то, что меняет значение в другом классе, что итератор проверит, следует ли удалить пользователя из очереди, но должен быть какой-то другой способ обнаружить этот eventSource. закрыто. Я нашел много информации о asyncListener, но ничего о том, как его вызвать. Кажется, это происходит только после того, как срабатывает сообщение о тайм-ауте.
Вторая проблема заключается в том, что если произойдет тайм-аут, и мы откроем другой источник событий, он не сможет получить обратно какие-либо данные. Он запускается, записывает и очищает данные, но ничего не возвращается во внешний интерфейс, пока мы не выполним повторное развертывание. Я не совсем уверен, в чем причина, хотя я поигрался с тем, как называются переменные, и не могу добиться согласованности. Будем благодарны за любую помощь.
Вот код реакции:
import React, { useState, useEffect } from 'react';
import { messages } from '../../helpers/toastMessages';
import { readCookie } from '../../helpers/readCookie';
import { icons } from '../universal/icons';

const SSEReceiver = ({ personID }) => {
const { showSuccess, showError } = messages;
const [notifList, setNotifList] = useState([]);

useEffect(() => {
const eventSource = new EventSource(`http://localhost:8080/MyApp/mySSE?PersonID=${personID}`);

eventSource.onopen = () => {
showSuccess('Connected to SSE server.');
console.log('Connection to SSE server opened.');
};

eventSource.onmessage = (event) => {
try {
const msg = JSON.parse(event.data);
setNotifList(prevList => [...prevList, msg]);
} catch (error) {
showError('Error parsing SSE message.');
console.error('Error parsing SSE message:', error);
}
};

eventSource.onerror = (error) => {
eventSource.close();
showError('Failed to connect to SSE server.');
console.error('EventSource failed:', error);
};

return () => {
eventSource.close();
console.log('Connection to SSE server closed.', eventSource.readyState);
};

}, [personID]);

return (

);
};

export default SSEReceiver;

Вот мой Java-сервлет:
@WebServlet(urlPatterns = {"/mySSE"}, asyncSupported = true)
public class MyServletSSE extends HttpServlet {

private final Queue ongoingRequests = new ConcurrentLinkedQueue();
private ScheduledExecutorService service;

@Override
public void init(ServletConfig config) throws ServletException {
final Runnable notifier = new Runnable() {
@Override
public void run() {
final Iterator iterator = ongoingRequests.iterator();
//not using for : in to allow removing items while iterating
DataCheck dc = DataCheck.getInstance();
dc.GetNewNotif();
PrintWriter out;
String check = "None";
int PersonID = 0;
while (iterator.hasNext()) {

AsyncContext ac = iterator.next();
final ServletResponse res = ac.getResponse();
PersonID = Integer.parseInt(ac.getRequest().getParameter("PersonID"));
res.setCharacterEncoding("UTF-8");

try {
out = res.getWriter();
if(dc.getTheString() != null){
check = dc.getTheString();
}
org.json.simple.JSONObject main = new org.json.simple.JSONObject();
ongoingRequests.remove(ac);
String next = "data: " + check + " num of clients = " + ongoingRequests.size() + " PersonID: " + ac.getRequest().getParameter("PersonID") + "\n\n";

out.write(next);
out.flush();

if (out.checkError()) { //checkError calls flush, and flush() does not throw IOException
iterator.remove();
}
} catch (IOException ignored) {
iterator.remove();
}
}
}
};
service = Executors.newScheduledThreadPool(10);
service.scheduleAtFixedRate(notifier, 1, 3, TimeUnit.SECONDS);
}

@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) {
res.setContentType("text/event-stream");
res.setCharacterEncoding("UTF-8");

final AsyncContext ac = req.startAsync();
ac.setTimeout(60 * 1000);
ac.addListener(new AsyncListener() {
@Override public void onComplete(AsyncEvent event) throws IOException {ongoingRequests.remove(ac);}
@Override public void onTimeout(AsyncEvent event) throws IOException {ongoingRequests.remove(ac);}
@Override public void onError(AsyncEvent event) throws IOException {ongoingRequests.remove(ac);}
@Override public void onStartAsync(AsyncEvent event) throws IOException {}
});
ongoingRequests.add(ac);
}
}


Подробнее здесь: https://stackoverflow.com/questions/785 ... completing
Ответить

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

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

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

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

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