Я создаю приложение реагирования на 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
React\Java EE SSE не завершается ⇐ JAVA
Программисты JAVA общаются здесь
1716344845
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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78515067/react-java-ee-sse-not-completing[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия