Форум: "Прочее";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
ВнизService средствами Delphi : возможено ли? Найти похожие ветки
← →
Ega23 © (2008-01-15 13:28) [0]Задача: написание некоего агента, умеющего останавливать определённую программу, обновлять некие конфигурационные данные данной программы, запускать программу.
По идее, время жизни данного агента - с момента логина в систему и до логаута.
В File New вижу и Service и Service Application.
Собственно, вопрос: какие грабли могут быть при создании службы из Delphi, а также какова разница между Service и Service Application (кроме того, что последнюю можно непосредственно из IDE отлаживать)?
← →
Игорь Шевченко © (2008-01-15 13:29) [1]1. Возможено
2. Нафига сервис - простая программка в автозагрузку
← →
Rouse_ © (2008-01-15 13:29) [2]Да никаких граблей собственно. Я правда сервисы на АПИ пишу, без всех этих оберток...
← →
Palladin © (2008-01-15 13:31) [3]
> также какова разница между Service и Service Application
Service Application - само приложение
Service - сервис в этом приложении и без ServiceApplication он ничто
сервисов в приложении может быть несколько
← →
Ega23 © (2008-01-15 13:37) [4]
> 2. Нафига сервис - простая программка в автозагрузку
Честно говоря, я сам тоже склоняюсь к этому мнению. Но тут начальник хочет именно сервис.
Можешь пару-тройку плюсов и минусов обоих вариантов дать? А то в сервисах я - ни в зуб ногой... :)
← →
Игорь Шевченко © (2008-01-15 13:38) [5]Ega23 © (15.01.08 13:37) [4]
> Честно говоря, я сам тоже склоняюсь к этому мнению. Но тут
> начальник хочет именно сервис.
srvany :))))
← →
ыы (2008-01-15 13:40) [6]
> с момента логина
Нафига сервис? Тем более, там момент логина придётся специально отслеживать. По описанию, даже скрипт на wsh на ура пойдёт.
← →
DiamondShark © (2008-01-15 13:42) [7]
> Но тут начальник хочет
Уже в который раз замечаю, как у тебя начальник странного хочет.
А как мотивирует? Наверное не в стиле "я -- начальник, ты -- дурак".
← →
Ega23 © (2008-01-15 13:53) [8]
> Уже в который раз замечаю, как у тебя начальник странного
> хочет.
Да может и не странного. Ему аргументацию надо: какие плюсы-минусы.
По сабжу:
в идеале, если бы к MSSQLAgent можно было бы свои плагины цеплять, этого бы было достаточно.
← →
Игорь Шевченко © (2008-01-15 13:54) [9]
> Ему аргументацию надо: какие плюсы-минусы.
Сервис живет не с логина до логина, а с запуска системы до шатдауна - первое несоответствие.
Сервису не так легко запускать пользовательские программы - второе несоответствие
← →
Rouse_ © (2008-01-15 13:55) [10]1. Если твоя программа рухнет, то поднять ее будет некому, сервис же может перезапуститься...
2. Сервис начнет свою работу еще до логона
Это из плюсов, из минусов - дополнительно конфигуратор нужно писать, а если настройка не требуется, то вроде больше минусов не вижу :)
← →
Сергей М. © (2008-01-15 13:56) [11]
> какие грабли могут быть при создании службы из Delphi
Никаких.
> какова разница между Service и Service Application
Сервис-аппликация (Service Application) может реализовать более чем один сервис (Service) контексте.
Service не может "жить" без ServiceApplication, и, наоборот, ServiceApplication может "окучивать" один или более Service
← →
DiamondShark © (2008-01-15 14:02) [12]
> в идеале, если бы к MSSQLAgent можно было бы свои плагины
> цеплять, этого бы было достаточно.
А в чём проблема?
К MSSQLAgent можно цеплять TSQL, ActiveScript и cmd скрипты. Это функциональности -- выше крыши.
← →
Ega23 © (2008-01-15 14:12) [13]Короче, более подробная информация:
Есть комплекс охраны объекта. Состоит из нескольких АРМ (автоматизированное рабочее место). АРМы (условно) делятся на 2 типа - АРМ администратора и АРМ Оператора.
Каждый АРМ оснащён локальной БД. БД на всех АРМ одинакова. Сделано так, чтобы каждый АРМ мог работать автономно и не зависел от работоспособности центрального сервера БД.
АРМ Администратора - редактирует модель объекта (устройства, их адреса, расположение etc). АРМ Оператора работает с готовой моделью.
Задача: написание системы репликации конфигурации модели с Администратора всем Операторам.
Собственно, как видится в данный момент, на каждой машине, где есть АРМ, запускается некий агент, который должен уметь делать следующее:
1. Информировать кого-то (скорее всего broadcast-сообщение) о том, что АРМ на данной машине начал работу.
2. Информировать кого-то, что АРМ на данной машине начал завершение работы.
3. Информировать кого-то, что АРМ на данной машине завершил работу.
4. Уметь принудительно завершить работу АРМ.
5. Уметь принудительно начать работу АРМ.
6. Уметь вывесить некую сплэш-форму, что-то типа "идёт обновление БД". Это может быть как некая "родная" форма, так и просто внешнее приложение из одной формы.
Вот, приблизительно, как-то так. Шеф выступает за то, что данный агент должен быть сервисом, a-la MSSQLAgent. Я склоняюсь к тому, что это - простой exe, возможно без формы. Ну в трее может что-то висеть.
З.Ы. Как запуздырить иконку в трею - я знаю. :))
← →
Игорь Шевченко © (2008-01-15 14:15) [14]Ega23 © (15.01.08 14:12) [13]
Это ты мой пример из статьи про Named Pipes рассказываешь...
← →
Ega23 © (2008-01-15 14:20) [15]
> Это ты мой пример из статьи про Named Pipes рассказываешь.
> ..
:)
Что-то действительно похоже.
Но тут не про транспортный уровень протокола взаимодействия речь сейчас...
← →
Сергей М. © (2008-01-15 14:22) [16]
> Шеф выступает за то, что данный агент должен быть сервисом
Шефу, как известно, в зад не заглядывают)
Сервсис знач сервис.
В чем проблема ?
← →
DiamondShark © (2008-01-15 14:27) [17]
> Ega23 © (15.01.08 14:12) [13]
БД Администратора и АРМов связать стандартным механизмом репликации MSSQL.
> 1. 2. 3.
Кого информировать? Кому это интересно?
Если кому-то интересно, то в той же БД реализовать очередь событий, и/или таблицу состояний АРМов.
> 4.
Само завершится, выбрав из БД нужное событие.
> 5.
Единственный пункт, где потребуется что-то самописное.
Можно даже не сервис, а обычное приложение, которое будет запускаться агентом. Приложение должно мониторить очередь событий в БД, определить, залогинен ли интерактивный юзер, и если да, то запустить на его десктопе приложение АРМ.
> 6.
Нафиг не нужно.
← →
DiamondShark © (2008-01-15 14:33) [18]
> DiamondShark © (15.01.08 14:27) [17]
> > 5.
А может даже и не агентом, а просто из Автозапуска.
Тогда даже не надо заморачиваться определением наличия интерактивного юзера.
← →
Torry © (2008-01-15 14:41) [19]Сервис интересен (думаю, что я правильно интеретирую мысль начальника) тем, что может грузится без логина пользователя в систему и, видимо, начинать работать/отслеживать процессы без вмешательства пользователся. Кроме того, от "некоторых просто пользователей" его можно скрыть.
У меня таким образом на всех машинах в офисе стоит Remote Desktop Control (пользователи в курсе, но его не отключают - уровень подготовленности средний), что позволяет исправлять что-то, не покидая рабочего места.
← →
Kolan © (2008-01-15 14:42) [20]> написание системы репликации конфигурации модели с Администратора
> всем Операторам
DTS(Data Transformation Service)?
← →
Ega23 © (2008-01-15 14:46) [21]
> DTS(Data Transformation Service)?
Это всего лишь один из механизмов передачи реплицируемых данных. Можно им, можно вообще полным backup\restore, это уже дело десятое.
> DiamondShark © (15.01.08 14:27) [17]
Не пойдёт. Каждый из АРМ понятия не имеет о других БД (да и не должен).
← →
DiamondShark © (2008-01-15 14:50) [22]
> Каждый из АРМ понятия не имеет о других БД (да и не должен).
А этого и не нужно.
← →
Ega23 © (2008-01-15 14:53) [23]
> А этого и не нужно.
>
Локальная СУБД - MSDE. Возможно наличие центрального сервера Enherprise (но может и не быть).
← →
DiamondShark © (2008-01-15 15:00) [24]
> Локальная СУБД - MSDE. Возможно наличие центрального сервера
> Enherprise (но может и не быть).
А какая разница? Локальная СУБД может быть хоть KLMN.
← →
Kolan © (2008-01-15 15:04) [25]
> Ega23
Слушай DiamondShark, но, имхо, в MSSQL технологиях разбиратеся…
← →
Ega23 © (2008-01-15 15:12) [26]
> Слушай DiamondShark, но, имхо, в MSSQL технологиях разбиратеся…
Да я, как бы, тоже в MSSQL не пальцем деланый.
Проблема в том, что кроме этих репликаций есть ещё масса всяких других (в аппаратуру, например).
Более того, сами базы и приложения не должны быть связаны друг-с-другом дополнительными коннектами.
← →
DiamondShark © (2008-01-15 15:19) [27]
> сами базы и приложения не должны быть связаны друг-с-другом
> дополнительными коннектами.
Это противоречит пунктам постановки "репликации конфигурации модели с Администратора всем Операторам" и "Информировать кого-то".
← →
Ega23 © (2008-01-15 15:27) [28]
> Это противоречит пунктам постановки "репликации конфигурации
> модели с Администратора всем Операторам" и "Информировать
> кого-то".
Дык на Администраторе тоже такой сервис есть. Вот именно его в качестве "кого-то" и информируют остальные. И, собственно, этот же сервис и производит push-репликацию в Операторов и в аппаратуру.
← →
DiamondShark © (2008-01-15 16:42) [29]
> Ega23 © (15.01.08 15:27) [28]
Тогда у тебя есть уже почти всё.
Тот самый "сервис на Администраторе" -- это МССКуЛ-агент, который крутит репликацию БД, и он же может крутить программу программирования аппаратуры.
Осталось только написать совсем примитивную программульку, которая будет поднимать приложение АРМ на местах.
← →
Dmitry S © (2008-01-15 18:19) [30]Кстати, а можно простой пример сервиса на Апи без обертки?:)
← →
DiamondShark © (2008-01-15 18:30) [31]
> простой пример сервиса на Апи без обертки
находится в МСДН в статье про сервисы.
Там, правда, Цэ, но без изысков, а АПИ -- он и в Кении АПИ.
← →
Черный Шаман (2008-01-15 18:31) [32]
> Rouse_ © (15.01.08 13:29) [2]
>
> Да никаких граблей собственно. Я правда сервисы на АПИ пишу,
> без всех этих оберток...
На Delphi удобнее, сразу все есть, в том числе и инсталятор сервиса внутри программы.
А вот отлаживать сервис можно в основном только отладочными логами, если сервис использует многопоточность в теле приложения то стандартный отладчик Delphi любит виснуть при отладке множества нитей.
{*******************************************************************************
uLogger
Автор: Александр Гаврилюк
Дата последнего изменения: 22.10.2007
Версия: 0.5.0.1
Модуль предназначен для логирования сообщений
*******************************************************************************}
unit uLogger;
{******************************************************************************}
interface
{******************************************************************************}
uses
Windows, Messages, SysUtils, Variants, Classes, SyncObjs;
{-------------------------------------------------------------------------------
-------------------------------------------------------------------------------}
const
cLoggerDelimeter: WideChar = "|";
cLoggerCloseDelimeter: WideString = #13#10;
cLoggerMaxSize: integer = 10000000;//максимальный размер лога
//при превышении стирается
{-------------------------------------------------------------------------------
Объект осуществляющий логирование отладочных сообщений
-------------------------------------------------------------------------------}
type
TServiceLogger = class (TObject)
private
//имя файла отладочной информации
FLogFileName: String;
//объект критической секции
FSynch: TCriticalSection;
procedure CheckMaxSize(const logName: AnsiString);
function GetFileName: String;
procedure SetFileName(const Value: String);
public
//процедура позволяющая заменить имя файла лога
property FileName: String read GetFileName write SetFileName;
//
constructor Create(const LogFileName: String);
destructor Destroy;override;
//логирование
procedure Log(const LogMessage: String);
end;
var
ServiceLogger: TServiceLogger;
{******************************************************************************}
implementation
{******************************************************************************}
{ TServiceLogger }
{$HINTS OFF}
{-------------------------------------------------------------------------------
Проверка на максимальный размер лога
при превышении стирается
-------------------------------------------------------------------------------}
procedure TServiceLogger.CheckMaxSize(const logName: AnsiString);
var
FStr: TFileStream;
lSize: Integer;
begin
//если файл в наличии
if FileExists(logName) then
begin
//получаем размер файла
lSize := 0;
try
FStr := TFileStream.Create(logName, fmOpenRead);
lSize := FStr.Size;
finally
FreeAndNil(FStr);
end;
//если размер первышен - удаляем
if (lSize > cLoggerMaxSize) then
begin
SetFileAttributes(PAnsiChar(logName), FILE_ATTRIBUTE_NORMAL);
DeleteFile(logName);
end;
end;
end;
{$HINTS ON}
{-------------------------------------------------------------------------------
Конструктор
1. Сохраняет имя файла логирования
2. инициализирует объект синхронизации
-------------------------------------------------------------------------------}
constructor TServiceLogger.Create(const LogFileName: String);
begin
FLogFileName := LogFileName;
//инициализация объекта синхронизации
FSynch := TCriticalSection.Create;
end;
{-------------------------------------------------------------------------------
Деструктор
-------------------------------------------------------------------------------}
destructor TServiceLogger.Destroy;
begin
FSynch.Enter;
FSynch.Leave;
//очищаем
FreeAndNil(FSynch);
//
inherited;
end;
{-------------------------------------------------------------------------------
Получает имя файла лога
-------------------------------------------------------------------------------}
function TServiceLogger.GetFileName: String;
begin
Result := FLogFileName;
end;
{-------------------------------------------------------------------------------
Логирует в файл лога сообщение
LogMessage - сообщение для логирования
-------------------------------------------------------------------------------}
procedure TServiceLogger.Log(const LogMessage: String);
var
lFile: TFileStream;
ResString: String;
begin
try
//входим в критическую секцию
FSynch.Enter;
try
//проверка на размер
CheckMaxSize(FLogFileName);
//открываем файл
if not FileExists(FLogFileName) then
lFile := TFileStream.Create(FLogFileName, fmCreate or fmShareDenyNone)
else
lFile := TFileStream.Create(FLogFileName, fmOpenReadWrite or fmShareDenyNone);
try
//указатель на конец
lFile.Position := lFile.Size;
ResString := FormatDateTime("dd.mm.yyyy hh:nn:ss:zzz",now) + cLoggerDelimeter + LogMessage + cLoggerCloseDelimeter;
lFile.WriteBuffer(ResString[1], Length(ResString)*SizeOf(Char));
finally
lFile.Free;
end;
finally
FSynch.Leave;
end;
except on E:Exception do;
//давим ошибку
end;
end;
{-------------------------------------------------------------------------------
Устанавливает имя файла лога
-------------------------------------------------------------------------------}
procedure TServiceLogger.SetFileName(const Value: String);
begin
FSynch.Enter;
try
FLogFileName := Value;
finally
FSynch.Leave;
end;
end;
{******************************************************************************}
initialization
{******************************************************************************}
begin
ServiceLogger := TServiceLogger.Create(IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + "default.log");
end;
{******************************************************************************}
finalization
{******************************************************************************}
begin
FreeAndNil(ServiceLogger);
end;
end.
← →
Семен Сурков (2008-01-16 02:39) [33]мое имхо, что приведенной информации по исходной задаче недостаточно для формирования мнения.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2008.02.17;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.042 c