トピック・ストリングの使用
トピックは、トピック・オブジェクトで識別されるサブトピックから構成され、 サブトピックはアプリケーションによって提供されます。サブトピックをトピック名として使用するか、 サブトピックを組み合わせて新しいトピック名を形成することができます。
MQI プログラムでは、フル・トピック名は MQOPEN によって作成されます。 これは、パブリッシュ/サブスクライブ MQI 呼び出しで使用される 2 つのフィールドにより、次にリストする順序で構成されます。
- ObjectName フィールドで指定される、トピック・オブジェクトの TOPICSTR 属性。
- アプリケーションが提供するサブトピックを定義する ObjectString パラメーター。
結果のトピック・ストリングは ResObjectString パラメーターで戻されます。
各フィールドの最初の文字がブランクでもヌル文字でもなく、フィールド長がゼロより大きい場合に、これらのフィールドは存在すると見なされます。1 つのフィールドだけが存在する場合は、未変更のままトピック名として使用されます。 どちらのフィールドにも値が設定されていない場合、呼び出しは理由コード MQRC_UNKNOWN_OBJECT_NAME、または MQRC_TOPIC_STRING_ERROR (フル・トピック名が無効な場合) により失敗します。
両方のフィールドが存在する場合、結合された結果のトピック名の 2 つのエレメントの間に「/」文字が挿入されます。
表 1 は、トピック・ストリングの連結例を示しています。
| TOPICSTR | ObjectString | フル・トピック名 | コメント |
|---|---|---|---|
| Football/Scores | '' | Football/Scores | TOPICSTR は単独で使用される |
| '' | Football/Scores | Football/Scores | ObjectString は単独で使用される |
| Football | Scores | Football/Scores | '/' 文字が連結点に追加される |
| Football | /Scores | Football//Scores | 2 つのストリングの間に「空ノード」が生成される |
| /Football | Scores | /Football/Scores | トピックは「空ノード」で始まる |
「/」文字は、トピック・ツリー内でのフル・トピック名の構造を決める特殊文字と見なされます。 トピック・ツリーの構造に影響を与えるので、それ以外の目的では使用しないでください。 トピック「/Football」は、トピック「Football」と同じではありません。
以下のワイルドカード文字が特殊文字です。
- 正符号「+」
- 番号記号「#」
- アスタリスク「*」
- 疑問符「?」
コード・スニペットの例
このコード・スニペットは、サンプル・プログラムの例 2: 可変トピックへのパブリッシャーから抽出したもので、トピック・オブジェクトと可変トピック・ストリングを結合しています。MQOD td = {MQOD_DEFAULT}; /* Object Descriptor */
td.ObjectType = MQOT_TOPIC; /* Object is a topic */
td.Version = MQOD_VERSION_4; /* Descriptor needs to be V4 */
strncpy(td.ObjectName, topicName, MQ_TOPIC_NAME_LENGTH);
td.ObjectString.VSPtr = topicString;
td.ObjectString.VSLength = (MQLONG)strlen(topicString);
td.ResObjectString.VSPtr = resTopicStr;
td.ResObjectString.VSBufSize = sizeof(resTopicStr)-1;
MQOPEN(Hconn, &td, MQOO_OUTPUT | MQOO_FAIL_IF_QUIESCING, &Hobj, &CompCode, &Reason);
資料