我开始使用 pubsub 模拟器来测试我的基本实现,但在尝试创建新主题时遇到了问题。
我的模拟器在 localhost:8085 上监听,如果我通过 api 创建主题
PUT http://localhost:8085/v1/projects/testproject/topics/test
一切正常,主题已创建。 但是,如果我运行以下代码片段,则没有任何效果,也没有创建任何主题:
TopicName topicName = TopicName.create("testproject", "test");
ChannelProvider channelProvider =
TopicAdminSettings.defaultChannelProviderBuilder()
.setEndpoint("localhost:8085")
.setCredentialsProvider(
FixedCredentialsProvider.create(NoCredentials.getInstance()))
.build();
TopicAdminClient topicClient = TopicAdminClient.create(
TopicAdminSettings.defaultBuilder().setChannelProvider(channelProvider).build());
topicClient.createTopic(topicName);
运行时模拟器记录
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.grpc.GrpcServer$3 operationComplete
[pubsub] INFORMATION: Adding handler(s) to newly registered Channel.
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[pubsub] INFORMATION: Detected non-HTTP/2 connection.
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFORMATION: Unknown request URI: /bad-request
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.grpc.GrpcServer$3 operationComplete
[pubsub] INFORMATION: Adding handler(s) to newly registered Channel.
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[pubsub] INFORMATION: Detected non-HTTP/2 connection.
[pubsub] Apr 27, 2017 1:10:47 PM io.gapi.emulators.netty.NotFoundHandler handleRequest
[pubsub] INFORMATION: Unknown request URI: /bad-request
...
[pubsub] Apr 27, 2017 1:10:49 PM io.gapi.emulators.grpc.GrpcServer$3 operationComplete
[pubsub] INFORMATION: Adding handler(s) to newly registered Channel.
[pubsub] Apr 27, 2017 1:10:49 PM io.gapi.emulators.netty.HttpVersionRoutingHandler channelRead
[pubsub] INFORMATION: Detected non-HTTP/2 connection.
我的 ChannelProvider 上是否遗漏了什么?还是我没有正确配置 TopicAdminClient?我看不出有什么问题,因为我用过 this as reference .
也许有人可以帮我解决这个问题。
最佳答案
用于与模拟器通信的 channel 需要将 negotiationType
属性设置为 NegotiationType.PLAINTEXT
。这意味着您需要创建自定义 ChannelProvider
。像下面这样的东西应该可以工作:
public class PlainTextChannelProvider implements ChannelProvider {
@Override
public boolean shouldAutoClose() {
return false;
}
@Override
public boolean needsExecutor() {
return false;
}
@Override
public ManagedChannel getChannel() throws IOException {
return NettyChannelBuilder.forAddress("localhost", 8085)
.negotiationType(NegotiationType.PLAINTEXT)
.build();
}
@Override
public ManagedChannel getChannel(Executor executor) throws IOException {
return getChannel();
}
}
关于java - 在 pubsub 模拟器上创建主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43657112/