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 呼び出しを再発行することによって、 この問題を回避することができます。
このプロパティーは、指定する必要があります。
このプロパティーは、複数のトピックの登録解除時に任意で繰り返すことができます。 これは、DeregAll が <RegOpt> に指定されている場合は省略可能です。
サブスクライバーが他のトピックについてのサブスクリプションを保存したい場合、 指定したトピックは、登録したトピックのサブセットにすることができます。 ワイルドカード文字も使用できますが、ワイルドカード文字を使用しているトピック・ストリングは、 Register Subscriber コマンド・メッセージで指定された対応するストリングに、 正確に一致していなければなりません。
デフォルトのサブスクリプション・ポイントは、明示的に指定できないことに注意してください。 したがって、このサブスクリプション・ポイントだけからのすべてのサブスクリプションの登録解除は不可能なので、トピックを指定しなければなりません。
サブスクリプションの ID セット内に SubIdentity がある場合、それはセットから除去されます。それが原因で ID セットが空になった場合に、RegOpt プロパティーの値として LeaveOnly が指定されていないと、サブスクリプションはブローカーから除去されます。他の ID がまだ ID セット内に残っている場合、サブスクリプションはブローカーから除去されることはなく、パブリケーション・フローは中断されません。
SubIdentity が指定されたが、サブスクリプションの ID セット内に SubIdentity がない場合、Deregister Subscriber コマンドは戻りコード MQRCCF_SUB_IDENTITY_ERROR で失敗します。
このプロパティーは、複数のフィルターが登録解除される場合、任意で繰り返すことができます。 これは、<Topic> が指定される場合、または DeregAll が <RegOpt> で指定される場合は省略できます。
サブスクライバーが他のフィルターについてのサブスクリプションを保存したい場合、 指定したフィルターは、登録したフィルターのサブセットにすることができます。
このサブスクライバーについて登録されたすべての一致するサブスクリプションは、 登録解除されます。
メッセージ記述子 (MQMD) の CorrelId は、 ゼロにすることはできず、サブスクライバーを識別するために使用されます。これは、元のサブスクリプションで使用される CorrelId と一致しなければなりません。
FullResp を指定した場合に、コマンドが失敗しなければ、サブスクリプションのすべての属性が応答メッセージで戻されます。
FullResp を指定すると、 Deregister Subscriber コマンドでは DeregAll を使用できません。 複数のトピックを指定することもできません。どちらの場合も、 戻りコード MQRCCF_REG_OPTIONS_ERROR でコマンドは失敗します。
サブスクリプションの ID セット内にある SubIdentity を使ってこれを指定すると、そのサブスクリプションの ID セットから SubIdentity が除去されます。結果の ID セットが空であっても、サブスクリプションがブローカーから除去されることはありません。ID セット内に SubIdentity 値がないと、コマンドは戻りコード MQRCCF_SUB_IDENTITY_ERROR で失敗します。
SubIdentity を使わないで LeaveOnly を指定すると、 コマンドは戻りコード MQRCCF_REG_OPTIONS_ERROR で失敗します。
LeaveOnly も SubIdentity も指定しないと、サブスクリプションの ID セットの内容に関係なくサブスクリプションは除去されます。
すべてのオプションがデフォルト値を取ります。 これは、登録オプション・プロパティーを省略するのと同じことです。 他のオプションが同時に指定された場合、None は無視されます。
指定された場合、サブスクライバー (キュー、キュー・マネージャー、および correlid) の ID は、単一のユーザー ID に制限されません。 これはブローカーのこれまでの振る舞いとは異なります。これまでの振る舞いでは、元の登録メッセージのユーザー ID がサブスクライバーの ID に関連付けられ、以後は他のユーザーはその ID を使用できなくなります。 よって、新規のサブスクライバーが同じ ID の使用を試みると、 戻りコード MQRCCF_DUPLICATE_SUBSCRIPTION が戻されます。
どのユーザーでも、適切な権限があればサブスクリプションを変更または登録解除することができ、そのユーザー ID が、元のサブスクライバーのユーザー ID に一致するかどうかの従来どおりの検査を受けなくて済みます。
このオプションを既存のサブスクリプションに追加するには、コマンドが、元のサブスクリプションそのものと同じユーザー ID に由来するものでなければなりません。
登録解除するサブスクリプションに VariableUserId が設定されている場合、これを登録解除時に設定して、どのサブスクリプションを登録解除するかを指示する必要があります。設定されていない場合は、Deregister Subscriber コマンドのユーザー ID から、 サブスクリプションの ID が識別されます。サブスクリプション名を指定すれば、上記の設定は他のサブスクライバー ID と一緒にオーバーライドされます。
このプロパティーが省略されると、デフォルトとなって登録オプションは設定されません。
このプロパティーが省略されると、デフォルトは、 メッセージ記述子 (MQMD) の ReplyToQMgr 名になります。その結果の名前がブランクである場合、デフォルトでブローカーのキュー・マネージャー名になります。
このプロパティーを省略した場合、デフォルトは、 メッセージ記述子 (MQMD) 内の ReplyToQ 名になり、 ブランクであってはなりません。
このコマンドの従来の ID に一致するサブスクリプションが存在しても、 SubName が指定されていないと、 Deregister Subscriber コマンドは戻りコード MQRCCF_SUB_NAME_ERROR で失敗します。 従来の ID に一致していて、SubName の指定されていないコマンド・メッセージを使って、SubName を指定されたサブスクリプションの登録解除を試みた場合、コマンドは正常に完了します。
SubUserData は、サブスクリプションの Metatopic 情報 (MQCACF_REG_SUB_USER_DATA) があれば、そこに戻されます。