1、起初是dingding一直报错:

instance:服务器名
err:GrpcClient#placeOrder: io.grpc.StatusRuntimeException: UNKNOWN

2、定位错误位置(找到问题,复现问题)

  上面标红的代码是调用dingding,所以可以确定是调用grpc时,grpc内部报错,所以返回status message为 UNKNOWN。

public Object placeOrder(Integer uid, 其他参数) {

        PlaceOrderRequest request = PlaceOrderRequest.newBuilder().setUserid(uid).build();
GrpcReply response; try {
response = tradeBlockingStub.placeOrder(request);
UtilFunctions.log.info("GrpcClient#placeOrder rusult: code:{}, data:{}",
response.getCode(), response.getData());
return response;
} catch (StatusRuntimeException e) {
UtilFunctions.log.error("GrpcClient#placeOrder: msg:{}, exception:{}", e.toString(), e);
UtilFunctions.reportError("GrpcClient#placeOrder: " + e.toString(), e);
return null;
}
}

  

  查看linux上的日志,发现controller接收的数据price为NaN。

  所以,我在本地给price参数传NaN进行测试,果然出现同样的错误。grpc报错,原因是给Double类型的参数传了NaN,打印信息:

四月 10, 2019 1:20:48 下午 io.grpc.internal.SerializingExecutor run
严重: Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@2d37b2d0
java.lang.NumberFormatException

  

3、解决

  在controller对Double类型的数据进行判断。

Double obj;
obj.isNaN();

4、测试前台传NaN数据

  4.1、新建一个springboot项目(版本2.1.3)

  4.2、application.properties

server.port=8090
server.servlet.context-path=/

  4.3、IndexController.java

@RestController
public class IndexController { @RequestMapping("/index")
public Object demo1(Double price, Integer num) {
// 前端给price传NaN是可以的
// ==== price: NaN ====
if (price.isNaN()) {
System.out.println("---- price.isNaN ----");
}
System.out.println("==== price: " + price + " ====");
System.out.println(price.getClass().getName()); System.out.println("==== num: " + num + " ====");
System.out.println(num.getClass().getName()); Map<String, Object> result = new HashMap<>();
result.put("price", price);
result.put("num", num); return result;
}
}

  4.4、使用firefox测试

grpc(二)记一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN的更多相关文章

  1. Caused by: java.lang.ClassNotFoundException: Didn't find class "io.grpc.helloworldexample.HelloworldActivity" on path: DexPathList

    FAQ:  Android app 编译好后安装到手机,运行时闪退,报如下错误: java.lang.RuntimeException: Unable to instantiate activity ...

  2. No versions available for io.grpc:grpc-core:jar:[1.13.1] within specified range

    No versions available for i{0}:[1.13.1] within specified range maven打包的时候报错是由于同一个jar包有多个版本导致的版本冲突 解决 ...

  3. 记angular和asp.net使用grpc进行通信

    AspNetCore配置grpc服务端 新建一个Demo项目: GrpcStartup, 目录结构如下图: GrpcStartup.GrpcServices需要安装下面的依赖 <PackageR ...

  4. 初识google多语言通信框架gRPC系列(四)C++中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  5. 初识google多语言通信框架gRPC系列(三)C#中使用gRPC

    我的这几篇文章都是使用gRPC的example,不是直接编译example,而是新建一个项目,从添加依赖,编译example代码,执行example.这样做可以为我们创建自己的项目提供借鉴.如果对gR ...

  6. Spring Boot 2+gRPC 学习系列1:搭建Spring Boot 2+gRPC本地项目

    Spring Boot 2+gRPC 学习系列1:搭建Spring Boot 2+gRPC本地项目 https://blog.csdn.net/alinyua/article/details/8303 ...

  7. grpc(3):使用 golang 开发 grpc 服务端和client

    1,关于grpc-go golang 能够能够做grpc的服务端和client. 官网的文档: http://www.grpc.io/docs/quickstart/go.html https://g ...

  8. Java (二)基于Eclipse配置Commons IO的环境

    上一篇:Java (一)下载APACHE Commons IO 一.新建一个Java Project 二.使用鼠标右键点击工程,选择New > Folder 三.在Folder name输入文件 ...

  9. Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合

    上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型.   阻塞IO   过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd. 以简单的回射服务器 ...

随机推荐

  1. session_unset 与 session_destroy 区别

    session_unset() 释放当前在内存中已经创建的所有$_SESSION变量,但不删除session文件以及不释放对应的session id session_destroy() 删除当前用户对 ...

  2. MyBatisPlus忽略映射字段注解

    MyBatisPlus忽略映射字段注解 @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的. @TableField(exist = true):表示该 ...

  3. RoboWare Studio 安装

    RoboWare Studio是一个ROS集成开发环境.它使 ROS开发更加直观.简单.并且易于操作.可进行ROS工作区及包的管理.代码编辑.构建及调试. 下载链接:https://pan.baidu ...

  4. java之动态代理

    摘要 相比于静态代理,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定一组接口及目标类对象就能动态的获得代理对象. 这里说的静态代理可以理解为之前使用的装饰者模式,从之前使用装饰者模式实 ...

  5. 你不知道的JavaScript-2.词法作用域

    考虑以下代码: function foo(a) { var b = a * 2; function bar(c) { console.log( a, b, c ); } bar( b * 3 ); } ...

  6. XMLHttpRequest请求被劫持

    十几个请求中随机一个转到 <html><head><script language="javascript">setTimeout(" ...

  7. dll静态调用和动态调用

    动态链接库有2种连接方式,一种是通过库直接加入(又叫隐式加载或载入时加载),一种是在运行时加入.后者很好理解,比如LoadLibrary(),GetProcAddress()获取想要引入的函数,使用完 ...

  8. linux的查找命令 find whereis locate

    Linux 有三个查找文件的命令:find, whereis, locate 其中find 不常用,whereis与locate经常使用,因为find命令速度较慢,因为whereis与locate是利 ...

  9. 一个不错的git资源站点

    https://backlog.com/git-tutorial/cn/stepup/stepup2_8.html

  10. C++对象赋值问题