C++言語でのPullモデルのアプリケーションの開発について説明します。
(1)概要
イベントチャネル上のコンシューマがサプライヤからイベントデータを受信する場合、イベントチャネルのCosEventChannelAdmin::ProxyPullSupplierに接続指示を出します。イベントチャネルは、ユーザがサプライヤに実装したCosEventComm::PullSupplier::pull(またはtry_pull)メソッドを呼び出します。
本概要を以下の図に示します。

(2)サプライヤの作成
サプライヤは、イベントチャネルからイベントデータの要求を受け取るために、CosEventComm_PullSupplier_impl::pullメソッドを実装します。イベントチャネルは、サプライヤ上のCosEventComm::PullSupplier::pullメソッドを呼び出し、サプライヤにイベントデータを要求します。
サプライヤのCosEventComm::PullSupplier::pullメソッドを実装するまでの手続き例、および処理の流れを以下に示します。
[C++言語によるPullモデルのサプライヤ]
CORBA::Boolean func() {
...
try {
supplier = EventCh->for_suppliers( env ); /* 1 */
proxy_pull = supplier->obtain_pull_consumer( env ); /* 2 */
proxy_pull->connect_pull_supplier( my_obj, env ); /* 3 */
} catch( CORBA::Exception &e ) {
...
}
...
}
CORBA::Any *
CosEventComm_PullSupplier_impl::pull( /* 4 */
CORBA::Environment &env )
throw( CORBA::Exception ) {
CORBA::Any *any_data;
/* アプリケーションの処理 */
...
return( any_data );
}イベントチャネル管理オブジェクトのオブジェクトリファレンスを獲得します。
イベントチャネルのオブジェクトリファレンスを獲得します。
イベントチャネルと接続します。
ユーザがサプライヤ上に実装するCosEventComm_PullSupplier_impl::pullメソッドです。
(3)コンシューマの作成
コンシューマからイベントチャネルにイベントデータを要求する手続きの例、および処理の流れを以下に示します。
[C++言語によるPullモデルのコンシューマ]
CORBA::Boolean func() {
...
try {
consumer = EventCh->for_consumers( env ); /* 1 */
proxy_pull = consumer->obtain_pull_supplier( env ); /* 2 */
proxy_pull->connect_pull_consumer( my_obj, env ); /* 3 */
data = proxy_pull->pull( env ); /* 4 */
proxy_pull->disconnect_pull_supplier( env ); /* 5 */
} catch( CORBA::Exception &e ) {
...
}
...
}イベントチャネル管理オブジェクトのオブジェクトリファレンスを獲得します。
イベントチャネルのオブジェクトリファレンスを獲得します。
イベントチャネルと接続します。
イベントチャネルにCosEventChannelAdmin::ProxyPullSupplier::pullメソッドを発行します。
イベントチャネルと切断します。
[待ち合わせる場合]
コンシューマは、サプライヤからイベントデータを待ち合わせて引き出すには、以下のメソッドを使用します。イベントチャネルからイベントデータを取り出し、CORBA::Any型のreturn値を返します。イベントチャネルからイベントデータが取り出せるようになるか、または例外が発生するまでブロックされます。CosEventChannelAdmin::ProxyPullSupplierは、CosEventComm::PullSupplierを継承しています。
CORBA::Any *CosEventChannelAdmin::ProxyPullSupplier::pull(
CORBA::Environment& env );[待ち合わせない場合]
コンシューマは、サプライヤからイベントデータを待ち合わせないで引き出すには、以下のメソッドを使用します。イベントチャネルからイベントデータを取り出し、CORBA::Any型のreturn値を返します。イベントチャネルからイベントデータが取り出せない場合は、即座に復帰します。イベントデータが取り出せた場合は、has_eventにCORBA_TRUEが設定されます。イベントデータが取り出せなかった場合は、has_eventにCORBA_FALSEが設定されます。CosEventChannelAdmin::ProxyPullSupplierは、CosEventComm::PullSupplierを継承しています。
CORBA::Any *CosEventChannelAdmin::ProxyPullSupplier::try_pull(
CORBA::Boolean& has_event,
CORBA::Environment& env );