Apache Mina Idle Monitor - PullRequest
       43

Apache Mina Idle Monitor

2 голосов
/ 03 апреля 2012

Я разрабатывал свое первое приложение на основе TCP / Socket с Apache Mina, это выглядит великолепно и легко для выполнения задач.Я просто хочу задать вопрос о Mina.

Сервер навязывает простоя в 5 секунд прервет соединение с сокетом, поэтому мы должны периодически отправлять пульс (эхо-сообщение / keepalive), чтобы убедиться, что соединениев живых.Вроде механизм активности.

Есть один способ, которым мы отправляем вслепую эхо / сердцебиение непосредственно перед каждыми 5 секундами.Я думаю, должен быть умный / интеллектуальный способ «Idle Monitor», если я отправляю свое деловое сообщение и не прихожу в режим простоя, то есть 5 секунд, я не должен выдавать сердцебиение.Сообщение сердцебиения будет отправлено, если все соединение бездействует, поэтому мы экономим полосу пропускания и быстрое чтение и запись в сокет.

Заранее спасибо всем, кто любит эту концепцию и пытается найти решение.

Ответы [ 3 ]

4 голосов
/ 05 апреля 2012

Вы можете достичь этого, используя Keep Alive Filter (уже присутствует в минах).

В качестве альтернативы, вы можете добиться более разумного способа отправки эхо / сердцебиения, установив время ожидания простоя сеанса клиента немного меньше, чем время простоя сервера. Например:

Для серверной стороны

NioSocketAcceptor.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 5);

и для клиентской части это будет

NioSocketConnector.getSessionConfig().setIdleTime(IdleStatus.BOTH_IDLE, 3);

Теперь, если нет связи, скажем, в течение 3 секунд, sessionIdle будет запущен на стороне клиента (и не будет запущен на стороне сервера, поскольку время ожидания составляет 5 секунд), и вы можете отправить эхо. Это сохранит сессию живой. Эхо будет отправлено, только если сеанс бездействует.

Примечание: Я предполагаю, что во время простоя сеанса сеанс закрывается на стороне сервера. Если все наоборот, вам нужно будет переключить значения времени ожидания простоя сеанса (например, 3 секунды для сервера и 5 секунд для клиента), и эхо будет отправлено с сервера.

1 голос
/ 03 апреля 2012

Я не уверен, что полностью понимаю ваш вопрос, но вы можете отправить пульс в переопределенном методе sessionIdle IoHandlerAdapter.Вам не нужно обязательно закрывать сеанс только потому, что Mina на стороне сервера вызывает Idle.Что касается более интеллектуального способа поддержания активного соединения между Сервером и Клиентом без такого сердечного ритма, я никогда не слышал об этом.

Вот интересное прочтение того, как Microsoft обрабатывает их сердцебиение в ActiveSync .Я лично использовал эту методологию при использовании mina в моем клиент-серверном приложении.Надеюсь, это поможет вам.

0 голосов
/ 02 июля 2015

(надеюсь, я правильно понял вопрос)

У меня были проблемы с поддержанием моего сеанса, и этот вопрос возник в результатах поиска 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)

...