Jmeter в распределенном режиме: JVM не останавливается из-за сервера BeanShell - PullRequest
0 голосов
/ 26 ноября 2018

ЧТО Я ИМЕЮ :

Сеть Jmeter, созданная для испытаний в распределенном режиме: один мастер Jmeter и несколько подчиненных Jmeter.Сервер BeanShell отключен.Все работает отлично.

ЧТО Я ХОЧУ ДЕЛАТЬ :

Я хочу, чтобы сервер BeanShell мог изменять свойства на лету.

АКТУАЛЬНЫЙ РЕЗУЛЬТАТ :

Сервер BeanShell запускается и успешно работает.После завершения теста в журнале появляется следующее сообщение:

The JVM should have exited but did not.
The following non-daemon threads are still running (DestroyJavaVM is OK):
Thread[Thread-7,5,main], stackTrace:java.net.PlainSocketImpl#socketAccept
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Sessiond#run at line:65
java.lang.Thread#run at line:748

Thread[Thread-5,5,main], stackTrace:java.net.PlainSocketImpl#socketAccept
java.net.AbstractPlainSocketImpl#accept at line:409
java.net.ServerSocket#implAccept at line:545
java.net.ServerSocket#accept at line:513
bsh.util.Httpd#run at line:64
java.lang.Thread#run at line:748

Понятно, что это происходит из-за того, что сервер BeanShell работает и по какой-то причине не завершает работу.В результате, Java-процесс никогда не завершится и будет зависать .

ВОПРОС:

Есть идеи, почему это происходит?Как этого избежать?Я не подключаюсь к бобовому серверу ни по http, ни по telnet.

ПОДРОБНОЕ ОПИСАНИЕ:

Все узлы работают как контейнеры Docker.Все узлы развернуты в AWS.Не могу воспроизвести ту же проблему локально на моей машине.Даже при включенном сервере BeanShell все работает без сбоев, и Java существует, как и должно.

ЧТО Я ПОПРОБОВАЛ:

Попытался настроить следующие свойства:

jmeterengine.remote.system.exit=true    
jmeterengine.stopfail.system.exit=true    
jmeterengine.force.system.exit=true

Не помогает, процесс java все еще зависает.То же самое для

bsh.system.shutdownOnExit = true;

Любые идеи очень ценятся.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Наконец, я нашел обходной путь, поэтому разместил его здесь как ответ.

На самом деле, он фактически не отвечает на оригинальный вопрос, но не хочет тратить время на поиск оригиналаосновная причина, поскольку она, похоже, связана со структурой AWS (просто потому, что я не могу воспроизвести ее локально внутри того же контейнера, который запускаю удаленно).

Итак, окончательная схема:

  1. Чтобы обновить свойства на лету, мне не нужно запускать BeanShell на ведомом и ведущем обоих.Смена недвижимости происходит на ведомом, поэтому мастер не требуется.Это решает мой конкретный случай.

  2. Чтобы остановить тестирование, вы можете использовать существующие сценарии shutdown.sh и stoptest.sh.Не нужно делать это через сервер бобов.

  3. Если тест был правильно остановлен, то опция -X (server.exitaftertest = true) также работает нормально, поэтому принудительное отключение для JVM нетребуется, и вам не нужно добавлять группу потоков tearDown, которая выполняет System.exit.Но идея хороша.

  4. Стоит иметь скрипт shutdown.bsh, чтобы принудительно убить его как инструмент.

0 голосов
/ 26 ноября 2018

Я не думаю, что есть способ остановить Beanshell Server вместе с тестом, так как он работает в бесконечном цикле Thread

Я бы порекомендовал остановить ваш тест иСервер Beanshell, использующий файл .bsh, например:

stopEngine();
Thread.sleep(5000L); // just in case wait for 5 seconds for graceful shutdown
System.exit(0);    

, где:

Таким образом, вы сможете отключить все так же, как вносите изменения в свойства во время выполнения.

Этого же можно добиться, выполнив команду System.exit(0); автоматически из, например, tearDown Thread Group с использованием OS Process Sampler , однако в этом случае обязательно установитеследующее свойство:

jmeter.save.saveservice.autoflush=true

в противном случае вы можете потерять некоторые результаты, которые еще не были записаны на диск

...