MQTT Connector を使用したクライアント ID の設定

クライアント ID は MQTT ブローカーへの接続を識別するため MQTT にとって重要です。また、クライアント ID は特定のデバイスまたはクライアントを識別するため、トレーサビリティの観点で、ブローカーへのデバイスの接続を明確に識別するクライアント ID を設定することをお勧めします。

通常、MQTT ブローカーでは、既存の (古い) 接続と同じクライアント ID を使用する新しい接続要求を受信した場合に古い接続を閉じて新しい接続を受け入れるメカニズムが実装されます。MQTT ブローカーはこのメカニズムを使用して、通信の一方の端のクラッシュにより TCP 接続がハーフオープン状態または無効な状態 (望ましくない状態) に達するような状況を回避します。ブローカーは新しい受信接続を有効とみなし、古い接続を閉じて新しく確立された接続を引き続き使用します。

アプリケーションをクラスターにデプロイし、クライアントを識別する明示的なクライアント ID を提供する場合、このクライアントテークオーバーメカニズムが問題になる可能性があります。MQTT 用 Anypoint Connector (MQTT Connector) により提供されるクライアント ID ジェネレーターを使用して、ユーザーは静的クライアント ID を設定したり、動的コンポーネントを使用するクライアント ID を設定してさまざまなデプロイメントシナリオに対応したり、カスタムクライアント ID ジェネレーターを定義したりできます。

クライアント ID カスタム式ジェネレーターの設定

このジェネレーターを使用すると、静的文字列プレフィックスと式をサフィックスとして設定できます。どちらのパラメーターも省略可能ですが、クライアント ID を生成するには少なくとも 1 つのパラメーターを指定する必要があります。パラメーターを何も指定しない場合、​INVALID_CLIENT_ID​ 例外がスローされます。

次の例では、クライアント ID 文字列の末尾に現在の日付を含めるように設定し、​principality-123-2020-09-03​ のようなクライアント ID を生成します。

  1. Studio で、​[Global Elements (グローバル要素)]​ タブに移動します。

  2. [Create (作成)]​ をクリックします。

  3. 検索条件ボックスに「​mqtt​」と入力し、​[MQTT3 Config (MQTT3 設定)]​ を選択します。

  4. [OK]​ をクリックします。

  5. [MQTT3 Config (MQTT3 設定)]​ > ​[Connection (接続)]​ で ​[MQTT3 URL Connection (MQTT3 URL 接続)]​ を選択します。

  6. [Client id generator (クライアント ID ジェネレーター)]​ で ​[Client id custom expression generator (クライアント ID カスタム式ジェネレーター)]​ を選択します。

  7. 次の項目を設定します。

    • Client ID (クライアント ID)​: principality-123-

    • Custom Client ID Suffix (カスタムクライアント ID サフィックス)​: #[%dw 2.0 output text/plain --- now() as String {format: 'y-MM-dd'}]"

    • Username (ユーザー名)​: mosquitto

    • Password (パスワード)​: password

    • URL​: tcp://broker.hivemq.com:1883

  8. [OK]​ をクリックします。

[Global Element Properties (グローバル要素プロパティ)] ウィンドウでのクライアント ID カスタム式ジェネレーターの設定

[Configuration XML (設定 XML)]​ エディターで、​<mqtt3:client-id-custom-expression-generator>​ および ​customClientIdSuffix​ の設定は次のように記述されます。

    <mqtt3:config name="MQTT_ClientID_Static_Prefix_And_Expression_Suffix_Config">
        <mqtt3:connection username="mosquitto" password="password" url="tcp://broker.hivemq.com:1883"/>
            <mqtt3:client-id-generator>
                <mqtt3:client-id-custom-expression-generator clientId="principality-123-" customClientIdSuffix="#[%dw 2.0 output text/plain --- now() as String {format: 'y-MM-dd'}]"/>
            </mqtt3:client-id-generator>
            <mqtt3:connection-options maxInFlight="60" cleanSession="true" />
        </mqtt3:form-connection>
    </mqtt3:config>

式をクライアント ID として指定することもできます。次の例の動的設定では、式の新しい値ごとに新しい接続を生成します。

    <mqtt3:config name="MQTT_ClientID_Only_Expression_Suffix_Config">
        <mqtt3:form-connection username="aziraphale" password="principality" protocol="TCP" host="127.0.0.1" port="${mosquitto.port1}">
            <mqtt3:client-id-generator>
                <mqtt3:client-id-custom-expression-generator customClientIdSuffix="#['smart-bentley-' ++ randomInt(1000) as String]"/>
            </mqtt3:client-id-generator>
            <mqtt3:connection-options maxInFlight="60" cleanSession="true" />
        </mqtt3:form-connection>
    </mqtt3:config>

次の例では、簡単な文字列をクライアント ID として設定し、静的クライアント ID ​principality-123​ を生成します。

    <mqtt3:config name="MQTT_Static_ClientID_Config">
        <mqtt3:form-connection username="aziraphale" password="principality" protocol="TCP" host="127.0.0.1" port="${mosquitto.port1}">
            <mqtt3:client-id-generator>
                <mqtt3:client-id-custom-expression-generator clientId="principality-123"/>
            </mqtt3:client-id-generator>
            <mqtt3:connection-options maxInFlight="60" cleanSession="true" />
        </mqtt3:form-connection>
    </mqtt3:config>

クライアント ID ランダムサフィックスジェネレーターの設定

このジェネレーターを使用すると、省略可能な静的文字列プレフィックスを設定し、ランダムな UUID をサフィックスとして追加できます。静的プレフィックスを指定すると、静的プレフィックスは ​-​ 文字によりランダム UUID サフィックスから分離されます。

次の例では、​smart-bentley-123-0f321a85-fddf-429f-ba89-26d201db9777​ のようなクライアント ID を生成するようにジェネレーターを設定しますが、新しい各接続には、ランダムに生成された独自の UUID サフィックスが含まれます。

  1. Studio で、​[Global Elements (グローバル要素)]​ タブに移動します。

  2. [Create (作成)]​ をクリックします。

  3. 検索条件ボックスに「​mqtt​」と入力し、​[MQTT3 Config (MQTT3 設定)]​ を選択します。

  4. [OK]​ をクリックします。

  5. [MQTT3 Config (MQTT3 設定)]​ > ​[Connection (接続)]​ で ​[MQTT3 URL Connection (MQTT3 URL 接続)]​ を選択します。

  6. [Client id generator (クライアント ID ジェネレーター)]​ で ​[Client id random suffix generator (クライアント ID ランダムサフィックスジェネレーター)]​ を選択します。

  7. 次の項目を設定します。

    • Client ID (クライアント ID)​: smart-bentley-123

    • Username (ユーザー名)​: mosquitto

    • Password (パスワード)​: password

    • URL​: tcp://127.0.0.1:${mosquitto.port1}

  8. [OK]​ をクリックします。

[Global Element Properties (グローバル要素プロパティ)] ウィンドウでのクライアント ID ランダムサフィックスジェネレーターの設定

設定 XML​ エディターでは、​<<mqtt3:client-id-random-suffix-generator>​ 設定は次のように記述されます。

    <mqtt3:config name="MQTT_Static_Prefix_And_Random_Suffix_Config">
        <mqtt3:connection username="mosquitto" password="password"  url="tcp://127.0.0.1:${mosquitto.port1}">
            <mqtt3:client-id-generator>
                <mqtt3:client-id-random-suffix-generator clientId="smart-bentley-123" />
            </mqtt3:client-id-generator>
            <mqtt3:connection-options maxInFlight="60" cleanSession="true"  />
        </mqtt3:connection>
    </mqtt3:config>

クライアント ID プレフィックスを省略することもできます。この場合、ジェネレーターではランダムな UUID がクライアント ID として割り当てられます。次の例では、​0f321a85-fddf-429f-ba89-26d201db9777​ のようなクライアント ID を生成するようにジェネレーターを設定します。

    <mqtt3:config name="MQTT_Static_Prefix_And_Random_Suffix_Config">
        <mqtt3:connection username="mosquitto" password="mosquitto"  url="tcp://127.0.0.1:${mosquitto.port1}">
            <mqtt3:client-id-generator>
                <mqtt3:client-id-random-suffix-generator />
            </mqtt3:client-id-generator>
            <mqtt3:connection-options maxInFlight="60" cleanSession="true"  />
        </mqtt3:connection>
    </mqtt3:config>

カスタムクライアント ID ジェネレーターの設定

独自のカスタムクライアント ID ジェネレーターを使用するには、Mule SDK のサブタイプと、インポートおよびエクスポートのアノテーションに精通している必要があります。

次の例では、独自のクライアント ID ジェネレーターを設定します。

  1. 独自の Java Connector プロジェクトを作成します。

  2. コネクタプロジェクトの ​pom.xml​ ファイルで、MQTT Connector を連動関係として追加します。次に例を示します。

        <modelVersion>4.0.0</modelVersion>
        <groupId>org.example</groupId>
        <artifactId>mqtt3-extended-connector</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>mule-extension</packaging>
        <name>MQTT Extended Connector</name>
    
        <parent>
            <groupId>org.mule.extensions</groupId>
            <artifactId>mule-ee-core-modules-parent</artifactId>
        </parent>
    
        <dependencies>
            <dependency>
                <groupId>com.mulesoft.connectors</groupId>
                <artifactId>mule4-mqtt3-connector</artifactId>
                <version>1.0.0</version>
                <classifier>mule-plugin</classifier>
            </dependency>
        </dependencies>
  1. コネクタの定義クラスを作成します。次に例を示します。

    @Xml(prefix = "mqtt3-extended")
    @Extension(name = "MQTT3Extended", category = SELECT)
    public class MQTT3ExtendedConnector {
    }
  1. カスタム拡張機能で、MQTT Connector により公開されている ​ClientIDGenerator​ インターフェースの実装を定義します。

    MQTT Connector では、​ClientIDGenerator​ インターフェースが公開されているため、必要なのはメソッド ​generateClientID()​ の実装のみです。この時点では、​@Import​ アノテーションを使用してこのインターフェースをインポートします。その後、このインターフェースは MQTT Connector によってエクスポートされます。

    @Xml(prefix = "mqtt3-extended")
    @Extension(name = "MQTT3Extended", category = SELECT)
    @Import(type = ClientIDGenerator.class)
    public class MQTT3ExtendedConnector {
    
    }
  1. ClientIDGenerator​ インターフェースの実装を定義します。

    @Alias("custom-client-id")
    public class MyClientIdGenerator implements ClientIDGenerator {
    
      /**
       * Client id to be used to identify the connection to the MQTT broker.
       */
      @Parameter
      @DisplayName("Client ID")
      @Optional(defaultValue = "")
      @Expression(NOT_SUPPORTED)
      @ClientId
      protected String clientId;
    
      private String suffix = "my-custom-suffix";
    
      /**
       * @return a client ID that results from concatenating the clientId and a randomly generated UUID string.
       */
      @Override
      public String generateClientID() {
        return clientId + (clientId.isEmpty() ? "" : "-") + suffix;
      }
    }
  2. コネクタ定義でサブタイプを定義し、カスタム実装をエクスポートします。

    これを行うには、コネクタクラスでカスタム実装を ​ClientIDGenerator​ サブタイプとして定義することで、以前に定義した実装を MQTT Connector で使用できるようにします。また、​@Export​ アノテーションを使用して、​MyClientIdGenerator​ クラスをエクスポートします。

    @Xml(prefix = "mqtt3-extended")
    @Extension(name = "MQTT3Extended", category = SELECT)
    @Import(type = ClientIDGenerator.class)
    @Export(classes = {MyClientIdGenerator.class})
    @SubTypeMapping(baseType = ClientIDGenerator.class, subTypes = {MyClientIdGenerator.class})
    public class MQTT3ExtendedConnector {
    
    }

    カスタムコネクタプロジェクトをセットアップしたら、MQTT Connector を使用してアプリケーションから新しい実装にいつでもアクセスできます。

  1. Studio でカスタムコネクタと MQTT Connector の両方をアプリケーションの ​pom.xml​ ファイルにインポートします。次に例を示します。

    	<groupId>com.mycompany</groupId>
    	<artifactId>mqtt-custom-id-generator</artifactId>
    	<version>1.0.0-SNAPSHOT</version>
    	<packaging>mule-application</packaging>
    
    	<name>mqtt-custom-id-generator</name>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    
    		<app.runtime>4.3.0-20210719</app.runtime>
    		<mule.maven.plugin.version>3.5.2</mule.maven.plugin.version>
    	</properties>
    
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.apache.maven.plugins</groupId>
    				<artifactId>maven-clean-plugin</artifactId>
    				<version>3.0.0</version>
    			</plugin>
    			<plugin>
    				<groupId>org.mule.tools.maven</groupId>
    				<artifactId>mule-maven-plugin</artifactId>
    				<version>${mule.maven.plugin.version}</version>
    				<extensions>true</extensions>
    				<configuration>
    					<sharedLibraries>
    						<sharedLibrary>
    							<groupId>org.eclipse.paho</groupId>
    							<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    						</sharedLibrary>
    					</sharedLibraries>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    
    	<dependencies>
    		<dependency>
    			<groupId>org.mule.connectors</groupId>
    			<artifactId>mule-http-connector</artifactId>
    			<version>1.5.25</version>
    			<classifier>mule-plugin</classifier>
    		</dependency>
    		<dependency>
    			<groupId>org.mule.connectors</groupId>
    			<artifactId>mule-sockets-connector</artifactId>
    			<version>1.2.1</version>
    			<classifier>mule-plugin</classifier>
    		</dependency>
    		<dependency>
    			<groupId>org.eclipse.paho</groupId>
    			<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
    			<version>1.2.5</version>
    		</dependency>
    		<dependency>
    		    <groupId>org.example</groupId>
    		    <artifactId>mqtt3-extended-connector</artifactId>
    		    <version>1.0.0-SNAPSHOT</version>
    		    <classifier>mule-plugin</classifier>
    		</dependency>
    		<dependency>
    		    <groupId>com.mulesoft.connectors</groupId>
    		    <artifactId>mule4-mqtt3-connector</artifactId>
    		    <version>1.0.0</version>
    		    <classifier>mule-plugin</classifier>
    		</dependency>
    	</dependencies>
    </project>

    その後、アプリケーションで新しい MQTT Connector 設定を作成するときには、カスタムクライアント ID の実装が、使用可能なクライアント ID ジェネレーターのリストに含まれるようになります。

  1. MQTT Connector 設定でカスタム ID ジェネレーターを使用するには、​[Global Elements (グローバル要素)]​ タブに移動します。

  2. [Create (作成)]​ をクリックします。

  3. 検索条件ボックスに「​mqtt​」と入力し、​[MQTT3 Config (MQTT3 設定)]​ を選択します。

  4. [OK]​ をクリックします。

  5. [MQTT3 Config (MQTT3 設定)]​ > ​[Connection (接続)]​ で ​[MQTT3 URL Connection (MQTT3 URL 接続)]​ を選択します。

  6. [Client id generator (クライアント ID ジェネレーター)]​ で ​[Custom client id (カスタムクライアント ID)]​ を選択します。

  7. 次の項目を設定します。

    • Client ID (クライアント ID)​: 123

    • Username (ユーザー名)​: mosquitto

    • Password (パスワード)​: password

    • URL​: tcp://broker.hivemq.com:1883"

  8. [OK]​ をクリックします。

[Global Element Properties (グローバル要素プロパティ)] ウィンドウでのカスタムクライアント ID ジェネレーターの設定

[Configuration XML (設定 XML)]​ エディターで、​<mqtt3:client-id-generator>​ および ​<mqtt3-extended:custom-client-id>​ の設定は次のように記述されます。

<mqtt3:config name="MQTT3_Config">
	<mqtt3:connection username="mosquitto" password="password" url="tcp://broker.hivemq.com:1883">
		<mqtt3:client-id-generator >
			<mqtt3-extended:custom-client-id clientId="123" />
		</mqtt3:client-id-generator>
	</mqtt3:connection>
</mqtt3:config>