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

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. 受信要求を発行します。