@@ -66,7 +66,7 @@ public class CircuitBreakingService extends ConsulService {
6666
6767 private static final Logger LOG = LoggerFactory .getLogger (CircuitBreakingService .class );
6868
69- private final Map <CircuitBreakingKey , Long > circuitBreakingConsulIndexMap = new ConcurrentHashMap <>();
69+ private final Map <CircuitBreakingKey , CircuitBreakingValue > circuitBreakingConsulIndexMap = new ConcurrentHashMap <>();
7070
7171 public CircuitBreakingService (ConsulClient consulClient , ConsulRawClient consulRawClient , ConsulContext consulContext ,
7272 String threadName , ObjectMapper mapper ) {
@@ -83,6 +83,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
8383 circuitBreakingKey .setNamespace (namespace );
8484 circuitBreakingKey .setService (service );
8585 Long currentIndex = getCircuitBreakingConsulIndex (circuitBreakingKey );
86+ CircuitBreakingValue currentCircuitBreakingValue = getCircuitBreakingValue (circuitBreakingKey );
8687 QueryParams queryParams = new QueryParams (consulContext .getWaitTime (), currentIndex );
8788 int code = ServerCodes .DATA_NO_CHANGE ;
8889 try {
@@ -100,6 +101,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
100101 }
101102
102103 Long newIndex = response .getConsulIndex ();
104+ boolean is404 = false ;
103105 // create service.
104106 ServiceProto .Service .Builder newServiceBuilder = ServiceProto .Service .newBuilder ();
105107 newServiceBuilder .setNamespace (StringValue .of (namespace ));
@@ -130,9 +132,16 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
130132 }
131133 }
132134 } else {
135+ if (currentCircuitBreakingValue != null && currentCircuitBreakingValue .isLast404 ) {
136+ code = ServerCodes .DATA_NO_CHANGE ;
137+ }
138+ is404 = true ;
133139 LOG .info ("empty circuit breaker rule: {}" , response );
134140 }
135141 } else {
142+ if (currentCircuitBreakingValue != null && currentCircuitBreakingValue .isLast404 ) {
143+ is404 = true ;
144+ }
136145 LOG .debug ("[TSF CIRCUIT BREAKER] Consul data is not changed" );
137146 }
138147 } else {
@@ -146,7 +155,7 @@ public void sendRequest(ServiceUpdateTask serviceUpdateTask) {
146155 ServerEvent serverEvent = new ServerEvent (serviceUpdateTask .getServiceEventKey (), newDiscoverResponseBuilder .build (), null , SERVER_CONNECTOR_CONSUL );
147156 boolean svcDeleted = serviceUpdateTask .notifyServerEvent (serverEvent );
148157 if (newIndex != null ) {
149- setCircuitBreakingConsulIndex (circuitBreakingKey , currentIndex , newIndex );
158+ setCircuitBreakingConsulIndex (circuitBreakingKey , currentIndex , newIndex , is404 );
150159 }
151160 if (!svcDeleted ) {
152161 serviceUpdateTask .addUpdateTaskSet ();
@@ -244,17 +253,21 @@ private List<CircuitBreakerProto.CircuitBreakerRule> parseResponse(String decode
244253 }
245254
246255 private Long getCircuitBreakingConsulIndex (CircuitBreakingKey circuitBreakingKey ) {
247- Long index = circuitBreakingConsulIndexMap .get (circuitBreakingKey );
248- if (index != null ) {
249- return index ;
256+ CircuitBreakingValue circuitBreakingValue = circuitBreakingConsulIndexMap .get (circuitBreakingKey );
257+ if (circuitBreakingValue != null && circuitBreakingValue . getIndex () != null ) {
258+ return circuitBreakingValue . getIndex () ;
250259 }
251- setCircuitBreakingConsulIndex (circuitBreakingKey , null , -1L );
260+ setCircuitBreakingConsulIndex (circuitBreakingKey , null , -1L , false );
252261 return -1L ;
253262 }
254263
255- private void setCircuitBreakingConsulIndex (CircuitBreakingKey circuitBreakingKey , Long lastIndex , Long newIndex ) {
256- LOG .debug ("CircuitBreakingKey: {}; lastIndex: {}; newIndex: {}" , circuitBreakingKey , lastIndex , newIndex );
257- circuitBreakingConsulIndexMap .put (circuitBreakingKey , newIndex );
264+ private CircuitBreakingValue getCircuitBreakingValue (CircuitBreakingKey circuitBreakingKey ) {
265+ return circuitBreakingConsulIndexMap .get (circuitBreakingKey );
266+ }
267+
268+ private void setCircuitBreakingConsulIndex (CircuitBreakingKey circuitBreakingKey , Long lastIndex , Long newIndex , Boolean is404 ) {
269+ LOG .debug ("CircuitBreakingKey: {}; lastIndex: {}; newIndex: {}, is404: {}" , circuitBreakingKey , lastIndex , newIndex , is404 );
270+ circuitBreakingConsulIndexMap .put (circuitBreakingKey , new CircuitBreakingValue (newIndex , is404 ));
258271 }
259272
260273 static class CircuitBreakingKey {
@@ -309,6 +322,40 @@ public String toString() {
309322 }
310323 }
311324
325+ static class CircuitBreakingValue {
326+ private Long index ;
327+ private Boolean isLast404 = false ;
328+
329+ public CircuitBreakingValue (Long index , Boolean isLast404 ) {
330+ this .index = index ;
331+ this .isLast404 = isLast404 ;
332+ }
333+
334+ public Long getIndex () {
335+ return index ;
336+ }
337+
338+ public void setIndex (Long index ) {
339+ this .index = index ;
340+ }
341+
342+ public Boolean getLast404 () {
343+ return isLast404 ;
344+ }
345+
346+ public void setLast404 (Boolean last404 ) {
347+ isLast404 = last404 ;
348+ }
349+
350+ @ Override
351+ public String toString () {
352+ return "CircuitBreakingValue{" +
353+ "index=" + index +
354+ ", isLast404=" + isLast404 +
355+ '}' ;
356+ }
357+ }
358+
312359 private CircuitBreakerProto .Level parseLevel (TsfCircuitBreakerIsolationLevelEnum isolationLevel ) {
313360 switch (isolationLevel ) {
314361 case INSTANCE :
0 commit comments