如何通过Postman在WSO2微集成器中发起gRPC请求?遇空指针异常
WSO2微集成器gRPC入站端点空指针异常排查与解决
问题场景
- 配置gRPC入站端点:
创建grpcInboundEndpoint.xml并放置到<MI_Home>/repository/deployment/server/synapse-configs/default/inbound-endpoints目录,启动WSO2 MI:<?xml version="1.0" encoding="UTF-8"?> <inboundEndpoint xmlns="http://ws.apache.org/ns/synapse" name="GrpcInboundEndpoint" sequence="inSeq" onError="fault" protocol="grpc" suspend="false"> <parameters> <parameter name="inbound.grpc.port">8888</parameter> </parameters> </inboundEndpoint> - 通过Postman发起gRPC请求:
调用EventService.process方法,使用的请求消息:{ "headers": {}, "payload": "test" } - 异常表现:
控制台抛出空指针异常,gRPC返回状态码2 UNKNOWN,异常栈信息:[2024-03-29 14:15:48,233] ERROR {io.grpc.internal.SerializingExecutor} - - Exception while executing runnable io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed@547800d3 java.lang.NullPointerException at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) at java.util.concurrent.ConcurrentHashMap.putIfAbsent(ConcurrentHashMap.java:1535) at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectInbound(Axis2SynapseEnvironment.java:423) at org.wso2.carbon.inbound.endpoint.protocol.grpc.GRPCInjectHandler.initiateSequenceAndInjectPayload(GRPCInjectHandler.java:138) at org.wso2.carbon.inbound.endpoint.protocol.grpc.GRPCInjectHandler.invokeProcess(GRPCInjectHandler.java:84) at org.wso2.carbon.inbound.endpoint.protocol.grpc.InboundGRPCListener$1.process(InboundGRPCListener.java:84) at org.wso2.carbon.inbound.endpoint.protocol.grpc.util.EventServiceGrpc$MethodHandlers.invoke(EventServiceGrpc.java:290) at io.grpc.stub.ServerCalls$UnaryServerCallHandler$UnaryServerCallListener.onHalfClose(ServerCalls.java:182) at io.grpc.internal.ServerCallImpl$ServerStreamListenerImpl.halfClosed(ServerCallImpl.java:351) at io.grpc.internal.ServerImpl$JumpToApplicationThreadServerStreamListener$1HalfClosed.runInContext(ServerImpl.java:861) at io.grpc.internal.ContextRunnable.run(ContextRunnable.java:37) at io.grpc.internal.SerializingExecutor.run(SerializingExecutor.java:133) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750)
排查与解决方法
1. 确保关联的序列存在
入站端点配置中指定了sequence="inSeq",但如果该序列未创建,会导致消息注入时触发空指针:
- 解决:在
<MI_Home>/repository/deployment/server/synapse-configs/default/sequences目录创建inSeq.xml,示例:
创建后重启WSO2 MI或等待热部署生效。<?xml version="1.0" encoding="UTF-8"?> <sequence xmlns="http://ws.apache.org/ns/synapse" name="inSeq"> <log level="full"/> <respond/> </sequence>
2. 修正gRPC请求消息格式
WSO2 MI的gRPC入站端点依赖Protobuf定义生成的Stub类,请求消息必须与Protobuf定义的结构严格匹配:
- 你发送的消息包含外层
headers和payload嵌套,但根据对应Protobuf定义,process方法的请求类型为EventRequest,仅包含payload字段,因此正确的请求消息应为:
或直接传入字符串值(根据Protobuf JSON映射规则):{ "payload": "test" }"test"
3. 升级WSO2 MI版本
部分旧版本的WSO2 MI存在gRPC入站端点的空指针bug,建议升级到4.2.0及以上的稳定版本,修复已知问题。
4. 校验依赖完整性
确认WSO2 MI的<MI_Home>/lib目录下包含所有gRPC相关依赖jar包,若缺失依赖会导致消息处理时出现异常。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

