Interstage Application Server アプリケーション作成ガイド (イベントサービス編)
目次 索引 前ページ次ページ

第4章 アプリケーションの開発(各機能)> 4.2 イベント通信のアプリケーション開発

4.2.5 要求中の受信処理のキャンセル方法

 コンシューマアプリケーションがイベントデータの待合せ中に異常終了した場合、イベントチャネル側では、イベントデータの待合せ状態は同時に解除されません。この状態でコンシューマアプリケーションを再起動し、同じproxyオブジェクトを使用して再度受信要求を行った場合、受信要求を2重に発行することになるため、システム例外BAD_PARAMおよびマイナーコード0x464a09e5が返ることがあります。
 本現象を回避するためには、受信要求を発行する前にpull_cancel()を発行し、イベントデータの待合せ状態を解除する必要があります。
 以下に、イベントデータの待合せ状態を解除するアプリケーション作成例と処理の流れを説明します。この例では、あらかじめ永続化しておいたproxyおよびutilの情報からオブジェクトリファレンスを再作成し、受信処理を継続する方法について説明しています。

■C言語の場合

  CORBA_ORB orb;
  CosNotifyChannelAdmin_StructuredProxyPullSupplier proxy;
  ES_ChannelUtil util;
  CosNotification_StructuredEvent* recv;
                   :
  orb = CORBA_ORB_init(&current_argc, argv, FJ_OM_ORBid, &env);
                   :
  proxy = CORBA_ORB_string_to_object(orb, proxyStr, &env);               /* 1 */
  util = CORBA_ORB_string_to_object(orb, utilStr, &env);                 /* 2 */
  ES_ChannelUtil_pull_cancel(util, proxy, &env);                         /* 3 */
  recv = CosNotifyChannelAdmin_StructuredProxyPullSupplier_pull_structured_event(proxy, &env);  /* 4 */
  1. 退避したproxyのオブジェクトリファレンスを復元します。
  2. 退避したutilのオブジェクトリファレンスを復元します。
  3. proxyのイベントデータの待合せ状態を解除します。
  4. 受信要求を発行します。

■C++言語の場合

  CORBA::ORB_ptr orb = CORBA::ORB_init(current_argc, argv, (CORBA::ORBid)FJ_OM_ORBid, env);
                   :
  CORBA::Object_ptr proxyObj = orb->string_to_object(proxyStr, env);
  CosNotifyChannelAdmin::StructuredProxyPullSupplier_ptr proxy =
    CosNotifyChannelAdmin::StructuredProxyPullSupplier::_narrow(proxyObj);    /* 1 */
  CORBA::Object_ptr utilObj = orb->string_to_object(utilStr, env);
  ES::ChannelUtil_ptr util = ES::ChannelUtil::_narrow(utilObj);               /* 2 */
  util->pull_cancel(proxy, env);                                              /* 3 */
  CosNotification::StructuredEvent* recv = proxy->pull_structured_event(env); /* 4 */
  1. 退避したproxyのオブジェクトリファレンスを復元します。
  2. 退避したutilのオブジェクトリファレンスを復元します。
  3. proxyのイベントデータの待合せ状態を解除します。
  4. 受信要求を発行します。

■Java言語の場合

  import org.omg.CosNotifyChannelAdmin.*;
  import org.omg.CosNotification.*;
  import com.fujitsu.ObjectDirector.EventService.ES.*;
                   :
  org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
                   :
  org.omg.CORBA.Object proxyObj = orb.string_to_object(proxyString);
  StructuredProxyPullSupplier proxy = 
    StructuredProxyPullSupplierHelper.narrow(proxyObj);                  /* 1 */
  org.omg.CORBA.Object utilObj = orb.string_to_object(utilString);
  ChannelUtil util = ChannelUtilHelper.narrow(utilObj);                  /* 2 */
  util.pull_cancel(proxy);                                               /* 3 */
  StructuredEvent recv = proxy.pull_structured_event();                  /* 4 */
  1. 退避したproxyのオブジェクトリファレンスを復元します。
  2. 退避したutilのオブジェクトリファレンスを復元します。
  3. proxyのイベントデータの待合せ状態を解除します。
  4. 受信要求を発行します。

■COBOLの場合

  WORKING-STORAGE SECTION.
  01 COPY ORB IN CORBA REPLACING CORBA-ORB BY ORB.
  01 TMP-BUF USAGE IS POINTER.
  01 COPY ULONG IN CORBA REPLACING CORBA-UNSIGNED-LONG BY STRING-LENGTH.
  01 FILE-BUF-PRT USAGE IS POINTER.
  01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV.
  01 COPY NOTIFYSTRUCTUREDPROXYPULLSUP IN COSEVENTCOMM REPLACING COSNOTIFYCHANNELADMIN-STRUC001 BY PROXYPULLSUP.
  01 COPY CHANNELUTIL IN COSEVENTCOMM REPLACING ES-CHANNELUTIL BY CHNLUTIL.
  01 RECV USAGE IS POINTER.
                   :
  MOVE FUNCTION LENG (FJ-OM-ORB-ID) TO STRING-LENGTH.
  CALL "CORBA-STRING-SET" USING TMP-BUF STRING-LENGTH FJ-OM-ORB-ID.
  CALL "CORBA-ORB-INIT" USING CURRENT-ARG-C CURRENT-ARG-V TMP-BUF ENV ORB.
                   :
  CALL "CORBA-ORB-STRING-TO-OBJECT" USING
            ORB
            FILE-BUF-PRT
            ENV
            PROXYPULLSUP.                                                /* 1 */
  CALL "CORBA-ORB-STRING-TO-OBJECT" USING
            ORB
            FILE-BUF-PRT
            ENV
            CHNLUTIL.                                                    /* 2 */
  CALL "ES-CHANNELUTIL-PULL-CANCEL" USING
            CHNLUTIL
            PROXYPULLSUP
            ENV.                                                         /* 3 */
  CALL "COSNOTIFYCHANNELADMIN-STRUCTUREDPROXYPULLSUPPLIER-PULL-STRUCTURED-EVENT" USING
            STRPROXYPULLSUP
            ENV
            RECV.                                                        /* 4 */
  1. 退避したPROXYのオブジェクトリファレンスを復元します。
  2. 退避したUTILのオブジェクトリファレンスを復元します。
  3. PROXYのイベントデータの待合せ状態を解除します。
  4. 受信要求を発行します。

目次 索引 前ページ次ページ

Copyright 2008 FUJITSU LIMITED