Apache Mina Idle Monitor
Я разрабатывал свое первое приложение на основе TCP/Socket с помощью Apache Mina, оно выглядит великолепно и его легко выполнять. Я просто хочу задать вопрос о Мине.
Сервер навязывает время простоя 5 секунд, прервет соединение с сокетом, поэтому мы должны периодически отправлять тактовые импульсы (эхо-сообщение / keepalive), чтобы убедиться, что соединение активно. Вроде механизм активности.
Есть один способ, которым мы отправляем вслепую эхо / сердцебиение перед каждыми 5 секундами. Я думаю, должен быть умный / интеллектуальный способ "Idle Monitor", если я отправляю свое деловое сообщение и не прихожу в режим простоя, то есть 5 секунд, мне не следует выдавать сообщение "heartbeat". Сообщение сердцебиения будет отправлено, если все соединение бездействует, так что мы экономим пропускную способность и быстрое чтение и запись на сокете.
Заранее спасибо всем, кто любит эту концепцию и пытается дать решение.
3 ответа
Вы можете добиться этого, используя Keep Alive Filter (уже присутствует в минах).
В качестве альтернативы, вы можете добиться более разумного способа отправки эхо / сердцебиения, установив время ожидания простоя сеанса клиента немного меньше, чем время простоя сервера. Например:
Для серверной части
NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);
и на стороне клиента это будет
NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);
Теперь, если нет связи, скажем, в течение 3 секунд, sessionIdle будет запущен на стороне клиента (и не будет запущен на стороне сервера, так как время ожидания составляет 5 секунд), и вы можете отправить эхо. Это сохранит сессию живой. Эхо будет отправлено, только если сеанс бездействует.
Примечание. Я предполагаю, что во время простоя сеанса сеанс закрывается на стороне сервера. Если это не так, вам нужно будет переключить значения времени простоя сеанса (например, 3 секунды для сервера и 5 секунд для клиента), и эхо будет отправлено с сервера.
(Надеюсь, я правильно понял вопрос)
У меня были проблемы с поддержанием моего сеанса, и этот вопрос возник в результатах поиска Google, поэтому я надеюсь, что кто-то еще сочтет его полезным:
@Test
public void testClientWithHeartBeat() throws Exception {
SshClient client = SshClient.setUpDefaultClient();
client.getProperties().put(ClientFactoryManager.HEARTBEAT_INTERVAL, "500");
client.start();
ClientSession session = client.connect("localhost", port).await().getSession();
session.authPassword("smx", "smx").await().isSuccess();
ClientChannel channel = session.createChannel(ClientChannel.CHANNEL_SHELL);
int state = channel.waitFor(ClientChannel.CLOSED, 2000);
assertTrue((state & ClientChannel.CLOSED) == 0);
channel.close(false);
client.stop();
}
(Источник: https://issues.apache.org/jira/browse/SSHD-185)
Я не уверен, что полностью понимаю ваш вопрос, но вы можете отправить пульс в переопределенном методе sessionIdle IoHandlerAdapter. Вам не нужно обязательно закрывать сеанс только потому, что Mina на стороне сервера вызывает Idle. Что касается более интеллектуального способа поддерживать активное соединение между Сервером и Клиентом без такого сердечного ритма, я никогда не слышал об этом.
Вот интересное прочтение того, как Microsoft обрабатывает их сердцебиение в ActiveSync. Я лично использовал эту методологию при использовании mina в моем клиент-серверном приложении. Надеюсь, это поможет вам.