Deregister Subscriber メッセージ

Deregister Subscriber コマンド・メッセージは、 サブスクライバーまたはサブスクライバーに代わる別のアプリケーションから、ブローカーに送信され、 特定のパラメーターに一致するメッセージをそれ以上受け取る意思のないことを示します。

このメッセージは、ブローカーの制御キュー SYSTEM.BROKER.CONTROL.QUEUE に送信されます。 このキューにメッセージを入れる権限がユーザーになければなりません。

ブローカーにコマンド・メッセージを送信する時に必要なメッセージ記述子 (MQMD) パラメーターの詳細については、 ブローカーへのコマンド・メッセージでの MQMD の設定を参照してください。

個々のサブスクリプションを登録解除するには、元のサブスクリプションの対応するトピック、 サブスクリプション・ポイント、およびフィルターの各値を指定します。 元のサブスクリプションでどの値も指定しなかった (つまりデフォルト値をとった) 場合、サブスクリプションの登録解除時にそれらの値を省略しなければなりません。

DeregAll オプションを使うと、サブスクライバーまたはサブスクライバー・グループのすべてのサブスクリプションを登録解除することができます。例えば、DeregAll をサブスクリプション・ポイントと一緒に指定すると (トピックまたはフィルターは指定しない)、指定したサブスクリプション・ポイントのサブスクライバー用のすべてのサブスクリプションが、トピックおよびフィルターに関係なく登録解除されます。トピック、フィルター、およびサブスクリプション・ポイントは、どのように組み合わせても構いません。この 3 つをすべて指定すると、突き合わせられるサブスクリプションは 1 つだけなので、DeregAll は無視されます。

メッセージは、サブスクリプションを登録したサブスクライバーによって送信されなければなりません。それは、サブスクライバーのユーザー ID を調べて確認します。

また、システム管理者がサブスクリプションを登録解除することもできます。 ただし、一時動的キューで登録されたサブスクリプションは、 単にキュー名と関連付けられるだけでなく、キューと関連付けられます。 キューが明示的に削除されるか、またはキュー・マネージャーからのアプリケーションの切断によって削除されると、Deregister Subscriber コマンドを使用してそのキューからサブスクリプションを登録解除できなくなります。サブスクリプションは、ワークベンチを使って登録解除することができますが、次にブローカーがパブリケーションをサブスクリプションに突き合わせたときか、または次にブローカーが再始動したときに、ブローカーによって自動的に除去されます。標準的な状況下では、アプリケーションはそのサブスクリプションを、キューを削除する前、またはキュー・マネージャーから切断する前に登録解除する必要があります。

サブスクライバーがサブスクリプションを登録解除するためのメッセージを送信して、それが正常に処理されたことを示す応答メッセージを受け取っても、パブリケーションによっては、サブスクリプションの登録解除と同時にブローカーによって処理されていた場合、今までどおりにサブスクライバー・キューに送られてくることがあります。 このようにメッセージがキューから除去されないと、サブスクライバー・キュー上に未処理メッセージが山積することがあります。 この場合はアプリケーションで、しばらくのスリープの後に適切な CorrelId を指定した MQGET 呼び出しを組み込んだループを実行すれば、そのような未処理メッセージはキューから消去されます。SCADA デバイス・プロトコルを使用する場合、clean start と finish のオプションがあります。 つまり、クライアントのメッセージは消去されるということです。

同様に、サブスクライバーが永続動的キューを使用して、MQCLOSE 呼び出しの MQCO_DELETE_PURGE オプションでキューを登録解除してクローズしても、キューが空になっていないことがあります。 キューの削除時にブローカーのいずれかのパブリケーションがコミット済みでないと、MQCLOSE 呼び出しから MQRC_Q_NOT_EMPTY 戻りコードが発行されます。 アプリケーションは、時折スリープして MQCLOSE 呼び出しを再発行することによって、 この問題を回避することができます。

プロパティー

<Command> (MQPSC_COMMAND)
値は、DeregSub (MQPSC_DEREGISTER_SUBSCRIBER) です。

このプロパティーは、指定する必要があります。

<Topic> (MQPSC_TOPIC)
値は、登録解除されるトピックを含むストリングです。

このプロパティーは、複数のトピックの登録解除時に任意で繰り返すことができます。 これは、DeregAll<RegOpt> に指定されている場合は省略可能です。

サブスクライバーが他のトピックについてのサブスクリプションを保存したい場合、 指定したトピックは、登録したトピックのサブセットにすることができます。 ワイルドカード文字も使用できますが、ワイルドカード文字を使用しているトピック・ストリングは、 Register Subscriber コマンド・メッセージで指定された対応するストリングに、 正確に一致していなければなりません。

<SubPoint> (MQPSC_SUBSCRIPTION_POINT)
値は、 サブスクリプションの切り離し地点であるサブスクリプション・ポイントを指定するストリングです。
このプロパティーは繰り返すことができません。 これは、<Topic> が指定される場合、または DeregAll<RegOpt> で指定される場合は省略できます。このプロパティーを省略すると、以下のことが起きます。
  • DeregAll を指定しないと、<Topic> プロパティー (および、もしあれば <Filter> プロパティー) に一致するサブスクリプションが、デフォルトのサブスクリプション・ポイントから登録解除されます。
  • DeregAll を指定する場合、すべてのサブスクリプション (<Topic> および <Filter> プロパティーがあればそれに一致する) は、すべてのサブスクリプション・ポイントから登録解除されます。

デフォルトのサブスクリプション・ポイントは、明示的に指定できないことに注意してください。 したがって、このサブスクリプション・ポイントだけからのすべてのサブスクリプションの登録解除は不可能なので、トピックを指定しなければなりません。

<SubIdentity> (MQPSC_SUBSCRIPTION_IDENTITY)
これは、最大長 64 文字の可変長ストリングです。 これは、サブスクリプションと関係するアプリケーションを表すのに使用します。 ブローカーは、サブスクリプションごとに一連のサブスクライバー ID を保守しています。 どのサブスクリプションでも、ID セット内で、単一の ID だけの保管または無制限の数の ID の保管を行うことができます。

サブスクリプションの ID セット内に SubIdentity がある場合、それはセットから除去されます。それが原因で ID セットが空になった場合に、RegOpt プロパティーの値として LeaveOnly が指定されていないと、サブスクリプションはブローカーから除去されます。他の ID がまだ ID セット内に残っている場合、サブスクリプションはブローカーから除去されることはなく、パブリケーション・フローは中断されません。

SubIdentity が指定されたが、サブスクリプションの ID セット内に SubIdentity がない場合、Deregister Subscriber コマンドは戻りコード MQRCCF_SUB_IDENTITY_ERROR で失敗します。

<Filter> (MQPSC_FILTER)
値は、登録解除されるフィルターを指定するストリングです。 これは、大/小文字の区別やスペース、および事前に登録済みのサブスクリプション・フィルターなどに関して完全に一致しなければなりません。

このプロパティーは、複数のフィルターが登録解除される場合、任意で繰り返すことができます。 これは、<Topic> が指定される場合、または DeregAll<RegOpt> で指定される場合は省略できます。

サブスクライバーが他のフィルターについてのサブスクリプションを保存したい場合、 指定したフィルターは、登録したフィルターのサブセットにすることができます。

<RegOpt> (MQPSC_REGISTRATION_OPTION)
登録オプション・プロパティーは、 以下の値を取ることができます。
DeregAll  
(MQPSC_DEREGISTER_ALL)

このサブスクライバーについて登録されたすべての一致するサブスクリプションは、 登録解除されます。

DeregAll を指定する場合、以下のようになります。
  • <Topic><SubPoint>、および<Filter> は省略できる。
  • <Topic> および<Filter> は、必要に応じて繰り返すことができる。
  • <SubPoint> は繰り返すことができない。
DeregAll を指定しない場合、以下のようになります。
  • <Topic> を指定する必要があり、必要に応じて繰り返すことができる。
  • <SubPoint> および<Filter> は省略できる。
  • <SubPoint> は繰り返すことができない。
  • <Filter> を必要に応じて繰り返すことができる。
CorrelAsId  
(MQPSC_CORREL_ID_AS_IDENTITY)

メッセージ記述子 (MQMD) の CorrelId は、 ゼロにすることはできず、サブスクライバーを識別するために使用されます。これは、元のサブスクリプションで使用される CorrelId と一致しなければなりません。

FullResp  
()

FullResp を指定した場合に、コマンドが失敗しなければ、サブスクリプションのすべての属性が応答メッセージで戻されます。

FullResp を指定すると、 Deregister Subscriber コマンドでは DeregAll を使用できません。 複数のトピックを指定することもできません。どちらの場合も、 戻りコード MQRCCF_REG_OPTIONS_ERROR でコマンドは失敗します。

LeaveOnly  
(MQPSC_LEAVE_ONLY)

サブスクリプションの ID セット内にある SubIdentity を使ってこれを指定すると、そのサブスクリプションの ID セットから SubIdentity が除去されます。結果の ID セットが空であっても、サブスクリプションがブローカーから除去されることはありません。ID セット内に SubIdentity 値がないと、コマンドは戻りコード MQRCCF_SUB_IDENTITY_ERROR で失敗します。

SubIdentity を使わないで LeaveOnly を指定すると、 コマンドは戻りコード MQRCCF_REG_OPTIONS_ERROR で失敗します。

LeaveOnlySubIdentity も指定しないと、サブスクリプションの ID セットの内容に関係なくサブスクリプションは除去されます。

None  
(MQPSC_NONE)

すべてのオプションがデフォルト値を取ります。 これは、登録オプション・プロパティーを省略するのと同じことです。 他のオプションが同時に指定された場合、None は無視されます。

VariableUserId  
(MQPSC_VARIABLE_USER_ID)

指定された場合、サブスクライバー (キュー、キュー・マネージャー、および correlid) の ID は、単一のユーザー ID に制限されません。 これはブローカーのこれまでの振る舞いとは異なります。これまでの振る舞いでは、元の登録メッセージのユーザー ID がサブスクライバーの ID に関連付けられ、以後は他のユーザーはその ID を使用できなくなります。 よって、新規のサブスクライバーが同じ ID の使用を試みると、 戻りコード MQRCCF_DUPLICATE_SUBSCRIPTION が戻されます。

どのユーザーでも、適切な権限があればサブスクリプションを変更または登録解除することができ、そのユーザー ID が、元のサブスクライバーのユーザー ID に一致するかどうかの従来どおりの検査を受けなくて済みます。

このオプションを既存のサブスクリプションに追加するには、コマンドが、元のサブスクリプションそのものと同じユーザー ID に由来するものでなければなりません。

登録解除するサブスクリプションに VariableUserId が設定されている場合、これを登録解除時に設定して、どのサブスクリプションを登録解除するかを指示する必要があります。設定されていない場合は、Deregister Subscriber コマンドのユーザー ID から、 サブスクリプションの ID が識別されます。サブスクリプション名を指定すれば、上記の設定は他のサブスクライバー ID と一緒にオーバーライドされます。

このプロパティーが省略されると、デフォルトとなって登録オプションは設定されません。

<QMgrName> (MQPSC_Q_MGR_NAME)
値は、サブスクライバー・キューのキュー・マネージャー名です。 これは、元のサブスクリプションで使用される QMgrName と一致しなければなりません。

このプロパティーが省略されると、デフォルトは、 メッセージ記述子 (MQMD) の ReplyToQMgr 名になります。その結果の名前がブランクである場合、デフォルトでブローカーのキュー・マネージャー名になります。

<QName> (MQPSC_Q_NAME)
値は、サブスクライバー・キューの名前です。 これは、元のサブスクリプションで使用される QName と一致しなければなりません。

このプロパティーを省略した場合、デフォルトは、 メッセージ記述子 (MQMD) 内の ReplyToQ 名になり、 ブランクであってはなりません。

<SubName> (MQPSC_SUBSCRIPTION_NAME)
Deregister Subscriber コマンドに SubName を指定すると、サブスクリプションそのものに VariableUserId が設定されていないかぎり、ユーザー ID 以外のすべての他の ID フィールドよりも SubName 値が優先されます。 VariableUserId が設定されていない場合に Deregister Subscriber コマンドが正常に完了するのは、コマンド・メッセージのユーザー ID がサブスクリプションのユーザー ID に一致する場合だけであり、 もし一致しないと、コマンドは戻りコード MQRCCF_DUPLICATE_IDENTITY で失敗します。

このコマンドの従来の ID に一致するサブスクリプションが存在しても、 SubName が指定されていないと、 Deregister Subscriber コマンドは戻りコード MQRCCF_SUB_NAME_ERROR で失敗します。 従来の ID に一致していて、SubName の指定されていないコマンド・メッセージを使って、SubName を指定されたサブスクリプションの登録解除を試みた場合、コマンドは正常に完了します。

<SubUserData> (MQPSC_SUBSCRIPTION_USER_DATA)
これは可変長のテキスト・ストリングです。 この値は、サブスクリプションと一緒にブローカーによって保管されますが、サブスクライバーへのパブリケーションの送達には影響を与えません。 この値を更新するには、別の値を使って同じサブスクリプションに再登録します。この属性は、アプリケーションで使用するためにあります。

SubUserData は、サブスクリプションの Metatopic 情報 (MQCACF_REG_SUB_USER_DATA) があれば、そこに戻されます。

以下に、Deregister Subscriber コマンド・メッセージの NameValueData の例を示します。 この例ではサンプル・アプリケーションは、 すべての試合の最新のスコアが入っているトピックのサブスクリプションを登録解除します。 サブスクライバーの ID は、CorrelId を含め、MQMD のデフォルトから取られます。
 <psc>
  <Command>DeregSub</Command>
  <RegOpt>CorrelAsId</RegOpt>
  <Topic>Sport/Soccer/State/LatestScore/#</Topic>
 </psc>
特記事項 | 商標 | ダウンロード | ライブラリー | サポート | フィードバック
Copyright IBM Corporation 1999, 2006 最終更新: 08/21/2006
aq06970_