Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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 технологиях разбиратеся&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.042 c
2-1201197179
Anton
2008-01-24 20:52
2008.02.17
Считать данные из таблицы Access в упорядоченную структуру ?


2-1201165220
Guriev
2008-01-24 12:00
2008.02.17
Как сделать. чтобы ComboBox-ы заполнились и "зафиксировались"?


15-1200421621
Черный Шаман
2008-01-15 21:27
2008.02.17
Вопрос к Мастерам: как рефакторить такой код.


8-1170185135
johnvp
2007-01-30 22:25
2008.02.17
Как выдать звук накаждый моно-канал отдельно?


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский