Для работы своих веб-приложений SAS RDTM может использовать JBoss (Java EE-сервер приложений с открытым исходным кодом) в качестве сервера приложений. После успешной установки SAS RTDM мы получаем сконфигурированный набор из 6-ти серверов приложений, которые остается только запустить. В этой статье мы поговорим об автоматизации процесса запуска и остановки служб сервера приложений JBoss. В качестве платформы используем Windows Server 2008R2/2012R2.
В зависимости от Вашего желания и выбранных параметров при установке SAS каждый из серверов приложений может быть запущен с использованием пакетных файлов или консоли управления «Services» («Сервисы»).
Готовые пакетные файлы находятся в директории \bin. Их имена соответствуют шаблону SASServer<N>.bat, где <N> – порядковый номер сервера JBoss. Например, если Вы установили чистый JBoss в директорию C:\jboss-4.2.3.GA\, то пакетные файлы будут находиться в C:\jboss-4.2.3.GA\bin. Каждый файл следуют запускать согласно его порядковому номеру: SASServer1.bat запускается первым, SASServer11.bat – последним.
Для запуска службы из консоли управления «Services» выполните команду services.mmc в командной строке или стартовом меню. В открывшейся консоли найдите службы, названия которых соответствует шаблону JBoss – SASServer<N>, где <N>, как и в случае с пакетными файлами, – порядковый номер сервера приложений. Запуск служб так же осуществляется поочередно, согласно нумерации в названии.
Каждый из серверов приложений ведет свой собственный файл-журнал, в который помимо множества других событий, он записывает и событие своего запуска. Именно это событие является указанием к запуску очередного пакетного файла или службы Windows. Текущий журнал находится в файле \server\SASServer<N>\server.log, где <N> снова указывает на порядковый номер сервера приложений. При достижении максимального размера или при перезапуске сервера приложений файл server.log переименовывается в server.log.<YYYY-MM-DD>, где <YYYY-MM-DD> - штамп текущей даты. Приведем пример события успешного запуска файл журнала, находящегося в директории C:\jboss-4.2.3.GA\server\SASServer<N>\server.log:
2017-08-31 13:23:15,625 INFO [org.jboss.system.server.Server] JBoss (MX MicroKernel) [4.2.3.GA (build: SVNTag=JBoss_4_2_3_GA date=200807181417)] Started in 2m:3s:151ms
Обратите внимание, что время запуска сервера приложений составило немногим более 2 минут, оно может существенно различаться – от нескольких секунд до нескольких минут. В случае необходимости перезапуска всего набора серверов приложений, потребуется периодически заглядывать в журнал server.log каждого из запускаемых серверов и искать событие успешного запуска, а только потом приступать к запуску следующего. Избавить от необходимости этих рутинных операций может простой скрипт, который будет запускать сервис и проверять файл-журнал на наличие в нем события успешного запуска.
Рассмотрим пример такого скрипта, написанного на «родном» для Windows скриптовом языке VBScript. Алгоритм работы скрипта прост:
- Опрашиваем систему на наличие нужных нам зарегистрированных остановленных служб.
- Запускаем первую службу.
- Читаем server.log до тех пор, пока в нем не появится запись об успешном запуске службы.
- Выводим на экран сообщение об успешном запуске службы.
- Запускаем следующую службу.
- Читаем server.log до тех пор, пока в нем не появится запись об успешном запуске службы.
- Выводим на экран сообщение об успешном запуске службы.
- Шаги 5-7 повторяем для всех нужных нам служб.
Для получения списка сервисов используем WMI-класс Win32_Service
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE Name = '" & arrSrvNamesLogs(i+1) & "' AND State = 'Stopped'").
Имена служб и путь к их файлам service.log указываем в строковой переменной через точку с запятой:
strSrvNamesLogs = "С:\jboss-4.2.3.GA\server\SASServer1\log\server.log;JBoss - SASServer1;" &_
"С:\jboss-4.2.3.GA\server\SASServer2\log\server.log;JBoss - SASServer2;" &_
"С:\jboss-4.2.3.GA\server\SASServer6\log\server.log;JBoss - SASServer6;" &_
"С:\jboss-4.2.3.GA\server\SASServer7\log\server.log;JBoss - SASServer7;" &_
"С:\jboss-4.2.3.GA\server\SASServer8\log\server.log;JBoss - SASServer8;" &_
"С:\jboss-4.2.3.GA\server\SASServer11\log\server.log;JBoss - SASServer11".
Это позволит нам в дальнейшем создать строковый массив и использовать его в циклах скрипта.
Для запуска служб используем метод StartService в цикле:
For Each j In colServices
started = j.StartService()
Next
Запускать скрипт лучше в консольной версии Windows Script Host:
Cscript <имя файла скрипта>.vbs
Ниже приведем пример готового скрипта:
'
' Версия: 1.0
' Описание: Запускает службы SAS RTDM по порядку, указанному в переменной strSrvNamesLogs.
' Проверка запуска очередной службы проводится по наличию строки, удовлетворяющей шаблону
' "JBoss(.*)Started in", в файлах журнала.
' Формат strSrvNamesLogs: "Пусть к файлу журнала сервиса;Имя сервиса;"
'
Option Explicit
Const ForReading = 1
Dim objRegEx, objFSO, objTextFile, objWMIService, colServices, _
strServiceName, strLine, strSearchFor, i, j, _
strSrvNamesLogs, arrSrvNamesLogs, found, started
Set objRegEx = New RegExp
objRegEx.IgnoreCase = True
objRegEx.Pattern = "JBoss(.*)Started in"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
strSrvNamesLogs = "D:\jboss-4.2.3.GA\server\SASServer1\log\server.log;JBoss - SASServer1;" &_
"D:\jboss-4.2.3.GA\server\SASServer2\log\server.log;JBoss - SASServer2;" &_
"D:\jboss-4.2.3.GA\server\SASServer6\log\server.log;JBoss - SASServer6;" &_
"D:\jboss-4.2.3.GA\server\SASServer7\log\server.log;JBoss - SASServer7;" &_
"D:\jboss-4.2.3.GA\server\SASServer8\log\server.log;JBoss - SASServer8;" &_
"D:\jboss-4.2.3.GA\server\SASServer11\log\server.log;JBoss - SASServer11"
arrSrvNamesLogs = Split(strSrvNamesLogs,";",-1,1)
For i = 0 To UBound(arrSrvNamesLogs) - 1 step 2
found = False
Set colServices = objWMIService.ExecQuery("SELECT * FROM Win32_Service WHERE Name = '" _
& arrSrvNamesLogs(i+1) & "' AND State = 'Stopped'")
If colServices.Count = 1 Then
started = -1
For Each j In colServices
started = j.StartService()
Next
If started = 0 Then
Wscript.Sleep 30000
Do
If objFSO.FileExists(arrSrvNamesLogs(i)) Then
Set objTextFile = objFSO.OpenTextFile(arrSrvNamesLogs(i), ForReading)
Do While Not objTextFile.AtEndOfStream
strLine = objTextFile.ReadLine()
If objRegEx.Test(strLine) Then
found = True
Wscript.Echo "[*] Service " & "'" & arrSrvNamesLogs(i+1) & "'" _
& " has been started:" & VbCrLf & strLine & VbCrLf
Exit Do
End If
Loop
objTextFile.Close
Wscript.Sleep 1000
End If
Loop Until found
End If
End If
Set colServices = Nothing
Next
Set objWMIService = Nothing
Set objRegEx = Nothing
Set objFSO = Nothing