Skip to content

Commit 30deff5

Browse files
committed
Make GrpcExceptionHandlerListener inner class
1 parent 9e187c4 commit 30deff5

4 files changed

Lines changed: 86 additions & 94 deletions

File tree

grpc-boot-autoconfigure/grpc-server-boot-autoconfigure/src/main/java/grpcstarter/server/feature/exceptionhandling/ExceptionHandlingServerInterceptor.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package grpcstarter.server.feature.exceptionhandling;
22

3+
import io.grpc.ForwardingServerCallListener;
34
import io.grpc.Metadata;
45
import io.grpc.ServerCall;
56
import io.grpc.ServerCallHandler;
67
import io.grpc.ServerInterceptor;
8+
import io.grpc.StatusRuntimeException;
79
import java.util.List;
10+
import java.util.Optional;
811
import java.util.stream.Collectors;
912
import org.springframework.beans.factory.ObjectProvider;
1013
import org.springframework.core.Ordered;
@@ -37,4 +40,61 @@ public <I, O> ServerCall.Listener<I> interceptCall(
3740
public int getOrder() {
3841
return ORDER;
3942
}
43+
44+
private static final class GrpcExceptionHandlerListener<I, O>
45+
extends ForwardingServerCallListener.SimpleForwardingServerCallListener<I> {
46+
private final ServerCall<I, O> call;
47+
private final Metadata headers;
48+
private final List<GrpcExceptionResolver> grpcExceptionResolvers;
49+
private final List<GrpcUnhandledExceptionProcessor> grpcUnhandledExceptionProcessors;
50+
51+
private GrpcExceptionHandlerListener(
52+
ServerCall.Listener<I> delegate,
53+
ServerCall<I, O> call,
54+
Metadata headers,
55+
List<GrpcExceptionResolver> grpcExceptionResolvers,
56+
List<GrpcUnhandledExceptionProcessor> grpcUnhandledExceptionProcessors) {
57+
super(delegate);
58+
this.call = call;
59+
this.headers = headers;
60+
this.grpcExceptionResolvers = grpcExceptionResolvers;
61+
this.grpcUnhandledExceptionProcessors = grpcUnhandledExceptionProcessors;
62+
}
63+
64+
@Override
65+
public void onMessage(I message) {
66+
try {
67+
super.onMessage(message);
68+
} catch (Exception e) {
69+
if (!handle(e)) {
70+
throw e;
71+
}
72+
}
73+
}
74+
75+
@Override
76+
public void onHalfClose() {
77+
try {
78+
super.onHalfClose();
79+
} catch (Exception e) {
80+
if (!handle(e)) {
81+
throw e;
82+
}
83+
}
84+
}
85+
86+
private boolean handle(Exception e) {
87+
for (GrpcExceptionResolver resolver : grpcExceptionResolvers) {
88+
StatusRuntimeException sre = resolver.resolve(e, call, headers);
89+
if (sre != null) {
90+
call.close(
91+
sre.getStatus(),
92+
Optional.ofNullable(sre.getTrailers()).orElseGet(Metadata::new));
93+
return true;
94+
}
95+
}
96+
grpcUnhandledExceptionProcessors.forEach(processor -> processor.process(e, call, headers));
97+
return false;
98+
}
99+
}
40100
}

grpc-boot-autoconfigure/grpc-server-boot-autoconfigure/src/main/java/grpcstarter/server/feature/exceptionhandling/GrpcExceptionHandlerListener.java

Lines changed: 0 additions & 68 deletions
This file was deleted.

grpc-boot-autoconfigure/grpc-server-boot-autoconfigure/src/main/java/grpcstarter/server/feature/exceptionhandling/annotation/GrpcExceptionHandlerMethod.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
* @author Freeman
2424
*/
2525
@Getter
26-
public class GrpcExceptionHandlerMethod {
26+
class GrpcExceptionHandlerMethod {
2727

2828
private final Object bean;
2929
private final Integer beanOrder;

website/docs/40-configuration-properties.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -139,80 +139,80 @@ This page was generated by [spring-configuration-property-documenter](https://gi
139139

140140
|Key|Type|Description|Default value|Deprecation|
141141
|---|----|-----------|-------------|-----------|
142-
| cert-chain| org.springframework.core.io.Resource| @see TlsServerCredentials.Builder#getCertificateChain()| | |
143-
| private-key| org.springframework.core.io.Resource| @see TlsServerCredentials.Builder#getPrivateKey()| | |
144-
| private-key-password| java.lang.String| @see TlsServerCredentials.Builder#getPrivateKeyPassword()| | |
142+
| cert-chain| org.springframework.core.io.Resource| | | |
143+
| private-key| org.springframework.core.io.Resource| | | |
144+
| private-key-password| java.lang.String| | | |
145145
### grpc.server.tls.trust-manager
146146
**Class:** `grpcstarter.server.GrpcServerProperties$Tls$TrustManager`
147147

148148
|Key|Type|Description|Default value|Deprecation|
149149
|---|----|-----------|-------------|-----------|
150-
| root-certs| org.springframework.core.io.Resource| @see TlsServerCredentials.Builder#getRootCertificates()| | |
150+
| root-certs| org.springframework.core.io.Resource| | | |
151151
### grpc.server.health.datasource
152152
**Class:** `grpcstarter.server.GrpcServerProperties$Health$DataSource`
153153

154154
|Key|Type|Description|Default value|Deprecation|
155155
|---|----|-----------|-------------|-----------|
156-
| enabled| java.lang.Boolean| Whether to enable datasource health check, default true.| true| |
157-
| service| java.lang.String| The service name that will be used for datasource health check, default value is &#x27;datasource&#x27;.| datasource| |
158-
| timeout| java.lang.Integer| \{@link #validationQuery} timeout, unit seconds.| | |
159-
| validation-query| java.lang.String| The SQL query that will be used to validate datasource connection, default value is &#x27;SELECT 1&#x27;.| SELECT 1| |
156+
| enabled| java.lang.Boolean| | | |
157+
| service| java.lang.String| | | |
158+
| timeout| java.lang.Integer| | | |
159+
| validation-query| java.lang.String| | | |
160160
### grpc.server.health.redis
161161
**Class:** `grpcstarter.server.GrpcServerProperties$Health$Redis`
162162

163163
|Key|Type|Description|Default value|Deprecation|
164164
|---|----|-----------|-------------|-----------|
165-
| enabled| java.lang.Boolean| Whether to enable redis health check, default true.| true| |
166-
| service| java.lang.String| The service name that will be used for redis health check, default value is &#x27;redis&#x27;.| redis| |
165+
| enabled| java.lang.Boolean| | | |
166+
| service| java.lang.String| | | |
167167
### grpc.server
168168
**Class:** `grpcstarter.server.GrpcServerProperties`
169169

170170
|Key|Type|Description|Default value|Deprecation|
171171
|---|----|-----------|-------------|-----------|
172-
| enable-empty-server| java.lang.Boolean| Whether to start a gRPC server when no service found, default true.| true| |
173-
| enabled| java.lang.Boolean| Whether to enable gRPC server autoconfiguration, default true.| true| |
174-
| max-inbound-message-size| org.springframework.util.unit.DataSize| The maximum message size allowed to be received on the server, default 4MB. @see GrpcUtil#DEFAULT_MAX_MESSAGE_SIZE| | |
175-
| max-inbound-metadata-size| org.springframework.util.unit.DataSize| The maximum size of metadata allowed to be received, default 8KB. @see GrpcUtil#DEFAULT_MAX_HEADER_LIST_SIZE| | |
176-
| port| java.lang.Integer| gRPC server port, default 9090, 0 or negative numbers will use random port.| 9090| |
177-
| shutdown-timeout| java.lang.Long| Graceful shutdown timeout, default 30s, if 0 will wait forever util all active calls finished.| 30000| |
172+
| enable-empty-server| java.lang.Boolean| | | |
173+
| enabled| java.lang.Boolean| | | |
174+
| max-inbound-message-size| org.springframework.util.unit.DataSize| | | |
175+
| max-inbound-metadata-size| org.springframework.util.unit.DataSize| | | |
176+
| port| java.lang.Integer| | | |
177+
| shutdown-timeout| java.lang.Long| | | |
178178
### grpc.server.channelz
179179
**Class:** `grpcstarter.server.GrpcServerProperties$Channelz`
180180

181181
|Key|Type|Description|Default value|Deprecation|
182182
|---|----|-----------|-------------|-----------|
183-
| enabled| java.lang.Boolean| Whether to register \{@link ChannelzService}, default false.| false| |
184-
| max-page-size| java.lang.Integer| The maximum page size to return, default 100. @see AdminInterface| 100| |
183+
| enabled| java.lang.Boolean| | | |
184+
| max-page-size| java.lang.Integer| | | |
185185
### grpc.server.exception-handling
186186
**Class:** `grpcstarter.server.GrpcServerProperties$ExceptionHandling`
187187

188188
|Key|Type|Description|Default value|Deprecation|
189189
|---|----|-----------|-------------|-----------|
190-
| default-exception-advice-enabled| java.lang.Boolean| Whether to enable \{@link DefaultGrpcExceptionAdvice}, default true. &lt;p&gt; \{@link DefaultGrpcExceptionAdvice} will handle exceptions recognized by gRPC, including: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;\{@link StatusRuntimeException}&lt;/li&gt; &lt;li&gt;\{@link StatusException}&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; When enabled, you can directly throw \{@link StatusRuntimeException} or \{@link StatusException} in service implementation, and the exception will be handled by \{@link DefaultGrpcExceptionAdvice}. &lt;/p&gt; &lt;pre&gt;\{@code @GrpcService public class SimpleService extends SimpleServiceGrpc.SimpleServiceImplBase \{ @Override public void unaryRpc(SimpleRequest request, StreamObserver&lt;SimpleResponse&gt; responseObserver) \{ throw new StatusRuntimeException(Status.INVALID_ARGUMENT.withDescription(&quot;Invalid request&quot;)); } } }&lt;/pre&gt; @see DefaultGrpcExceptionAdvice @since 3.2.3| true| |
191-
| enabled| java.lang.Boolean| Whether to enable exception handling, default true.| true| |
190+
| default-exception-advice-enabled| java.lang.Boolean| | | |
191+
| enabled| java.lang.Boolean| | | |
192192
### grpc.server.health
193193
**Class:** `grpcstarter.server.GrpcServerProperties$Health`
194194

195195
|Key|Type|Description|Default value|Deprecation|
196196
|---|----|-----------|-------------|-----------|
197-
| enabled| java.lang.Boolean| Whether to enable health check, default false.| true| |
197+
| enabled| java.lang.Boolean| | | |
198198
### grpc.server.in-process
199199
**Class:** `grpcstarter.server.GrpcServerProperties$InProcess`
200200

201201
|Key|Type|Description|Default value|Deprecation|
202202
|---|----|-----------|-------------|-----------|
203-
| name| java.lang.String| In-process server name, if configured, will create an in-process server, usually for testing.| | |
203+
| name| java.lang.String| | | |
204204
### grpc.server.reflection
205205
**Class:** `grpcstarter.server.GrpcServerProperties$Reflection`
206206

207207
|Key|Type|Description|Default value|Deprecation|
208208
|---|----|-----------|-------------|-----------|
209-
| enabled| java.lang.Boolean| Whether to register reflection service, default false.| false| |
209+
| enabled| java.lang.Boolean| | | |
210210
### grpc.server.response
211211
**Class:** `grpcstarter.server.GrpcServerProperties$Response`
212212

213213
|Key|Type|Description|Default value|Deprecation|
214214
|---|----|-----------|-------------|-----------|
215-
| max-description-length| java.lang.Integer| The maximum length of response description. &lt;p&gt; When the length of the description exceeds this value, it will be truncated. &lt;/p&gt; @since 3.2.3| 2048| |
215+
| max-description-length| java.lang.Integer| | | |
216216
### grpc.server.tls
217217
**Class:** `grpcstarter.server.GrpcServerProperties$Tls`
218218

@@ -318,4 +318,4 @@ This page was generated by [spring-configuration-property-documenter](https://gi
318318
| enabled| java.lang.Boolean| Whether to enable validation, default is \{@code true}.| true| |
319319
| order| java.lang.Integer| Validating interceptor order, default is \{@code 0}.| 0| |
320320

321-
This is a generated file, generated at: **2024-06-21T21:02:52.512970**
321+
This is a generated file, generated at: **2024-06-21T21:12:14.230036**

0 commit comments

Comments
 (0)