Я использую WebSocket для обеспечения связи между двумя автономными банками. Первый запускает встроенный Jetty и развертывает WebSocket, а второй - клиент Jetty WebSocket, который отправляет команды и ждет обработки серверной части.Как обнаружить соединение, потерянное с помощью Jetty WebSocket
Сервер:
import java.io.IOException;
import javax.websocket.*;
@ClientEndpoint
@ServerEndpoint(value = "/websocket-api", encoders = { NotificationEncoder.class }, decoders = { NotificationDecoder.class })
public class APIWebsocket {
private static final Logger log = LoggerFactory.getLogger(APIWebsocket.class);
@OnOpen
public void open(Session session) {
log.info("Session opened...");
}
@OnClose
public void close(Session session) throws IOException {
session.close();
log.info("Session closed !");
}
@OnError
public void onError(Throwable error) {
log.error("Error during websocket session : {}", error.getMessage());
log.debug("{}", error);
}
@OnMessage
public void handleMessage(String message, Session session) {
log.info("Message received : {}", message);
List<Data> datas = JSONHelper.toCollection(message);
for (Data data : datas){
// do process with average time 30sec...
// send notification of processing
Notification unitNotification= new Notification("PROCESSED");
session.getBasicRemote().sendObject(unitNotification);
}
// Build and send end notification message
Notification endProcessNotification = new Notification("END OF PROCESS");
session.getBasicRemote().sendObject(endProcessNotification);
} catch (EncodeException | IOException e) {
log.error(e.getMessage(), e);
// Manage error
} finally {
try {
session.close();
} catch (IOException e) {
log.error(e.getMessage(), e);
// Manage error
}
}
}
}
Клиент:
import java.io.IOException;
import java.net.URI;
import org.eclipse.jetty.websocket.api.Session;
import org.eclipse.jetty.websocket.api.WebSocketAdapter;
import org.eclipse.jetty.websocket.client.WebSocketClient;
public class WebsocketClient extends WebSocketAdapter {
private static final Logger log = LoggerFactory.getLogger(WebsocketClient.class);
private Session session = null;
public APIWebsocketClient(String uri) {
try {
WebSocketClient client = new WebSocketClient();
client.setMaxIdleTimeout(35 * 1000L);
client.start();
client.connect(this, new URI(uri)).get();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public void startProcess(String datas) {
try {
session.getRemote().sendString(datas);
} catch (IOException e) {
log.error(e.getMessage(), e);
}
}
@Override
public void onWebSocketText(String message) {
log.info("Message received : {}", message);
}
@Override
public void onWebSocketClose(int statusCode, String reason) {
log.info("Websocket closed ! [statusCode={}, reason={}]", statusCode, reason);
this.session.close();
}
@Override
public void onWebSocketConnect(Session session) {
this.session = session;
log.info("Websocket Client details : {}-{}", session.getLocalAddress().getHostName(), session
.getLocalAddress().getAddress().getHostAddress());
}
@Override
public void onWebSocketError(Throwable cause) {
log.error("Error during websocket execution : {}", cause.getMessage(), cause);
if (this.session != null) {
this.session.close();
}
}
}
Моя цель состоит в том, чтобы обнаружить, если сеть связи теряется между клиентом и сервером. Если я смоделирую потерю сети, отключив сетевой провод, WebSocket должен обнаружить ошибку связи на сервере и на стороне клиента.
У вас есть идеи, как я могу продолжить обнаружение потери сети между клиентом и сервером?
Серверная часть выполняет несколько операций обработки и должна отправлять состояние каждой обработки отдельно (вы можете проверить обновленный исходный код сервера) В настоящее время, когда я пытаюсь имитировать потерю сетевого соединения, часть сервера продолжает делать его обработка и возвращает все к возобновлению соединения, если webscoket еще не закрыт. Мой вопрос: почему к потере соединения, событие @OnError не уволено? Когда вы говорите «Это Java», вы имели в виду, что мы должны добавить нашу логику для обработки потери связи? –
Потеря сетевого соединения в java обнаруживается только при выполнении фактического сетевого ввода-вывода. если соединение (и попытки использования соединения) простаивают, то нет события, указывающего на потерю соединения. –