Я думаю, что ваш код не работает в 100% случаев, потому что он вызывается в методе destroy, который не ожидает и закрывает все, включая открываемые сетевые подключения. Таким образом, иногда, если сеть работает медленно, апплет вместе с его выходными потоками уничтожается до того, как он отправит сообщение о выходе на сервер.
Если моя теория верна, вы, вероятно, можете проверить ее.
- Попробуй посмотреть, получаешь ли ты команду выхода из системы в журналах сервера (в случае сбоя). Я верю, что вы обнаружите, что команда не прибыла.
- Открыть консоль Java на стороне клиента. Вы, вероятно, получите IOException или SocketException. Я надеюсь, что изучение исключения может дать вам представление о том, как улучшить решение.
Дополнительно я бы предложил следующее.
- Добавление прослушивателя сеанса сервлета на стороне сервера и автоматический выход из системы по окончании сеанса.
- Уменьшите время жизни HTTP-сессии до разумного числа. Значение по умолчанию для JBoss составляет 20 минут, поэтому установите его на 1 минуту.
- Реализуйте механизмы поддержки активности из вашего апплета. Это может быть очень просто. Просто выполняйте HTTP GET каждые 30 секунд для специального URL, который ничего не делает. Это поддержит вашу сессию.
Это решение должно быть дополнением к существующему решению, которое работает в 3/4 раза.
Надеюсь, это поможет. Удачи.