Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.17;
Скачать: CL | DM;

Вниз

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 технологиях разбиратеся&#133


 
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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.026 c
2-1201286538
AntonUSAnoV
2008-01-25 21:42
2008.02.17
составить SQL выборку по именинникам


6-1180363792
q10nik
2007-05-28 18:49
2008.02.17
Определение сервиса и его версии


2-1201007194
Riply
2008-01-22 16:06
2008.02.17
Работа с битовыми масками.


2-1201309790
Artem
2008-01-26 04:09
2008.02.17
Скрыть папку


15-1200674989
Черный Шаман
2008-01-18 19:49
2008.02.17
Китайцы объявляют территорию России своей землей