Одним из сервисов CASL является сервис CORBA API.
Что это такое - это просто CASL оболочка вокруг ORB, поставляемой
вместе с CASL, которая предоставляет унифицированный интерфейс
к функциональности ORB и набор утилитных функций.
Определения CORBA сервисов находяться в файле :
<CASL-ROOT>/include/GradSoft/CASL/CORBAService.h
Публичные методы CASL сервиса приведены ниже:
namespace CASL {
class CORBAService: public CASL::Service
{
public:
/**
* return string "CORBAService"
**/
virtual const char* name() const;
/**
* init
**/
virtual void init(ServerContext* );
/**
* return
* false, if we work in client-only mode.
* true, otherwice
**/
virtual bool requireThread();
/**
* run CORBA Service.
**/
virtual void run();
/**
* close
**/
virtual void close();
//
// CORBA specific stuff.
//
/**
* return ORB
**/
virtual CORBA::ORB_ptr getORB();
/**
* throw CASL::Exception with code 1001 and message about
* CORBA::SystemException
**/
virtual void throwCORBAInvokedException(const CORBA::SystemException& ex);
/**
* print information about CORBA::SystemException to stream out.
**/
virtual void printCORBASystemException(const CORBA::SystemException& ex,
ostream& out);
/**
* pring information about CORBA::SystemException to string
**/
virtual std::string stringCORBASystemException(
const CORBA::SystemException& ex);
private:
..........
};
}
Отдельного пояснения здесь требуют только метод run() и
requireThread : CORBA Сервис может работать в двух режимах: клиента
и сервером. Это регулируется булевым параметром сервиса ClientOnly.
Когда ClientOnly установлен в true, CORBAService::init выполняет
инициализацию ORB, run не делает ничего - т. е. в этом случае CASL CORBA
Сервис работает как API сервис.
В случае, когда ClientOnly установлен в false
1, run содержит вызов orb::run(),
и вызывается в отдельном потоке, соответственно requireThread
возвращает true. Тогда CASL приложение становится сервером и принимает
CORBA запросы по сети. Заметим, что для правильной работы CORBA приложений
внутри CASL необходимо установить многопоточную thread policy.
Да, кстати все параметры сервиса:
getORB() - возвращает ORB, при этом увеличивает счеттчик ссылок
на ORB, в соотвествтии со стандартной техникой работы с CORBA API. Типичный способ использования:
CORBA::ORB_var orb=corbaService->getORB();
throwCORBAInvokedException - вызывает CASL исключение с кодом
1001 и с сообщением о системной ошибке CORBA.
printCORBASystemException - выводит информацию о системном
исключении CORBA в поток вывода. Фактически, это то-же самое, что и оператор
std::ostream& operator<<(std::ostream&, const CORBA::SystemException&)Мы дублируем его в сервисе CASL в целях поддрежки совместимости с устаревшими ORB.
stringCORBASystemException - возвращает строку, с информациеой о системной ошибке ORB.
CORBA Сервис CASL доступен из других CASL-компонент по имени
CORBAService.
Типичный фрамент кода для получения этого сервиса:
void MyService::initCORBA() throw(CASL::Exception)
{
CASL::Service* srv = getServerContext().getService("CORBAService");
corbaService_p_ = dynamic_cast<CASL::CORBAService*>(srv);
if (corbaService_p_==NULL) {
throw CASL::Exception("Can't load CORBA Service: bad service type");
}
}
CORBA сервис находится в разделяемой библиотеке, которая
имеет вид типа: libCASL_CORBA_<ORB-name>.so, в зависимости от ORB,
вместе с которой поставляется CASL: например - libCASL_CORBA_TAO.so.
Соответсвенно, если вы используете CORBA сервис CASL, то перед загрузкой Вашего сервиса необходимо загрузить CORBA сервис - конфигурационный файл будет выглядеть приблизительно следующим образом:
<Service Name="CORBAService" Library="libCASL_CORBA_TAO">
<parameter>
<name> ClientOnly </name>
<value> false </value>
</parameter>
<parameter>
<name> ORBArgs </name>
<value>
-ORBInitRef NameService=corbaloc::my.host.com:2809/NameService
</value>
</Service>
<Service Name="MyService" Library="libCASL_My">
my parameters.
</Service>
false1