public class BookServiceImpl extends BookServiceGrpc.BookServiceImplBase{
private Map<String, Book> bookMap = new HashMap<>();
public BookServiceImpl(){
Book b1 = Book.newBuilder().setId("1").setName("三国演义").setAuthor("罗贯中").setPrice(30).addTags("明清小说").addTags("通俗小说").build();
Book b2 = Book.newBuilder().setId("2").setName("西游记").setAuthor("吴承恩").setPrice(40).addTags("志怪小说").addTags("通俗小说").build();
Book b3 = Book.newBuilder().setId("3").setName("水浒传").setAuthor("施耐庵").setPrice(50).addTags("明清小说").addTags("通俗小说").build();
bookMap.put("1", b1);
bookMap.put("2", b2);
bookMap.put("3", b3);}
@Override
public void getBook(StringValue request, StreamObserver<Book> responseObserver){
String id = request.getValue();
Book book = bookMap.get(id);
if (book !=null){
responseObserver.onNext(book);
responseObserver.onCompleted();} else {
responseObserver.onCompleted();}}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
这个 getBook 就是根据客户端传来的 id,从 Map 中查询到一个 Book 并返回。
客户端调用代码如下:
public class BookServiceClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost",50051).usePlaintext().build();
BookServiceGrpc.BookServiceStub stub = BookServiceGrpc.newStub(channel);
getBook(stub);}
private static void getBook(BookServiceGrpc.BookServiceStub stub) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
stub.getBook(StringValue.newBuilder().setValue("2").build(), new StreamObserver<Book>(){
@Override
public void onNext(Book book){
System.out.println("book = "+ book);}
@Override
public void onError(Throwable throwable){}
@Override
public void onCompleted(){
countDownLatch.countDown();
System.out.println("查询完毕");}});
countDownLatch.await();}}
public class BookServiceImpl extends BookServiceGrpc.BookServiceImplBase{
private Map<String, Book> bookMap = new HashMap<>();
public BookServiceImpl(){
Book b1 = Book.newBuilder().setId("1").setName("三国演义").setAuthor("罗贯中").setPrice(30).addTags("明清小说").addTags("通俗小说").build();
Book b2 = Book.newBuilder().setId("2").setName("西游记").setAuthor("吴承恩").setPrice(40).addTags("志怪小说").addTags("通俗小说").build();
Book b3 = Book.newBuilder().setId("3").setName("水浒传").setAuthor("施耐庵").setPrice(50).addTags("明清小说").addTags("通俗小说").build();
bookMap.put("1", b1);
bookMap.put("2", b2);
bookMap.put("3", b3);}
@Override
public void searchBooks(StringValue request, StreamObserver<Book> responseObserver){Set<String> keySet = bookMap.keySet();
String tags = request.getValue();
for (String key : keySet){
Book book = bookMap.get(key);int tagsCount = book.getTagsCount();
for (int i =0; i < tagsCount; i++){
String t = book.getTags(i);
if (t.equals(tags)){
responseObserver.onNext(book);
break;}}}
responseObserver.onCompleted();}}
public class BookServiceImpl extends BookServiceGrpc.BookServiceImplBase{
private Map<String, Book> bookMap = new HashMap<>();
public BookServiceImpl(){
Book b1 = Book.newBuilder().setId("1").setName("三国演义").setAuthor("罗贯中").setPrice(30).addTags("明清小说").addTags("通俗小说").build();
Book b2 = Book.newBuilder().setId("2").setName("西游记").setAuthor("吴承恩").setPrice(40).addTags("志怪小说").addTags("通俗小说").build();
Book b3 = Book.newBuilder().setId("3").setName("水浒传").setAuthor("施耐庵").setPrice(50).addTags("明清小说").addTags("通俗小说").build();
bookMap.put("1", b1);
bookMap.put("2", b2);
bookMap.put("3", b3);}
@Override
public StreamObserver<Book> updateBooks(StreamObserver<StringValue> responseObserver){
StringBuilder sb = new StringBuilder("更新的图书 ID 为:");
return new StreamObserver<Book>(){
@Override
public void onNext(Book book){
bookMap.put(book.getId(), book);
sb.append(book.getId()).append(",");}
@Override
public void onError(Throwable throwable){}
@Override
public void onCompleted(){
responseObserver.onNext(StringValue.newBuilder().setValue(sb.toString()).build());
responseObserver.onCompleted();}};}}
public class BookServiceImpl extends BookServiceGrpc.BookServiceImplBase{
private Map<String, Book> bookMap = new HashMap<>();
private List<Book> books = new ArrayList<>();
public BookServiceImpl(){
Book b1 = Book.newBuilder().setId("1").setName("三国演义").setAuthor("罗贯中").setPrice(30).addTags("明清小说").addTags("通俗小说").build();
Book b2 = Book.newBuilder().setId("2").setName("西游记").setAuthor("吴承恩").setPrice(40).addTags("志怪小说").addTags("通俗小说").build();
Book b3 = Book.newBuilder().setId("3").setName("水浒传").setAuthor("施耐庵").setPrice(50).addTags("明清小说").addTags("通俗小说").build();
bookMap.put("1", b1);
bookMap.put("2", b2);
bookMap.put("3", b3);}
@Override
public StreamObserver<StringValue> processBooks(StreamObserver<BookSet> responseObserver){
return new StreamObserver<StringValue>(){
@Override
public void onNext(StringValue stringValue){
Book b = Book.newBuilder().setId(stringValue.getValue()).build();
books.add(b);
if (books.size()==3){
BookSet bookSet = BookSet.newBuilder().addAllBookList(books).build();
responseObserver.onNext(bookSet);
books.clear();}}
@Override
public void onError(Throwable throwable){}
@Override
public void onCompleted(){
BookSet bookSet = BookSet.newBuilder().addAllBookList(books).build();
responseObserver.onNext(bookSet);
books.clear();
responseObserver.onCompleted();}};}}
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
这段代码没有实际意义,单纯为了给小伙伴们演示双向流,我的操作逻辑是客户端传递多个 ID 到服务端,然后服务端根据这些 ID 构建对应的 Book 对象,然后三个三个一组,再返回给客户端。客户端每次发送一个请求,都会触发服务端的 onNext 方法,我们在这个方法中对请求分组返回。最后如果还有剩余的请求,我们在 onCompleted() 方法中返回。
再来看看客户端的代码:
public class BookServiceClient {
public static void main(String[] args) throws InterruptedException {
ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost",50051).usePlaintext().build();
BookServiceGrpc.BookServiceStub stub = BookServiceGrpc.newStub(channel);
processBook(stub);}
private static void processBook(BookServiceGrpc.BookServiceStub stub) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(1);
StreamObserver<StringValue> request = stub.processBooks(new StreamObserver<BookSet>(){
@Override
public void onNext(BookSet bookSet){
System.out.println("bookSet = "+ bookSet);
System.out.println("=============");}
@Override
public void onError(Throwable throwable){}
@Override
public void onCompleted(){
System.out.println("处理完毕!");
countDownLatch.countDown();}});
request.onNext(StringValue.newBuilder().setValue("a").build());
request.onNext(StringValue.newBuilder().setValue("b").build());
request.onNext(StringValue.newBuilder().setValue("c").build());
request.onNext(StringValue.newBuilder().setValue("d").build());
request.onCompleted();
countDownLatch.await();}}