При администрировании серверов приложений WebSphere Application Server мне периодически приходилось сталкиваться с ситуацией, когда на сервере приложений останавливался Listener port, и сервер переставал разбирать сообщения из очереди MQ. Эта проблема решалась установкой параметра MAX.RECOVERY.RETRIES=2147483647 (в Servers – Application Servers – server_name – Messaging – Message Listener Service – Custom Properties).
После очередного обновления одной особо кривой системы, Listener port в ней стал постоянно “падать”, и установленный параметр MAX.RECOVERY.RETRIES никак не влиял на ситуацию.
Проблема была в “кривом” сообщении, которое сервер получал из очереди, оно вызывало ошибку в приложении. Пока разработчики разбирались с проблемой, всем остальным сотрудникам нужно было работать с системой, и Listener port перезапускали вручную. После нескольких таких перезапусков, я решил как-то автоматизировать эту работу. В результате родился скрипт, который запускает все остановленные Listener port’ы на всех серверах в ячейке. Скрипт был прописан в Task Scheduler на сервере, и запускался каждые 15 минут. После этого можно было немного отвлечься от “тушения пожаров” и заняться более глобальными задачами.
lineSeparator = java.lang.System.getProperty('line.separator')
lPorts = AdminControl.queryNames('type=ListenerPort,cell=Test,*')
print lPorts
lPortsArray = lPorts.split(lineSeparator)
for lPort in lPortsArray:
state = AdminControl.getAttribute(lPort, 'started')
print lPort, state
if state == 'false':
AdminControl.invoke(lPort, 'start')
Имя ячейки (cell=Test) замените на имя ячейки в вашей системе. Дополнительно можно сделать, чтобы запускались только Listener’ы с определёнными именами.