Подтвердить что ты не робот

Сервер Apache MINA закрывает активный сеанс UDP через 60 секунд

Мое клиент-серверное приложение работает с Apache MINA как на стороне клиента, так и на стороне сервера. Отправка данных через UDP работает нормально, но через минуту сервер закрывает соединение (или MINA-путь - "сеанс" ) и перестает отвечать.

Странная часть заключается в том, что соединение активно все время. Клиент отправляет данные каждые 1000 мс, а сервер отвечает на них с теми же данными. Я нашел механизм MINA для уничтожения неактивных сеансов ExpiringMap, он получил значение по умолчанию для сеанса time-to-live public static final int DEFAULT_TIME_TO_LIVE = 60; но я не нашел способ изменить его или лучше, обновить время для жизни для сеансов.

Imho, время жизни должно автоматически обновляться с каждым входящим пакетом, но я не мог найти что-то, почему не работает мой сервер. Должен ли я сказать, что я не хочу, чтобы он уничтожал сеанс или что?

Мой код очень похож на учебники MINA:

СЕРВЕР

IoAcceptor acceptor = new NioDatagramAcceptor();
try {
    acceptor.setHandler( new UDPHandler() );
    acceptor.bind( new InetSocketAddress(RelayConfig.getInstance().getUdpPort()) );

    acceptor.getSessionConfig().setReadBufferSize( 2048 );
    acceptor.getSessionConfig().setIdleTime( IdleStatus.BOTH_IDLE, IDLE_PERIOD );
    System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: initialized!");
} catch (IOException e) {
    System.out.println("RELAY ["+RelayConfig.getInstance().getId()+"]: failed: "+e.getLocalizedMessage());
    //e.printStackTrace();
}

КЛИЕНТ

NioDatagramConnector connector = new NioDatagramConnector();
connector.getSessionConfig().setUseReadOperation(true);

handler = new UDPHandler();
connector.setHandler(handler);
connector.getSessionConfig().setReadBufferSize(2048);

// try to connect to server!
try {
    System.out.println("Connecting to " + relayIP + ":" + port);
    ConnectFuture future = connector.connect(new InetSocketAddress(relayIP, port));
    future.addListener(new IoFutureListener<IoFuture>() {

        public void operationComplete(IoFuture future) {
            ConnectFuture connFuture = (ConnectFuture)future;
            if( connFuture.isConnected() ){
                UDPClient.setSession(future.getSession());

                Timer timer = new Timer("MyTimerTask", true);
                timer.scheduleAtFixedRate(new MyTimerTask(), 1000, 1000);  // My message is written here every 1000ms
            } else {
                log.error("Not connected...exiting");
            }
        }
    });
    future.awaitUninterruptibly();
} catch (RuntimeIoException e) {
    System.err.println("Failed to connect.");
    e.printStackTrace();
    System.exit(1);
} catch (IllegalArgumentException e) {
    System.err.println("Failed to connect. Illegal Argument! Terminating program!");
    e.printStackTrace();
    System.exit(1);
}

Для получения дополнительной информации напишите в комментариях.

EDIT: К сожалению, у меня больше нет доступа к этому серверу, но тогда проблема не была решена. Если есть кто-нибудь другой, у кого есть такая же проблема и решить проблему, сообщите нам.

4b9b3361

Ответ 1

Я провел некоторое исследование и нашел ссылку ниже. Возможно, вам нужно будет явно установить опцию разъединения на false, но есть еще одна опция для reset параметра таймаута. Тайм-аут 30000 составляет 30 секунд, 60000 - 60 секунд и т.д. Эти решения взяты из MINA2. Было непонятно, используете ли вы эту или более старую версию. Из этого вы должны иметь возможность добавить вызов, который реализует определенный набор параметров при открытии UDP-порта.

Документация MINA2