シナリオ
SDK を使用して ApsaraMQ for RocketMQ に接続する際に、"No route info" エラーが発生します。
適用可能な SDK
商用 HTTP SDK。この SDK は、ApsaraMQ for RocketMQ 4.0 シリーズのインスタンスでのみサポートされています。詳細については、「SDK バージョンの概要」をご参照ください。
商用 1.x SDK (Java、Remoting プロトコル)。以下のコードは、依存関係の座標のサンプルです。商用 SDK のバージョンは 1.7.9 以降である必要があります。
<dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>ons-client</artifactId> <version>1.9.1.Final</version> </dependency>オープンソース SDK (Java、Remoting プロトコル、artifactId は rocketmq-client)。以下のコードは、依存関係の座標のサンプルです。オープンソース SDK のバージョンは 4.5.2 以降である必要があります。コード構成と SDK のバージョンを確認してください。
<dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.9.2</version> </dependency>
トラブルシューティングのまとめ
トラブルシューティングの方法は、インスタンスのエディション、SDK プロトコル、言語によって異なります。ご利用の特定のシナリオに適用される手順に従ってください。
トラブルシューティングの詳細
HTTP プロトコル SDK
ご利用のコード内のエンドポイントが、対象インスタンスのコンソールに表示されるエンドポイントと一致することを確認してください。一致している場合は、Topic が作成されていることを確認してください。
インスタンス詳細ページで、名前空間が使用されているかどうかを確認してください。インスタンスが名前空間を使用している場合は、プロデューサーとコンシューマーのコードで `instanceId` を設定します。詳細については、「コード例」をご参照ください。インスタンスが名前空間を使用していない場合は、`instanceId` に null 値または空の文字列を渡します。

TCP Remoting プロトコル SDK
no router infoエラーを報告しているリソースがTBW102またはRMQ_SYS_TRACE_TOPICであるかを確認してください。TBW102:このリソースは、オープンソースの RocketMQ が Topic を自動作成するために使用します。ApsaraMQ for RocketMQ では、Topic はマネージドリソースであり、自動的に作成することはできません。TBW102 エラーはクライアント操作に影響しないため、無視できます。
RMQ_SYS_TRACE_TOPIC:この Topic は、オープンソースの RocketMQ がメッセージトレースを報告するために使用します。ApsaraMQ for RocketMQ に接続する場合、クラウドベースのトレースとの互換性を設定する必要があります。オープンソースの Remoting プロトコル SDK (artifactId は rocketmq-client) を次のように設定します。詳細については、「通常メッセージの送受信 (3 つの方法)」をご参照ください。
public static void main(String[] args) throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("YOUR GROUP ID", getAclRPCHook(), new AllocateMessageQueueAveragely(), true, null); consumer.setNamesrvAddr("http://xxxx.mq-internet.aliyuncs.com:80"); // Alibaba Cloud でクラウドベースのメッセージトレースを使用するには、アクセスチャネルを CLOUD に設定します。 // クラウドベースのメッセージトレース機能を使用する場合は、このパラメーターを設定します。 // この機能を有効にしない場合は、このパラメーターを設定する必要はありません。 consumer.setAccessChannel(AccessChannel.CLOUD); ...... consumer.start(); }
ご利用のコード内のエンドポイントが、対象インスタンスのコンソールに表示されるエンドポイントと一致することを確認してください。一致している場合は、Topic が作成されていることを確認してください。
Java Remoting プロトコルのクライアントの場合、クライアントログでネットワーク接続の例外がないか確認してください。ログパスは次のとおりです。
オープンソース Java SDK のパス:
/{user.home}/logs/rocketmqlogs/rocketmq_client.log商用 1.x エディションのパス:
/{user.home}/logs/ons.log
ログにネットワーク接続の問題が示されている場合は、まずネットワークがアクセス可能であることを確認する必要があります。
pingコマンドとtelnetコマンドを使用して接続をテストできます。エンドポイントのテストに加えて、ログエラーで報告されたアドレスへの接続性も `telnet` コマンドを使用してテストする必要があります。ログで権限付与の失敗がないか確認してください。権限付与の失敗が発生した場合は、まず権限の問題を解決してから、エラーが解消されるかを確認します。
4.0 シリーズのインスタンスについては、「ApsaraMQ for RocketMQ のカスタムポリシー」をご参照ください。権限を付与する際は、インスタンスが名前空間を使用しているかどうかに基づいて適切なポリシーを選択します。
5.0 シリーズのインスタンスについては、必要な ACL 権限を付与します。詳細については、「ACL ユーザーに権限を付与する」をご参照ください。インスタンスが名前空間を使用しているかどうかを判断するには、「HTTP プロトコル SDK」セクションの手順をご参照ください。
spring-cloud-stream フレームワークを使用しているかどうかを確認してください。詳細については、「設定手順」をご参照ください。
インスタンスが名前空間を使用している場合は、Topic を
instanceId%Topicのフォーマットで設定します。インスタンスが名前空間を使用していない場合は、Topic 名のみを設定します。インスタンスが名前空間を使用しているかどうかを判断するには、「HTTP プロトコル SDK」セクションの手順をご参照ください。
Serverless インスタンスにパブリックネットワーク経由で接続しているかどうかを確認してください。
Serverless インスタンスにパブリックネットワーク経由で接続するには、特定の SDK バージョンを使用し、名前空間を設定する必要があります。
内部ネットワーク経由で Serverless インスタンスに接続する場合、または他のタイプの 5.0 シリーズのインスタンスにパブリックネットワークまたは内部ネットワーク経由で接続する場合は、名前空間を設定する必要はありません。
// サポートされている SDK バージョン: rocketmq-client >= 5.2.0 producer.setNamespaceV2("rmq-cn-xxxxxxx"); consumer.setNamespaceV2("rmq-cn-xxxxxxx"); // サポートされている SDK バージョン: rocketmq-client-java >= 5.0.6 StaticSessionCredentialsProvider staticSessionCredentialsProvider = new StaticSessionCredentialsProvider("YOUR_USERNAME", "YOUR_PASSWORD"); // ApsaraMQ for RocketMQ コンソールのアクセス制御ページからユーザー名とパスワードを取得します。 ClientConfiguration clientConfiguration = ClientConfiguration.newBuilder() .setEndpoints("rmq-cn-xxxxxxx.cn-hangzhou.rmq.aliyuncs.com:8080") .setNamespace("rmq-cn-xxxxxxx") .setCredentialProvider(staticSessionCredentialsProvider) .build(); // ons >= 1.9.0.Final properties.setProperty(PropertyKeyConst.Namespace, "rmq-cn-xxxxxxx");