生成コードリファレンス
生成コードリファレンス
パッケージ
.protoファイルで定義された各サービスに対して、Javaコード生成はJavaクラスを生成します。クラス名は、サービスの名の後にGrpc
が付加されたものです。生成されたコードのパッケージは、.protoファイルでjava_package
オプションを使用して指定します。
たとえば、ServiceName
が以下を含む.protoファイルで定義されている場合
package grpcexample;
option java_package = "io.grpc.examples";
生成されるクラスはio.grpc.examples.ServiceNameGrpc
になります。
java_package
が指定されていない場合、生成されたクラスは.protoファイルで指定されたpackage
を使用します。protoパッケージは通常、リバースドメイン名で始まらないため、これは避けるべきです。
サービススタブ
生成されたJavaコードには、ServiceNameImplBase
のように、ImplBase
というサフィックスが付いた内部抽象クラスが含まれます。このクラスは、サービス定義の各メソッドに対して1つのJavaメソッドを定義します。このクラスを拡張し、これらのメソッドの機能を実装するのはサービスの実装者の責任です。オーバーライドされない場合、メソッドはメソッドが実装されていないというエラーをクライアントに返します。
ServiceNameImplBase
のスタブメソッドのシグネチャは、それが処理するRPCのタイプによって異なります。gRPCサービスメソッドには、単項、サーバストリーミング、クライアントストリーミング、双方向ストリーミングの4つのタイプがあります。
単項
単項RPCメソッドunaryExample
のサービススタブシグネチャ
public void unaryExample(
RequestType request,
StreamObserver<ResponseType> responseObserver)
サーバストリーミング
サーバストリーミングRPCメソッドserverStreamingExample
のサービススタブシグネチャ
public void serverStreamingExample(
RequestType request,
StreamObserver<ResponseType> responseObserver)
単項RPCとサーバストリーミングRPCのシグネチャが同じであることに注意してください。クライアントから単一のRequestType
が受信され、サービス実装はresponseObserver.onNext(ResponseType response)
を呼び出すことで応答を送信します。
クライアントストリーミング
クライアントストリーミングRPCメソッドclientStreamingExample
のサービススタブシグネチャ
public StreamObserver<RequestType> clientStreamingExample(
StreamObserver<ResponseType> responseObserver)
双方向ストリーミング
双方向ストリーミングRPCメソッドbidirectionalStreamingExample
のサービススタブシグネチャ
public StreamObserver<RequestType> bidirectionalStreamingExample(
StreamObserver<ResponseType> responseObserver)
クライアントストリーミングと双方向ストリーミングRPCのシグネチャは同じです。クライアントは複数のメッセージをサービスに送信できるため、サービス実装はStreamObserver<RequestType>
インスタンスを返す責任があります。このStreamObserver
は、クライアントから追加のメッセージが受信されるたびに呼び出されます。
クライアントスタブ
生成されたクラスには、gRPCクライアントがサービスで定義されたメソッドを呼び出すために使用するスタブも含まれています。各スタブは、生成されたコードのユーザーによって提供されるChannel
をラップします。スタブは、このチャネルを使用してRPCをサービスに送信します。
gRPC Javaは、非同期、ブロッキング、フューチャーの3種類のスタブのコードを生成します。各タイプのスタブには、生成されたコードにServiceNameStub
、ServiceNameBlockingStub
、およびServiceNameFutureStub
のような対応するクラスがあります。
非同期スタブ
非同期スタブを介して行われたRPCは、StreamObserver
上のコールバックを介して完全に動作します。
非同期スタブには、サービス定義の各メソッドに対して1つのJavaメソッドが含まれています。
新しい非同期スタブは、ServiceNameGrpc.newStub(Channel channel)
静的メソッドを介してインスタンス化されます。
単項
単項RPCメソッドunaryExample
の非同期スタブシグネチャ
public void unaryExample(
RequestType request,
StreamObserver<ResponseType> responseObserver)
サーバストリーミング
サーバストリーミングRPCメソッドserverStreamingExample
の非同期スタブシグネチャ
public void serverStreamingExample(
RequestType request,
StreamObserver<ResponseType> responseObserver)
クライアントストリーミング
クライアントストリーミングRPCメソッドclientStreamingExample
の非同期スタブシグネチャ
public StreamObserver<RequestType> clientStreamingExample(
StreamObserver<ResponseType> responseObserver)
双方向ストリーミング
双方向ストリーミングRPCメソッドbidirectionalStreamingExample
の非同期スタブシグネチャ
public StreamObserver<RequestType> bidirectionalStreamingExample(
StreamObserver<ResponseType> responseObserver)
ブロッキングスタブ
ブロッキングスタブを介して行われたRPCは、名前が示すように、サービスからの応答が利用可能になるまでブロックします。
ブロッキングスタブには、サービス定義の各単項メソッドとサーバストリーミングメソッドに対して1つのJavaメソッドが含まれています。ブロッキングスタブは、クライアントストリーミングRPCまたは双方向ストリーミングRPCをサポートしていません。
新しいブロッキングスタブは、ServiceNameGrpc.newBlockingStub(Channel channel)
静的メソッドを介してインスタンス化されます。
単項
単項RPCメソッドunaryExample
のブロッキングスタブシグネチャ
public ResponseType unaryExample(RequestType request)
サーバストリーミング
サーバストリーミングRPCメソッドserverStreamingExample
のブロッキングスタブシグネチャ
public Iterator<ResponseType> serverStreamingExample(RequestType request)
フューチャースタブ
フューチャースタブを介して行われたRPCは、非同期スタブの戻り値をGrpcFuture<ResponseType>
でラップします。これは、com.google.common.util.concurrent.ListenableFuture
インターフェースを実装します。
フューチャースタブには、サービス定義の各単項メソッドに対して1つのJavaメソッドが含まれています。フューチャースタブは、ストリーミングコールをサポートしていません。
新しいフューチャースタブは、ServiceNameGrpc.newFutureStub(Channel channel)
静的メソッドを介してインスタンス化されます。
単項
単項RPCメソッドunaryExample
のフューチャースタブシグネチャ
public ListenableFuture<ResponseType> unaryExample(RequestType request)
コード生成
通常、ビルドシステムはgRPC生成コードの作成を処理します。
protobufベースのコード生成の場合、適切なプラグインとともに.proto
ファイルをsrc/main/proto
およびsrc/test/proto
ディレクトリに配置できます。
gRPCおよびProtocol Buffersコードを生成するための典型的なprotobuf-maven-plugin構成は次のようになります
<build>
<extensions>
<extension>
<groupId>kr.motd.maven</groupId>
<artifactId>os-maven-plugin</artifactId>
<version>1.4.1.Final</version>
</extension>
</extensions>
<plugins>
<plugin>
<groupId>org.xolstice.maven.plugins</groupId>
<artifactId>protobuf-maven-plugin</artifactId>
<version>0.5.0</version>
<configuration>
<protocArtifact>com.google.protobuf:protoc:3.3.0:exe:${os.detected.classifier}</protocArtifact>
<pluginId>grpc-java</pluginId>
<pluginArtifact>io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier}</pluginArtifact>
</configuration>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>compile-custom</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
EclipseおよびNetBeansユーザーは、os-maven-plugin
のIDEドキュメントも参照する必要があります。
典型的なprotobuf-gradle-plugin構成は次のようになります
apply plugin: 'java'
apply plugin: 'com.google.protobuf'
buildscript {
repositories {
mavenCentral()
}
dependencies {
// ASSUMES GRADLE 2.12 OR HIGHER. Use plugin version 0.7.5 with earlier
// gradle versions
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.0'
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.2.0"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.4.0'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
Bazel開発者は、通常、次のようにjava_grpc_library
ルールを使用できます。
load("@grpc_java//:java_grpc_library.bzl", "java_grpc_library")
proto_library(
name = "helloworld_proto",
srcs = ["src/main/proto/helloworld.proto"],
)
java_proto_library(
name = "helloworld_java_proto",
deps = [":helloworld_proto"],
)
java_grpc_library(
name = "helloworld_java_grpc",
srcs = [":helloworld_proto"],
deps = [":helloworld_java_proto"],
)
Android開発者は、リファレンスについてはクライアントコードの生成を参照してください。
gRPC Java用のprotobufプラグインを直接呼び出す場合は、コマンドライン構文は次のようになります
$ protoc --plugin=protoc-gen-grpc-java \
--grpc-java_out="$OUTPUT_FILE" --proto_path="$DIR_OF_PROTO_FILE" "$PROTO_FILE"