Skip to content

Commit eb6fbf8

Browse files
imyxiaojvmlet
authored andcommitted
fix serverInterceptor order error (LogNet#56)
Good catch , thanks @imyxiao. Do you need release or snapshot build is OK ?
1 parent 1eca731 commit eb6fbf8

File tree

2 files changed

+32
-34
lines changed

2 files changed

+32
-34
lines changed

grpc-spring-boot-starter-demo/src/test/java/org/lognet/springboot/grpc/OrderedInterceptorsTest.java

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,10 @@
11
package org.lognet.springboot.grpc;
22

3-
import static org.assertj.core.api.Assertions.assertThat;
4-
5-
import io.grpc.ManagedChannel;
6-
import io.grpc.ManagedChannelBuilder;
7-
import io.grpc.Metadata;
8-
import io.grpc.ServerCall;
3+
import io.grpc.*;
94
import io.grpc.ServerCall.Listener;
10-
import io.grpc.ServerCallHandler;
11-
import io.grpc.ServerInterceptor;
125
import io.grpc.examples.GreeterGrpc;
136
import io.grpc.examples.GreeterGrpc.GreeterBlockingStub;
147
import io.grpc.examples.GreeterOuterClass;
15-
import java.util.ArrayList;
16-
import java.util.List;
178
import org.junit.After;
189
import org.junit.Before;
1910
import org.junit.Test;
@@ -26,6 +17,11 @@
2617
import org.springframework.core.annotation.Order;
2718
import org.springframework.test.context.junit4.SpringRunner;
2819

20+
import java.util.ArrayList;
21+
import java.util.List;
22+
23+
import static org.assertj.core.api.Assertions.assertThat;
24+
2925

3026
/**
3127
* Created by 310242212 on 11-Sep-16.
@@ -111,26 +107,26 @@ public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call,
111107
}
112108
}
113109

114-
// interceptors without any annotation will always be executed last, losing to any defined @Order
115110
@GRpcGlobalInterceptor
116-
static class UnorderedInterceptor implements ServerInterceptor {
111+
@Order // no value means lowest priority amongst all @Ordered, but higher priority than iceptors without the annot
112+
static class DefaultOrderedInterceptor implements ServerInterceptor {
117113

118114
@Override
119115
public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
120-
ServerCallHandler<ReqT, RespT> next) {
121-
calledInterceptors.add(100);
116+
ServerCallHandler<ReqT, RespT> next) {
117+
calledInterceptors.add(10);
122118
return next.startCall(call, headers);
123119
}
124120
}
125121

122+
// interceptors without any annotation will always be executed last, losing to any defined @Order
126123
@GRpcGlobalInterceptor
127-
@Order // no value means lowest priority amongst all @Ordered, but higher priority than iceptors without the annot
128-
static class DefaultOrderedInterceptor implements ServerInterceptor {
124+
static class UnorderedInterceptor implements ServerInterceptor {
129125

130126
@Override
131127
public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> call, Metadata headers,
132128
ServerCallHandler<ReqT, RespT> next) {
133-
calledInterceptors.add(10);
129+
calledInterceptors.add(100);
134130
return next.startCall(call, headers);
135131
}
136132
}

grpc-spring-boot-starter/src/main/java/org/lognet/springboot/grpc/GRpcServerRunner.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,7 @@
11
package org.lognet.springboot.grpc;
22

3-
import io.grpc.BindableService;
4-
import io.grpc.Server;
5-
import io.grpc.ServerBuilder;
6-
import io.grpc.ServerInterceptor;
7-
import io.grpc.ServerInterceptors;
8-
import io.grpc.ServerServiceDefinition;
3+
import io.grpc.*;
94
import io.grpc.health.v1.HealthCheckResponse;
10-
import io.grpc.inprocess.InProcessServerBuilder;
11-
import io.grpc.netty.NettyServerBuilder;
125
import io.grpc.services.HealthStatusManager;
136
import lombok.extern.slf4j.Slf4j;
147
import org.lognet.springboot.grpc.autoconfigure.GRpcServerProperties;
@@ -19,16 +12,13 @@
1912
import org.springframework.boot.CommandLineRunner;
2013
import org.springframework.context.support.AbstractApplicationContext;
2114
import org.springframework.core.annotation.AnnotationAwareOrderComparator;
15+
import org.springframework.core.annotation.AnnotationUtils;
16+
import org.springframework.core.annotation.Order;
2217
import org.springframework.core.type.StandardMethodMetadata;
2318

2419
import java.lang.annotation.Annotation;
25-
import java.util.Collection;
26-
import java.util.Collections;
27-
import java.util.List;
28-
import java.util.Map;
29-
import java.util.Optional;
30-
import java.util.Set;
31-
import java.util.concurrent.ConcurrentSkipListSet;
20+
import java.lang.reflect.Method;
21+
import java.util.*;
3222
import java.util.stream.Collectors;
3323
import java.util.stream.Stream;
3424

@@ -115,12 +105,24 @@ private ServerServiceDefinition bindInterceptors(ServerServiceDefinition service
115105
gRpcService.applyGlobalInterceptors() ? globalInterceptors.stream() : Stream.empty(),
116106
privateInterceptors)
117107
.distinct()
108+
.sorted(serverInterceptorComparator())
118109
.collect(Collectors.toList());
119-
interceptors.sort(AnnotationAwareOrderComparator.INSTANCE);
120-
Collections.reverse(interceptors);
121110
return ServerInterceptors.intercept(serviceDefinition, interceptors);
122111
}
123112

113+
private Comparator<Object> serverInterceptorComparator() {
114+
return AnnotationAwareOrderComparator.INSTANCE.thenComparing((o1, o2) -> {
115+
boolean p1 = isOrderAnnotated(o1);
116+
boolean p2 = isOrderAnnotated(o2);
117+
return p1 && !p2 ? -1 : p2 && !p1 ? 1 : 0;
118+
}).reversed();
119+
}
120+
121+
private boolean isOrderAnnotated(Object obj) {
122+
Order ann = obj instanceof Method ? AnnotationUtils.findAnnotation((Method) obj, Order.class) :
123+
AnnotationUtils.findAnnotation(obj.getClass(), Order.class);
124+
return ann != null;
125+
}
124126

125127
private void startDaemonAwaitThread() {
126128
Thread awaitThread = new Thread(()->{

0 commit comments

Comments
 (0)