next_inactive up previous


CASL Контейнер Внедрения: Руководство Программиста
DocumentId:GradSof-CASL-DP-r-PG-07.06.2001-1.0.0

Введение

CASL - сокращение для Cbroker Application Server Library .

Это программный комплекс, который предоставляет разработчику высокоуровневую компонентную модель организации сервисов на языке C++.

CASL - разработка компании Grad-Soft расположенной в Киеве, Украина. Адрес службы поддержки пользователей: support@gradsoft.kiev.ua

Понятие Сервиса CASL

Что такое CASL сервис: это просто некоторый блок функциональности, организованный в виде :

Соответствующая UML диаграмма:
DC_Component.png Примеры функциональности модуля CASL:

Организация Сервиса CASL

Сервис CASL это просто совокупность из двух классов:

Соответствующая UML диаграмма классов:
DC_Classes.png

Простейший пример

Сервис, который при исполнении печатает Hello, world.

001 #include <GradSoft/CASL.h>
002
003 /*
004  * part of CASL framework.
005 * (C) Grad-Soft Ltd, 2001
006 * http://www.gradsoft.com.ua
007 * $Id: DeploymentContainerProgrammingGuide_rus.tex,v 1.10 2002/09/03 15:05:20 rssh Exp $
008 */
009
010 /*
011 * this program illustrate how to build own service.
012 */
013
014 namespace GradSoft {
015
016 using namespace CASL;
017 using namespace std;
018
019 /**
020  * create our own service class.
021 * (what it do: check input and output files
022 **/
023 class HelloWorldService: public Service
024 { 
025 public:
026
027  const char* name() const
028    { return "HelloWorld"; }
029
030  void run()
031    { cout << "Hello, world!" << endl; }
032   
033  void close() {}
034
035 };
036
037 /**
038 * And ServiceModule
039 **/
040 class HelloWorldServiceModule: public ServiceModule
041 { 
042 private:
043
044  // Dynamic module methods:
045
046  const char* name() const { return "HelloWorldService"; }
047  const char* author() const { return "Grad-Soft Ltd, Kiev, Ukraine"; }
048  int   versionMajor() const { return 1; }
049  int   versionMinor() const { return 0; }
050  int   versionSubMinor() const { return 0; }
051
061  // and create service
071
081  Service*  createService()  { return new HelloWorldService(); }
082
083 };
084
085 // we need to declare service module outside interface.
086 } // close namespace
087
088
089 GradSoft::HelloWorldServiceModule HelloWorld;
090
091 EXPORT_OBJECT(HelloWorld);

Собственно Сервис, который печатает Hello, world описан в строках с 23 по 35. Как и следовало ожидать, основная работа сервиса должна выполняться в методе run().

В конце работы CASL вызывает виртуальный метод close(), который в нашем случае не делает ничего. Остальные возможности CASL Service API мы рассмотрим позже, пока вернемся к нашему примеру:

В строках 40-83 описан модуль, который является фабрикой нашего сервиса. Он должен наследоваться от класса CASL::ServiceModule, который в свою очередь, наследуется от GradSoft::DynamicModule из GradSoft C++ ToolBox.

Соответственно модуль сервиса должен соответствовать API динамического модуля в смысле DynamicModules::ProgrammingGuide и в дополнение должен предоставлять метод create создающий сервис. 1

И в конце модуля мы определяем экспортируемую переменную с именем, соответсвующим имени сервиса.

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

<?xml version="1.0"?>
<!-- 
  Configuration for running service 'Hello World'
-->
<CASL>
<Service Name="HelloWorld" Library="libHelloWorld">
</Service>
</CASL>

В котором определим только этот сервис без параметров. Назовем его, к примеру, HelloWorld.xml

Теперь запустим, с помощью команды

CASL --service-config HelloWorld.xml

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

О видах сервисов


Внутреннее API Сервиса

Кроме возможности загрузки и выполнения сервисов CASL также предоставляет прикладному программисту некоторый набор типов данных и утилит общего назначения.

Подробная спецификация приведена в описании (API).

Этот раздел носит ознакомительный характер и предназначен для чтения параллельно со спецификацией API.

Типы данных

Исключения

Все исключения CASL должны наследоваться от (CASL::Exception)

Value

Value API - это полиморфный тип данных, подобный Variant в COM или Any в CORBA.

Value может быть комбинацией следующих элементов:

Для создания какого-либа типа элементов можно применить соответствующий статический метод класса Value: для взятия/занесения значения определенного типа существуют 2 метода:

StringChunk, WStringChunk

Эти типы данных представляю собой буфер на часть строки. Пользоваться ими можно почти так-же, как и строками учитывая следующие особенности:

Указатели на описание: (API)

Чтение параметров сервиса

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

<Service Name="MyService" Library="libMyLibrary">
<parameter>
 <name> nameOfParameter1 </name>
 <value> valueOfParameter1 </value>
</parameter>
<parameter>
 <name> nameOfParameter2 </name>
 <value> valueOfParameter2 </value>
</parameter>
</Service>

Сервис может читать эти параметры, используя метод getProperty(), который возвразает объект типа CASL::Value.

Типичный паттерн использования:

 string myParameter;
 try {
  myParameter = getProperty("ParamName").getAsString();
 }catch(const NamedValues::NameNotFound& ex){
   throw CASL::Exception("Parameter 'ParamName' not set");
 }

Или (скажем, для целых)

 int myParameter;
 try {
  myParameter = getProperty("ParamName").getAsInt();
 }catch(const NamedValues::NameNotFound& ex){
   throw CASL::Error("Parameter 'ParamName' not set");
 }catch(const Value::CastMismath& ex){
   throw CASL::Exception("Parameter 'ParamName' must be int");
 }

Использование API ServerContext

API ServerContext предоставляет CASL-сервису доступ к остальным сервисам и к стандартным сервисам низлежащей OS. Для доступа к ServerContext можно воспользоваться методом Service::getServerContex(), который возвращает осмысленное значение после инициализации сервиса.

Мы можем использовать:

Скриптинг

Как вы заметили, рассматривая C++ API для CASL::Service В сервисе есть еще один public метод: doCommand(), который можно перегрузить.

Таким образом вы можете предоставить кроме обычного C++ API, так называемое script API, что позволит обращаться к вашему сервису из CASL с помощью скрипт языков, без какой-либо дополнительной настройки.

Перечень изменений

  1. 03.07.2002 - первая внешняя редакция.
  2. 25.12.2001 - добавленны поясняющие UML диаграммы.
  3. 21.12.2001 - первая внутренняя редакция.
  4. 07.06.2001 - создан.

Bibliography



Footnotes

... сервис.1
Кстати - почему создающий, а не возвращающий, например, ссылку на статическую переменную (?) - потому что сервис может создаваться несколько раз с разными параметрами

next_inactive up previous
GradSoft