主题未在 PubSub 模拟器中创建
Topic not created in PubSub Emulator
我正在尝试 Google PubSub Java 带有 Google PubSub 模拟器的客户端库。
我是 运行 作为 docker 容器的 PubSub 模拟器。
我可以使用 url 从我的本地计算机访问模拟器,例如
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions
使用
创建了一个主题
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics/<DUMMY_TOPIC_NAME>
订阅使用
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions/<DUMMY_SUBSCRIPTION_NAME>
可以使用
推送消息
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics/<DUMMY_TOPIC_NAME>:publish
可以使用
提取消息
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions/<DUMMY_SUBSCRIPTION_NAME>:pull
Java 应用程序也是 运行 作为一个单独的 docker 容器并设置了以下环境变量...
PUBSUB_EMULATOR_HOST --- localhost:32805
PUBSUB_PROJECT_ID --- <DUMMY_PROJECT_ID>
和以下代码...
String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build();
try {
TransportChannelProvider channelProvider = FixedTransportChannelProvider
.create(GrpcTransportChannel.create(channel));
CredentialsProvider credentialsProvider = NoCredentialsProvider.create();
// Set the channel and credentials provider when creating a `TopicAdminClient`.
// Similarly for SubscriptionAdminClient
TopicAdminClient topicClient = TopicAdminClient.create(TopicAdminSettings.newBuilder()
.setTransportChannelProvider(channelProvider).setCredentialsProvider(credentialsProvider).build());
TopicName topicName = TopicName.of(projectID, "niks-test-01");
topicClient.createTopic(topicName);
// Set the channel and credentials provider when creating a `Publisher`.
// Similarly for Subscriber
Publisher publisher = Publisher.newBuilder(topicName).setChannelProvider(channelProvider)
.setCredentialsProvider(credentialsProvider).build();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
channel.shutdown();
}
应用程序已启动,上面的代码也执行成功但是当我查询主题时
使用 http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics
它 returns 没什么...
打印大量日志后,我发现应用卡住了@topicClient.createTopic(topicName);
没有更多日志或异常...
知道这里出了什么问题...谢谢...
Edit#1:发现它不是模拟器问题,而是 docker 问题...容器无法使用本地主机进行对话。 ..
正如我在初步调查中发现的那样,这不是应用程序问题,而是 docker 问题。
在进一步调查中,我发现容器可能没有使用相同的网络。
所以我用
创建了一个网络
docker network create test-network
然后
docker run --network=test-network -itd --name=pubsub-emulator <IMAGE_NAME>
&
docker run --network=test-network -itd --name=pubsub-app <IMAGE_NAME> -e PUBSUB_EMULATOR_HOST=pubsub-emulator:<INTERNAL_PORT
现在应用程序可以与 pubsub-emulator 通信...
我正在尝试 Google PubSub Java 带有 Google PubSub 模拟器的客户端库。
我是 运行 作为 docker 容器的 PubSub 模拟器。
我可以使用 url 从我的本地计算机访问模拟器,例如
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions
使用
创建了一个主题http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics/<DUMMY_TOPIC_NAME>
订阅使用
http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions/<DUMMY_SUBSCRIPTION_NAME>
可以使用
推送消息http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics/<DUMMY_TOPIC_NAME>:publish
可以使用
提取消息http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/subscriptions/<DUMMY_SUBSCRIPTION_NAME>:pull
Java 应用程序也是 运行 作为一个单独的 docker 容器并设置了以下环境变量...
PUBSUB_EMULATOR_HOST --- localhost:32805
PUBSUB_PROJECT_ID --- <DUMMY_PROJECT_ID>
和以下代码...
String hostport = System.getenv("PUBSUB_EMULATOR_HOST");
ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build();
try {
TransportChannelProvider channelProvider = FixedTransportChannelProvider
.create(GrpcTransportChannel.create(channel));
CredentialsProvider credentialsProvider = NoCredentialsProvider.create();
// Set the channel and credentials provider when creating a `TopicAdminClient`.
// Similarly for SubscriptionAdminClient
TopicAdminClient topicClient = TopicAdminClient.create(TopicAdminSettings.newBuilder()
.setTransportChannelProvider(channelProvider).setCredentialsProvider(credentialsProvider).build());
TopicName topicName = TopicName.of(projectID, "niks-test-01");
topicClient.createTopic(topicName);
// Set the channel and credentials provider when creating a `Publisher`.
// Similarly for Subscriber
Publisher publisher = Publisher.newBuilder(topicName).setChannelProvider(channelProvider)
.setCredentialsProvider(credentialsProvider).build();
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
channel.shutdown();
}
应用程序已启动,上面的代码也执行成功但是当我查询主题时
使用 http://localhost:32805/v1/projects/<DUMMY_PROJECT_ID>/topics
它 returns 没什么...
打印大量日志后,我发现应用卡住了@topicClient.createTopic(topicName);
没有更多日志或异常...
知道这里出了什么问题...谢谢...
Edit#1:发现它不是模拟器问题,而是 docker 问题...容器无法使用本地主机进行对话。 ..
正如我在初步调查中发现的那样,这不是应用程序问题,而是 docker 问题。
在进一步调查中,我发现容器可能没有使用相同的网络。
所以我用
创建了一个网络docker network create test-network
然后
docker run --network=test-network -itd --name=pubsub-emulator <IMAGE_NAME>
&
docker run --network=test-network -itd --name=pubsub-app <IMAGE_NAME> -e PUBSUB_EMULATOR_HOST=pubsub-emulator:<INTERNAL_PORT
现在应用程序可以与 pubsub-emulator 通信...