Создание приложения для периодического выполнения задачи на сервере. - PullRequest
0 голосов
/ 13 июля 2010

Я ищу руководство по общей архитектуре этой маленькой системы, которую я строю.

В настоящее время у меня есть приложение, которое развернуто (и обновлено) через xcopy на нескольких серверах. Это хорошо работает для обновления кода, но не очень хорошо для обновления периода выполнения кода, так как он настроен как задание Windows, запускаемое каждый час. Замена xcopy работает хорошо, потому что я могу запустить обновление с моего локального компьютера и отправить новый exe-файл на все серверы. А на следующий час планировщик задач запустит новый exe.

Я бы хотел изменить его на работу таким образом.

Мое приложение работает как служба Windows и использует System.Threading.Timer, чтобы подождать определенную продолжительность, а затем выполнить код. Таким образом, часть процесса может проверить базу данных и, при необходимости, сократить период выполнения для данного сервера.

Проблема в том, что, поскольку .exe будет работать как служба, он не позволит легко выполнить обновление через xcopy, поскольку файл будет использоваться постоянно.

Есть какие-нибудь мысли о том, как мне настроить это, чтобы иметь возможность легко обновлять xcopy, работая в качестве службы Windows? Это вообще возможно?

Ответы [ 5 ]

2 голосов
/ 13 июля 2010

Вы можете остановить службу, затем скопировать файлы, а затем запустить службу из командного файла:

SET SOURCEDIR=\\coastappsdev\wwwroot\ClearTrac\Setup\03_Staging\ClearTracAutoSend\bin
SET SERVICE_HOME=C:\INETPUB\WWWROOT\ClearTracAutoSend
SET SERVICE_EXE=ClearTracAutoSend.exe
SET INSTALL_UTIL_HOME=C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727


:STOP THE SERVICE:
SC \\targetServer STOP ClearTracAutoSend

:COPY THE FILES:
MD %SERVICE_HOME%
XCOPY %SOURCEDIR%\*.* %SERVICE_HOME%\*.* /E /R /Y

set PATH=%PATH%;%INSTALL_UTIL_HOME%

cd %SERVICE_HOME%

echo Uninstalling AutoSend Service...
installutil /u %SERVICE_EXE%

cd %SERVICE_HOME%

echo installing AutoSend Service...
installutil /i %SERVICE_EXE%

:START THE SERVICE:
SC \\targetServer ClearTracAutoSend

pause

Это может быть не лучшим решением для удаленного, я не знаю, как запуститьустановить удаленно.Мы RDP к серверу и запускаем пакетный файл.

1 голос
/ 13 июля 2010

Как насчет перемещения кода обновления из службы, которая просто проверяет время следующей итерации в своей собственной сборке. Загружайте это динамически перед каждым запуском, а затем выгружайте его. Мне также интересно, если Quartz.net полезен для вас.

0 голосов
/ 27 июля 2010

Я использовал немного решения @ Decker97 в сочетании с магией PowerShell:)

function global:new-process()
{
    param ([string]$computer, [string]$commandline=$(throw "Command line required."))

    $path = "\\$computer\root\cimv2:Win32_Process"
    $mc = new-object System.Management.ManagementClass $path

    $cmdargs = $commandline,$null,$null,0

    $ret = $mc.InvokeMethod("Create", $cmdargs)
    if ($ret -eq 0) {
        write-host "Created Process ID: $($cmdargs[3])"
    }
    else {
        write-host "Error $ret creating process."
    }

    $mc.Dispose()
}

$serverNames = Get-Content C:\temp\servers.txt

foreach ($server in $serverNames) 
{   
    write-host Updating $server

    c:\windows\system32\sc.exe \\$server STOP Service

    $source = "C:\Projects\Service\bin\Debug"
    $dest = "\\" + $server + "\C$\Program Files\TargetFolder\TargetFolder"
    ROBOCOPY.exe $source $dest /MIR /W:5 /R:1

    new-process $server 'c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Installutil.exe /i  /LogFile=install.out "C:\Program Files\TargetFolder\TargetFolder\serviceExecutable.exe"'

    c:\windows\system32\sc.exe  \\$server START Service
}

Сценарий использует управление службами, чтобы попытаться остановить службу.

Затем он копирует файлы на сервер с помощью robocopy.

Затем используйте WMI и Powershell для удаленного вызова «installutil» на сервере.

Затем используйте сервисный контроль для запуска сервиса.

0 голосов
/ 13 июля 2010

Если вы готовы остановить службу, нажать код и запустить службу, у вас есть несколько вариантов.

Лучше всего будет Powershell или MsBuild.

Если выЧто касается времени, просто установите службу для запуска один раз при запуске (или startTime + некоторый интервал), а затем каждый час.

Если вам действительно нужна эта служба, чтобы просто продолжать работать, но иметь возможность изменить код междузапускается, вам понадобится что-то вроде Managed Extensibility Framework (MEF), позволяющее хранить где-нибудь код DLL и загружать его только во время выполнения, поэтому его можно изменить без перезапуска.

0 голосов
/ 13 июля 2010

Вы можете просто запустить Service Spawn для подпроцесса (exe) и дождаться его завершения.

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

Если вы хотите быть более хитрым, вы можете настроить его как сборку (dll), то есть либо память, загружаемую через загрузку dll в памятьи затем запустите его, или вы можете настроить каталог ShadowCopy, из которого он запускается.

...