Для работы своих веб-приложений 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. Алгоритм работы скрипта прост:

  1. Опрашиваем систему на наличие нужных нам зарегистрированных остановленных служб.
  2. Запускаем первую службу.
  3. Читаем server.log до тех пор, пока в нем не появится запись об успешном запуске службы.
  4. Выводим на экран сообщение об успешном запуске службы.
  5. Запускаем следующую службу.
  6. Читаем server.log до тех пор, пока в нем не появится запись об успешном запуске службы.
  7. Выводим на экран сообщение об успешном запуске службы.
  8. Шаги 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