問題タブ [grpc-java]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Cloud Speech API リターン コード = UNAUTHENTICATED、原因 =java.io.IOException: サービス アカウントのアクセス トークンの取得中にエラーが発生しました:
アプリでの音声認識に Google Cloud Speech API (gRPC 経由の StreamingRecognize) を使用しています。Android デバイス API レベル < 23 での認証に問題がありました。
毎回このエラーが発生するわけではありませんが、特定の場合にのみ発生します。私は2つの活動をしています。AとBに名前を付けましょう。
アクティビティ A には、アクティビティ B を開始するボタンがあります。アクティビティ B は Google Cloud Speech API と通信し、結果を TextView に表示します。
次の手順の後にこのエラーが発生します(Samsung GT-P5110 (Android 4.2.2)):
- アクティビティ A を開始 -> ボタンを押してアクティビティ B を開始します。
// 最初はすべて問題ありません。サーバーから結果を受け取り、これを表示します。
アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。
ボタンを押して、アクティビティ B を開始します。
// この時点で、上に示したエラーが発生します。
Lenovo A1000 (API 5.0.1) および Xiaomi Mi4c (5.0.1) で次のエラーが発生します。
アクティビティ A を開始 -> ボタンを押してアクティビティ B を開始します。
アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。
ボタンを押して、アクティビティ B を開始します。
// すべてが大丈夫です
アクティビティ B を閉じます ([戻る] ボタンを押すか、onBackPressed を呼び出すか、終了します)。
アプリを最小化します。
5 ~ 6 分以上経過したら、アクティビティ A に戻ります。
アクティビティ B を開始します。
// 現時点では、常にこのエラーが発生します。
アプリケーションを再起動するとすべて問題ありませんが、アクティビティ B を再度開くとエラーが表示されます。
この問題を解決する方法を誰が知っていますか?
Play Services Dynamic Security Provider を使用しています ( gRPC に必要です)。最新バージョンの Google Play Services (9.6.83) をインストールしました。問題は解決しません。
次のコードで ManagedChannel を作成します。
SpeechGrpc.SpeechStub を作成します。
build.gradle (モジュール: アプリ)
build.gradle (プロジェクト)
お時間をいただきありがとうございます:)
java - gRPC サーバーにグローバル例外インターセプターを追加するには?
gRPC では、グローバル例外インターセプターを追加して、RuntimeException
意味のある情報をクライアントに伝達する方法を教えてください。
たとえば、メソッドはメッセージとともにdivide
スローする場合があります。サーバー側では、次のように記述できます。ArithmeticException
/ by zero
クライアントが分母 = 0 を渡すと、次のようになります。
そしてサーバー出力
クライアントは何が起こっているのかわかりません。
/ by zero
クライアントにメッセージを渡したい場合は、サーバーを次のように変更する必要があります: (この質問で説明されているように)
クライアントが denominator = 0 を送信すると、次のようになります。
Good/ by zero
がクライアントに渡されます。
しかし問題は、真のエンタープライズ環境では大量のRuntimeException
s が存在することです。これらの例外のメッセージを client に渡したい場合は、各メソッドをキャッチする必要があり、これは非常に面倒です。
すべてのメソッドをインターセプトし、キャッチRuntimeException
してトリガーonError
し、エラーメッセージをクライアントに伝達するグローバルインターセプターはありますか? RuntimeException
サーバー コードで s を処理する必要がないようにします。
どうもありがとう !
ノート :
java - java/androidのGRPCで.protoファイルにデータ型をインポートする方法は?
GRPC プロトコルを使用してアプリを作成しようとしています。私の .proto ファイルでは、タイムスタンプ クラスをインポートする必要があり、Google のドキュメントに従って、
import google/protobuf/timestamp.proto
proto ファイルに追加する必要があります。しかし、それは私にエラーを与えます
import google/protobuf/timestamp.proto が見つからないか、エラーがあります
誰でもこれを解決する方法を知っています。
grpc - Handling client and server error on grpc java/node
I am using grpc to communicate between a Java server and node client. When either of them die/crash the other dies to.
Here is the exception thrown on Java server when node client dies -
Here is the exception thrown on node when java dies:
QUESTION - How do I handle those exceptions?
I tried without any success adding try/catch and adding a uncaught exception handlers for threads.
Java code to initialize -
Node client handler (one of the services, all other services use the same pattern) -
grpc - Protobuf 3 がコントラクトの加法性を破る
分散環境 (「マイクロサービス」) で gRPC と共に Protobuf 3 を使用しています。
Protobuf 3 で設定されていない値または欠落している値をサポートしていないため、コントラクトの加算性に関連する次の問題が発生しました。
Service Aと、 Team BとTeam Cが所有する2 つのコンシューマー サービスBとCがあるとします。
フィールド、たとえばブール値をサービスAのコントラクトに追加すると、最初はデフォルト値があり、データベースにそのまま書き込まれます。
次に、チーム Bは更新されたコントラクトを使用して話すようにサービスを更新し、フィールド値として「true」を渡します。次に、チーム Cは引き続き古いコントラクトを使用し、同じサービスを呼び出します。値は false に置き換えられます。でもチームCはそんなつもりはなかったし、その分野のことを全く知らなかった。
したがって、サービス A は契約をまったく延長できません。さまざまな理由でまだ更新されていないコンシューマーはデータに損害を与える可能性があり、サービス A はそれに対して何もできないからです。
Thrift では、そのようなことは単一のチェック ( .isSet()
) だけで行われます。
プリミティブをオブジェクトにラップするなどの汚い回避策がありますが、ライブラリ実装固有の参照によるチェック (少なくとも Java では) を使用する必要があります。また、最終的にはすべてをラッパーでラップする必要がありますが、ご想像のとおり、これも優れたソリューションではありません。
2017 年の Protobuf 3 でこのような状況を管理するために使用するベスト プラクティスは何ですか? チーム/サービス間の契約の更新をどのように管理/調整しますか? ありがとう
注:この質問は、設定されていない/欠落している値の検出の欠如を実装する方法に関するものではなく、それをどのように処理し、 Protobuf 3 の哲学に従うかに関するものです。
grpc - クライアント側でサーバーを動的に追加する/ランタイム
Consul を Service Discovery に使用しています。クライアントの起動時に NameResolver.start(Listener listener) でサーバーのリストを指定します。
- サービスプロバイダーとして参加した新しいサーバーを追加するにはどうすればよいですか (Consul で)
- ラウンド ロビンを使用しています。サーバーの1つが停止したとき。デッドサーバーにヒットし続けます
- UNAVAILABLE 例外で再試行するサンプルはありますか? クライアント側であきらめる前に、少なくとも一度は再試行したいだけです。
前もって感謝します