grpc(二)記一次grpc debug--io.grpc.StatusRuntimeException: UNKNOWN


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測試

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM