コンシューマアプリケーションがイベントデータの待合せ中に異常終了した場合、イベントチャネル側では、イベントデータの待合せ状態は同時に解除されません。この状態でコンシューマアプリケーションを再起動し、同じ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(¤t_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 */
退避したproxyのオブジェクトリファレンスを復元します。
退避したutilのオブジェクトリファレンスを復元します。
proxyのイベントデータの待合せ状態を解除します。
受信要求を発行します。
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 */
退避したproxyのオブジェクトリファレンスを復元します。
退避したutilのオブジェクトリファレンスを復元します。
proxyのイベントデータの待合せ状態を解除します。
受信要求を発行します。
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 */
退避したproxyのオブジェクトリファレンスを復元します。
退避したutilのオブジェクトリファレンスを復元します。
proxyのイベントデータの待合せ状態を解除します。
受信要求を発行します。
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 */
退避したPROXYのオブジェクトリファレンスを復元します。
退避したUTILのオブジェクトリファレンスを復元します。
PROXYのイベントデータの待合せ状態を解除します。
受信要求を発行します。