ACE는 서비스 객체를 관리할 수 있도록 Component Configurator 패턴을 적용한 Service Configurator Framework를 제공합니다.
정적 서비스 또는 동적 서비스를 컴파일 시간, 실행 시간에 동적으로 서비스를 제어할 수 있습니다.
모든 서비스 객체는 ACE_Service_Object 클래스의 파생 클래스로 선언되어야 합니다. Service Configurator Framework은 서비스 객체를 만드는 어플케이션 레이어와 서비스를 제어하는 Configuration management 레이어로 구분됩니다.
모든 서비스 객체는 ACE_Service_Object 파생 클래스로 선언되어야 합니다. ACE_Service_Config 클래스는 svc.conf 파일에서 읽어온 정보를 분석해서 서비스 객체를 생성하고 저장소에 등록합니다.
서비스 로더 프로그램
// ServiceLoader.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <ace/ACE.h>
#include <ace/Service_Config.h>
#include <ace/Reactor.h>
int main(int argc, char* argv[])
{
ACE::init();
ACE_Service_Config::open( argc, argv); //svc.conf
ACE_Reactor::instance() ->run_reactor_event_loop();
ACE::fini();
return 0;
}
서비스 로더 환경 파일 – svc.conf
dynamic EchoService1 Service_Object * EchoService:_make_ES() "-a 192.168.0.2:1500"
dynamic EchoService2 Service_Object * EchoService:_make_ES() "-a 192.168.0.2:2500"
서비스 프로그램 -ES.h 파일
#pragma once
#include <ace/Service_Object.h>
#include <ace/Reactor.h>
#include <ace/TP_Reactor.h>
#include <ace/Thread_Manager.h>
class ES:public ACE_Service_Object
{
private:
ACE_TP_Reactor tp_;
ACE_Reactor reactor_;
ACE_Thread_Manager thr_;
public:
ES(void);
~ES(void);
private:
static DWORD svc(void* p);
// Shared_Object Interface
virtual int init (int argc, ACE_TCHAR *argv[]);
virtual int fini (void);
};
서비스 프로그램 -ES.cpp 파일
#include "ES.h"
#include "GAcceptor.h"
#include <ace/Get_Opt.h>
#define MY_SERVICE_Export __declspec(dllexport)
ACE_FACTORY_DEFINE( MY_SERVICE, ES);
ES::ES(void)
:reactor_(&tp_)
{
this->reactor(&reactor_);
thr_.spawn( ES::svc, this);
}
ES::~ES(void)
{
}
DWORD
ES::svc(void* p){
ES* obj = (ES*) p;
obj->reactor()->run_reactor_event_loop();
return 0;
}
// -a 192.168.0.2:5000
int
ES::init (int argc, ACE_TCHAR *argv[]){
char* p = NULL;
ACE_Get_Opt opt( argc, argv, "a:",0);
for( int c; -1 != (c = opt()); ){
if( 'a' == c){
p = opt.opt_arg();
}
}
new GAcceptor(p ,this->reactor());
return 0;
}
int
ES::fini (void){
this->reactor()->end_reactor_event_loop();
thr_.wait();
return 0;
}
GAccepter와 EchoService 부분은 EchoServer 소스와 동일합니다.