我有一个用Java编写的服务器和一个用PHP编写的客户端。如果出现任何问题,客户端如何从服务器捕获异常?在gRPC文档中找不到任何有关异常处理的信息。
谢谢!
我正在使用GRPC-Java 1.1.2。在一个活跃的GRPC会话中,我打开了一些双向流。当客户端断开连接时,是否可以从客户端清除它们?当我尝试断开连接时,我运行以下查找固定次数,然后断开连接,但是我在服务器端看到以下错误(虽然不确定是否是由另一个问题引起的):
与客户端断开连接
while (!channel.awaitTermination(3, TimeUnit.SECONDS)) {
// check for upper bound and break if so
}
channel.shutdown().awaitTermination(3, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)
服务器错误
E0414 11:26:48.787276000 140735121084416 ssl_transport_security.c:439] SSL_read returned 0 unexpectedly.
E0414 11:26:48.787345000 140735121084416 secure_endpoint.c:185] Decryption error: TSI_INTERNAL_ERROR
Run Code Online (Sandbox Code Playgroud) 我尝试分析gRPC Java服务器。而且我主要看到以下线程池集。
总的来说,是gRPC java服务器,Netty样式还是Jetty / Tomcat样式?还是可以配置为同时运行?
我已经实现了消息的异步服务器流,并且已经进行了调用rpc的测试,然后使消息从服务器发送出去,然后等待onNext()。
有时测试失败,因为在我引起消息后,rpc调用到达了服务器。如果在服务器端添加300毫秒的睡眠,则该睡眠将持续失败。
我尝试添加withWaitForReady(),但没有帮助。
在服务器端的方法完成之前,是否存在阻止异步存根的标准方法?
我的应用程序在使用此版本的依赖项时运行得非常好,如下所述,但是当迁移到最新版本的 Firestore 依赖项时,我的应用程序无法在 Firestore 中添加或删除数据,我知道最新的依赖项不需要 firebase-core 依赖项,尽管遵循官方文档中提到的所有要求的 firebase,我的应用程序仍然无法使用最新的依赖项,但可以与下面提到的依赖项完美配合
我想使用 FirestoreUI 这就是为什么将我的项目迁移到最新版本的原因,我还尝试了本网站中提到的发行说明传递依赖项标准, https://github.com/firebase/FirebaseUI-Android/releases
但是仍然显示此错误,请帮助我我从我这边尝试所有可能的事情,我希望我们的 StackOverflow 家庭帮助新来的开发人员
感谢您的宝贵时间...快乐编码:)
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.firebase:firebase-core:16.0.4'
implementation 'com.google.firebase:firebase-firestore:17.1.2'
implementation 'com.google.firebase:firebase-auth:16.0.5'
implementation 'com.firebaseui:firebase-ui-auth:6.2.0'
implementation 'com.google.android.material:material:1.2.0-alpha06'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
Run Code Online (Sandbox Code Playgroud)
将数据添加到最新版本的 Firestore 时,反复显示此错误(下文提及),
implementation 'com.google.firebase:firebase-firestore:17.1.2'
I/Firestore: (21.4.1) [GrpcCallProvider]: Current gRPC connectivity state: CONNECTING
I/Firestore: (21.4.1) [GrpcCallProvider]: Setting the connectivityAttemptTimer
I/Firestore: (21.4.1) [GrpcCallProvider]: connectivityAttemptTimer elapsed. Resetting the channel.
I/Firestore: (21.4.1) [GrpcCallProvider]: Clearing the connectivityAttemptTimer
I/Firestore: (21.4.1) [GrpcCallProvider]: Current gRPC connectivity …Run Code Online (Sandbox Code Playgroud) dependencies firebase android-studio grpc-java google-cloud-firestore
我阅读了 gRPC核心概念、架构和生命周期,但没有深入到我喜欢看到的深度。有RPC 调用、gRPC 通道、gRPC 连接(文章中未描述)和 HTTP/2 连接(文章中未描述)。
我很想知道这些是如何结合在一起的。例如,当 RPC 抛出异常时,通道会发生什么?当通道关闭时,gRPC 连接会发生什么?通道什么时候关闭?gRPC 连接何时关闭?心脏跳动?逾期了怎么办?
任何人都可以回答这些问题,或者向我指出可以的资源吗?
最近,我正在研究构建 gRPC 客户端-服务器交互。
我写了一个 gRPC 服务:
service SearchService {
rpc Find (SearchReq) returns (SearchRes);
}
Run Code Online (Sandbox Code Playgroud)
然后我应该使用存根(另一个java应用程序)在客户端调用它。
这两种类型的存根有什么区别?
SearchServiceGrpc.SearchServiceFutureStub futureStub = SearchServiceGrpc.newFutureStub(channel);
SearchServiceGrpc.SearchServiceBlockingStub blockingStub = SearchServiceGrpc.newBlockingStub(channel);
Run Code Online (Sandbox Code Playgroud)
blockingStub.find(request);- 用于阻止
futureStub.find(request).get();- 为了未来
我了解 Java 中的 Futures 是如何工作的,但我不明白 gRPC 内部发生了什么以及哪种类型的存根调用更有效率
我在谷歌上没有找到关于它的信息。
谢谢!
这是我的场景。grpc 服务器是一个异步服务器,它从其他源订阅数据。它还为其客户端提供了订阅功能,因此一旦从其他来源接收到数据,它就可以将数据推送到 grpc 客户端。服务器是用Java 实现的。
@Override
public StreamObserver<Message> subscribe (
StreamObserver<Message> responseObserver) {
return new StreamObserver<Message>() {
@Override
public void onNext(Message message) {
api.subscribe(message.value, Message -> {
synchronized (responseObserver) {
...
...
// get data from other source
responseObserver.onNext(Converter.create().toProtobuf(Message.class, data));
}
});
}
@Override
public void onError(Throwable t) {
log.warn("Encountered error in sub", t);
}
@Override
public void onCompleted() {
responseObserver.onCompleted();
}
};
}
Run Code Online (Sandbox Code Playgroud)
我想使用 python 实现 grpc 客户端来订阅该服务器。然而,奇怪的是,Python一旦订阅数据,就立即关闭,而不等待Java服务器的异步返回。然而,Java 客户端可以永远运行并等待来自服务器的异步数据。
原型
message Message{
string value = 1;
}
service test …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一组服务,为外部客户端提供 REST 接口,同时使用 gRPC/protobuf 进行内部服务间通信。Spring Boot 用于帮助提供后台基础设施支持。我大约一周前才开始学习和使用 Google protobuf 和 gRPC。
我已经能够成功地获得更简单的端到端工作处理,但这些返回单个对象(即没有流)。我在进行旨在流式传输响应对象集合的调用时遇到问题。另一件需要注意的事情是,到目前为止我尝试过的所有事情都是 GET 请求。
下面的示例仅显示了我遇到问题的相关部分。
细节:
Protobuf 定义:
syntax = "proto3";
package experiment;
message BOM {
PartSpec part_spec = 1;
string description = 2;
string category = 3;
}
message PartSpec {
string part_number = 1;
string cage_code = 2;
}
service BOMService {
rpc getBOMList(google.protobuf.Empty) returns (stream BOM) {}
} …Run Code Online (Sandbox Code Playgroud) 我想阻止客户端流媒体。该协议的定义如下所示:
rpc RecordRoute(stream Point) 返回 (RouteSummary) {}
正如文档中所述,对于某些类型的流调用,只能使用异步存根:
一个非阻塞/异步存根,它对服务器进行非阻塞调用,并异步返回响应。您可以仅使用异步存根进行某些类型的流调用。
那么我怎样才能使该调用阻塞/同步呢?是否可以?
grpc-java ×10
grpc ×8
java ×5
dependencies ×1
firebase ×1
future ×1
grpc-python ×1
netty ×1
proto3 ×1
python ×1
rest ×1
server ×1
spring-boot ×1
stub ×1