ページの先頭行へ戻る
Interstage Application Server アプリケーション作成ガイド(イベントサービス編)

4.3.1 イベントチャネルの生成と起動

  イベントファクトリを使用してイベントチャネルを作成するプログラムの例と処理の流れを以下に説明します。


イベントサービスの場合

  アプリケーションとイベントチャネルの動的生成のシーケンスを以下に示します。



[イベントファクトリによるイベントチャネルの生成(C言語の場合)]

CORBA_Boolean func() {
    CORBA_ORB                                 orb;
    EventFactory                              factory;
    CosEventChannelAdmin_EventChannel         channel;
    CORBA_Environment                         env;
    EventFactory_Option                       opt;

    factory = CORBA_ORB_resolve_initial_references(
              orb, EventFactory_ObjectId_Factory, &env );       /* 1 */

    opt.max_queuing = 3000;
    opt.life_time   = 0;
    opt.model       = EventFactory_ModelAny;

    channel = EventFactory_create(
              factory, "keyword", &opt, &env );                 /* 2 */

    CosEventChannelAdmin_EventChannel_destroy(
              channel, &env );                                  /* 3 */
    .... 
}

  1. イベントファクトリのオブジェクトリファレンスをイニシャルサービスから獲得します。イニシャルサービスには「EventFactory_ObjectId_Factory」を指定してください。

  2. EventFactory_create()メソッドでイベントファクトリにイベントチャネルの生成を指示します。複数のプロセス間で、同一のイベントチャネルのオブジェクトリファレンスを獲得するには、EventFactory_create()メソッドに同一キーワードを指定します。これにより、異なるプロセス間のイベント通信を行うことができます。このキーワードは、動的生成したイベントチャネルの名前です。

  3. イベントチャネルが不要である場合は、CosEventChannelAdmin_EventChannel_destroy()メソッドで、イベントチャネルを破壊します。


[イベントファクトリによるイベントチャネルの生成(C++言語の場合)]

CORBA::ORB_ptr                           orb;
CORBA::Object_ptr                        obj; 
CORBA::Environment                       env; 
EventFactory_ptr                         factory; 
EventFactory::Option                    *option; 
CosEventChannelAdmin::EventChannel_ptr   event_ch; 

try {
    obj = orb->resolve_initial_references(
    EventFactory::ObjectId_Factory, env );                   /* 1 */
    factory = EventFactory::_narrow( obj ); 
    CORBA::release( obj ); 

    option = new EventFactory::Option(); 
    option->max_queuing    = 100; 
    option->life_time      = 60; 
    option->model          = EventFactory::ModelAny; 
    event_ch = factory->create( "keyword", option, env );    /* 2 */
        .... 
    event_ch->destroy( env );                                /* 3 */
} catch( CORBA::Exception &e ) {
        .... 
}

  1. イベントファクトリのオブジェクトリファレンスをイニシャルサービスから獲得します。イニシャルサービスには「EventFactory::ObjectId_Factory」を指定してください。

  2. EventFactory::create()メソッドでイベントファクトリにイベントチャネルの生成を指示します。複数のプロセス間で、同一のイベントチャネルのオブジェクトリファレンスを獲得するには、EventFactory::create()メソッドに同一キーワードを指定します。これにより、異なるプロセス間のイベント通信を行うことができます。このキーワードは動的生成したイベントチャネルの名前です。

  3. イベントチャネルが不要である場合は、CosEventChannelAdmin::EventChannel::destroy()メソッドで、イベントチャネルを破壊します。


ノーティフィケーションサービスの場合

  アプリケーションとイベントチャネルの動的生成のシーケンスを以下に示します。



[イベントファクトリによるイベントチャネルの生成(C言語の場合)]

CORBA_Boolean func() {
    CORBA_ORB                                     orb;
    CosNotifyChannelAdmin_EventChannelFactory     factory;
    CosNotifyChannelAdmin_EventChannel            channel;
    CosNotification_QoSProperties                 *initial_qos;
    CosNotification_AdminProperties               *initial_admin;
    CosNotifyChannelAdmin_ChannelID               channelID;
    CORBA_Environment                             env;

    factory = CORBA_ORB_resolve_initial_references(
                      orb, "NotificationService", &env );               /* 1 */

    channel = CosNotifyChannelAdmin_EventChannelFactory_create_channel(
               factory, initial_qos, initial_admin, &channelID, &env ); /* 2 */

          .... 
    CosEventChannelAdmin_EventChannel_destroy(
              channel, &env )                                           /* 3 */
          .... 
}

  1. イベントファクトリのオブジェクトリファレンスをイニシャルサービスから獲得します。イニシャルサービスには、“NotificationService”を指定してください。

  2. CosNotifyChannelAdmin_EventChannelFactory_create_channel()メソッドでイベントファクトリにイベントチャネルの生成を指示します。イベントチャネルが生成されると、idにイベントチャネルの識別IDが指定されます。複数のプロセス間で同一のイベントチャネルのオブジェクトリファレンスを獲得するには、ノーティフィケーションサービスインタフェースのEventChannelFactoryインタフェースのget_event_channel()メソッドで同一の識別IDを指定して取得します。これにより、異なるプロセス間のイベント通信を行うことができます。

  3. イベントチャネルが不要である場合は、CosEventChannelAdmin_EventChannel_destroy()メソッドで、イベントチャネルを破壊します。


[イベントファクトリによるイベントチャネルの生成(C++言語の場合)]

CORBA::ORB_ptr                                      orb;
CORBA::Object_ptr                                   obj; 
CORBA::Environment                                  env; 
CosNotifyChannelAdmin::EventChannelFactory_ptr    factory; 
CosNotification::QoSProperties                     initial_qos; 
CosNotification::AdminProperties                   initial_admin; 
CosNotifyChannelAdmin::ChannelID                   id; 
CosNotifyChannelAdmin::EventChannel_ptr            event_ch; 

try {
    obj = orb->resolve_initial_references("NotificationService",env);  /* 1 */
    factory = CosNotifyChannelAdmin::EventChannelFactory::_narrow( obj ); 
    CORBA::release( obj ); 

    event_ch = factory->create_channel( &initial_qos, &initial_admin, &id, env );
                                                                       /* 2 */
        .... 
    event_ch->destroy( env );                                          /* 3 */
} catch( CORBA::Exception &e ) {
        .... 
}

  1. イベントファクトリのオブジェクトリファレンスをイニシャルサービスから獲得します。イニシャルサービスには、“NotificationService”を指定してください。

  2. CosNotifyChannelAdmin::EventChannelFactory::create_channel()メソッドでイベントファクトリにイベントチャネルの生成を指示します。イベントチャネルが生成されると、idにイベントチャネルの識別IDが指定されます。複数のプロセス間で同一のイベントチャネルのオブジェクトリファレンスを獲得するには、ノーティフィケーションサービスインタフェースのEventChannelFactoryインタフェースのget_event_channel()メソッドで同一の識別IDを指定して取得します。これにより、異なるプロセス間のイベント通信を行うことができます。

  3. イベントチャネルが不要である場合は、CosEventChannelAdmin::EventChannel::destroy()メソッドで、イベントチャネルを破壊します。