ワイルドカード
トピック・ベースのワイルドカードを使用すると、サブスクライバーは、類似するトピック・ストリングを持つトピックからなるグループにサブスクライブできます。
パブリッシュ/サブスクライブでは、特別な意味を持つ 3 つの文字があります。 これらの文字はスラッシュ (/)、番号記号 (#)、および正符号 (+) です。 スラッシュ (/) について詳しくは、トピック・ストリングを参照してください。
JMS トピックでは、これらの文字はトピック・ストリング内のどこにあってもかまいませんが、使用にあたって注意が必要です。
MQTT トピックでは、番号記号 (#) と正符号 (+) をパブリッシュ・トピックで使用することはできません。 サブスクライブ・トピックでは、番号記号 (#) を使用できるのはトピック・ストリングの最後の文字としてのみで、そのレベルではその文字だけを単独で使用する必要があります。
- 番号記号 (#)
サブスクリプションでマルチレベル・ワイルドカードを構成する場合に '/' と組み合わせて使用します。 パブリッシュされた JMS トピックの指定に使用するトピック・ストリングで '/' の隣に '#' を使用する場合は、注意が必要です。
- 正符号 (+)
サブスクリプションで単一レベル・ワイルドカードを構成する場合に '/' と組み合わせて使用。
マルチレベル・ワイルドカードと単一レベル・ワイルドカードをサブスクリプションに使用できますが、メッセージのパブリッシャーがトピック内で使用することはできません。
- "Sport/Tennis/Finals"
- "Sport/Basketball/Finals"
- "Sport/Swimming/Finals"
ワイルドカードには、以下の 2 種類があります。
- マルチレベル・ワイルドカード
- マルチレベル・ワイルドカードは、サブスクリプションで使用されます。
- マルチレベル・ワイルドカード文字 '#' は、トピック内のレベルをいくつでも一致させる場合に使用します。 例えば、この例のトピック・ツリーを使用すると、'Sport/Tennis/#' にサブスクライブした場合は、トピック 'Sport/Tennis' および 'Sport/Tennis/Finals' に関するメッセージを受け取ります。
- マルチレベル・ワイルドカードはゼロ個以上のレベルを表現することができます。 そのため、'Sport/#' は単独の 'Sport' とも一致します (この場合の '#' はゼロ個のレベルを表します)。 このコンテキストでは、トピック・レベル分離文字は意味を持ちません。分離するレベルがないからです。
- マルチレベル・ワイルドカードは、単独で指定された場合、またはトピック・レベル分離文字に続いて指定された場合のみ有効です。 したがって、'#' と 'Sport/#' は有効なトピックです。この場合、'#'文字はワイルドカードとして扱われます。 JMS トピックでは、'Sport#' も有効なトピック・ストリングですが、この場合の '#' 文字はワイルドカードと見なされず、特別な意味を持ちません。 詳細については、トピック・ベースのワイルドカードが無効な場合を参照してください。MQTT トピックでは、マルチレベル・ワイルドカードを使用できるのはトピック・ストリングの最後の文字としてのみで、そのレベルではその文字だけを単独で使用する必要があります。
- 単一レベル・ワイルドカード
- 単一レベル・ワイルドカードは、サブスクリプションで使用されます。
- 単一レベル・ワイルドカード文字 '+' は、トピック・レベルが 1 つだけ一致します。 例えば、'Sport/+' は 'Sport/Tennis' に一致しますが、'Sport/Tennis/Finals' には一致しません。 単一レベル・ワイルドカードは単一レベルのみと一致するため、'Sport/+' は 'Sport' に一致しません。
- JMS トピックおよび MQTT トピックでは、単一レベル・ワイルドカードはトピック・ツリー内のどのレベルでも使用できます。 単一レベル・ワイルドカードは、単独で指定する場合を除いて、トピック・レベル分離文字に続いて指定する必要があります。 したがって、'+' と 'Sport/+' は有効なトピックです。この場合、'+'文字はワイルドカードとして扱われます。 JMS トピックでは、'Sport+' は有効なトピック・ストリングですが、'+' 文字はワイルドカードと見なされず、特別な意味を持ちません。 詳しくは、トピック・ベースのワイルドカードが無効な場合のセクションを参照してください。
ワイルドカードの使用例
ワイルドカードの使用法を示す以下の例は、トピック・ストリングで示されている例に基づいています。
- "Sport"
- "Sport/Tennis"
- "Sport/Basketball"
- "Sport/Swimming"
- "Sport/Tennis/Finals"
- "Sport/Basketball/Finals"
- "Sport/Swimming/Finals"
すべての Tennis トピックにサブスクライブするには、番号記号 '#' または正符号 '+' を使用できます。
- "Sport/Tennis/#" (これにより "Sport/Tennis" および "Sport/Tennis/Finals" を受け取ります)
- "Sport/Tennis/+" (これにより "Sport/Tennis/Finals" を受け取りますが、"Sport/Tennis" は受け取りません)
JMS トピックの場合、すべての Finals トピックにサブスクライブするには、番号記号 '#' または正符号 '+' を使用できます。
- "Sport/#/Finals"
- "Sport/+/Finals"
MQTT トピックの場合、すべての Finals トピックにサブスクライブするには、正符号 '+' を使用できます。
- "Sport/+/Finals"
トピック・ベースのワイルドカードが無効な場合
ワイルドカード文字の '+' と '#' は、あるトピック・レベル内で他の文字 (それら自身を含む) と混用されると、特別な意味を持たなくなります。
そのため、JMS トピックの場合、あるトピック・レベル内に '+' または '#' が他の文字と共に含まれるようなトピックをパブリッシュすることが可能です。
以下の 2 つの JMS トピックがあるとします。
- level0/level1/+/level4/#
- level0/level1/#+/level4/level#
最初の例では、'+' および '#' 文字はワイルドカードとして扱われるので、パブリッシュのトピック・ストリングでは無効ですが、サブスクリプションでは有効です。
2 番目の例では、'+' および '#' 文字はワイルドカードとして扱われないので、パブリッシュとサブスクライブの両方のトピック・ストリングにすることができます。
MQTT トピックについては、以下の例を考慮してください。
- level0/level1/+/level4/#
- level0/level1/#/level4/level+
最初の例では、文字 '+' および '#' がワイルドカードとして扱われるため、パブリッシュされるトピック・ストリングの中では無効ですが、サブスクリプションでは有効です。
2 番目の例では、文字 '+' がトピック・レベル内の唯一の文字ではありません。 '#' 文字は、トピック・ストリング内の最後の文字ではありません。 したがって、このトピック・ストリングはパブリッシュもサブスクライブもできません。
次の表のトピック・ストリングの例では、MQTT および JMS のパブリッシュ/サブスクライブでこれらのストリングが有効であるかどうかを示します。
トピック・ストリング | MQTT サブスクライブ | MQTT パブリッシュ | JMS サブスクライブ | JMS パブリッシュ |
---|---|---|---|---|
# | はい | いいえ | はい | いいえ |
+ | はい | いいえ | はい | いいえ |
/# | はい | いいえ | はい | いいえ |
/+ | はい | いいえ | はい | いいえ |
## | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
++ | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
#/# | いいえ | いいえ | はい | いいえ |
+/+ | はい | いいえ | はい | いいえ |
topic# | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic+ | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic/# | はい | いいえ | はい | いいえ |
topic/+ | はい | いいえ | はい | いいえ |
topic## | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic++ | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic/## | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic/++ | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
topic#/# | いいえ | いいえ | はい | いいえ |
topic+/+ | いいえ | いいえ | はい | いいえ |
topic/#/# | いいえ | いいえ | はい | いいえ |
topic/+/+ | はい | いいえ | はい | いいえ |
#topic | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
+topic | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
#/topic | いいえ | いいえ | はい | いいえ |
+/topic | はい | いいえ | はい | いいえ |
/#topic | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
/+topic | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |
/ | はい | はい | はい | はい |
topic/#/topic | いいえ | いいえ | はい | いいえ |
top+ic | いいえ | いいえ | はい (ワイルドカードではない) | はい (ワイルドカードではない) |