ReactiveException: java.lang.InterruptedException 当我用@HystrixCommand 标记方法时
ReactiveException: java.lang.InterruptedException when I mark method with @HystrixCommand
我有以下方法:
@Timed(value = "my.request.timer", percentiles = {0.5, 0.95}, histogram = true)
public ResponseEntity<MyResponseDto> executeHttpCall(MyReq myReq) {
log.warn("!!!!! REAL METHOD!!!! for {}", myReq);
Mono<ResponseEntity<MyResponseDto>> responseEntityMono = webClient.post()
.bodyValue(myReq)
.retrieve()
.toEntity(MyResponseDto.class);
try {
return responseEntityMono.block();
} catch (Exception e) {
log.warn("EXCEPTION: ", e);
}
return null;
}
我想为该方法添加 hystrix,所以我得到了以下信息:
@HystrixCommand(fallbackMethod = "nullResponse",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "1000"),
@HystrixProperty(name = "maxQueueSize", value = "7777"),
})
@Timed(value = "my.request.timer", percentiles = {0.5, 0.95}, histogram = true)
public ResponseEntity<MyResponseDto> executeHttpCall(MyReq myReq) {
log.warn("!!!!! REAL METHOD!!!! for {}", myReq);
Mono<ResponseEntity<MyResponseDto>> responseEntityMono = webClient.post()
.bodyValue(myReq)
.retrieve()
.toEntity(myResponseDto.class);
try {
return responseEntityMono.block();
} catch (Exception e) {
log.warn("EXCEPTION: ", e);
}
return null;
}
public ResponseEntity<MyResponseDto> nullResponse(MyReq myReq) {
log.warn("Fallback method invoked for {}", myReq);
fallbackMethodIvocationCount.increment();
return null;
}
它成为错误的原因(它有时会重现,有时 - 不会)
2019-11-11 17:33:51.954 WARN 2996 --- [ConnectorImpl-9] b.m.a.p.MyDetectorAPIConnectorImpl : EXCEPTION:
2019-11-11 17:33:51.954 WARN 2996 --- [ConnectorImpl-9] b.m.a.p.MyDetectorAPIConnectorImpl : EXCEPTION:
reactor.core.Exceptions$ReactiveException: java.lang.InterruptedException
at reactor.core.Exceptions.propagate(Exceptions.java:336)
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:85)
at reactor.core.publisher.Mono.block(Mono.java:1663)
at my.MyService.executeHttpCall(MyDetectorAPIConnectorImpl.java:89)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
此问题可能是什么原因以及如何解决?
是因为hystrix默认超时。可以禁用此超时以使用以下 属性:
hystrix.command.default.execution.timeout.enabled: false
我有以下方法:
@Timed(value = "my.request.timer", percentiles = {0.5, 0.95}, histogram = true)
public ResponseEntity<MyResponseDto> executeHttpCall(MyReq myReq) {
log.warn("!!!!! REAL METHOD!!!! for {}", myReq);
Mono<ResponseEntity<MyResponseDto>> responseEntityMono = webClient.post()
.bodyValue(myReq)
.retrieve()
.toEntity(MyResponseDto.class);
try {
return responseEntityMono.block();
} catch (Exception e) {
log.warn("EXCEPTION: ", e);
}
return null;
}
我想为该方法添加 hystrix,所以我得到了以下信息:
@HystrixCommand(fallbackMethod = "nullResponse",
threadPoolProperties = {
@HystrixProperty(name = "coreSize", value = "1000"),
@HystrixProperty(name = "maxQueueSize", value = "7777"),
})
@Timed(value = "my.request.timer", percentiles = {0.5, 0.95}, histogram = true)
public ResponseEntity<MyResponseDto> executeHttpCall(MyReq myReq) {
log.warn("!!!!! REAL METHOD!!!! for {}", myReq);
Mono<ResponseEntity<MyResponseDto>> responseEntityMono = webClient.post()
.bodyValue(myReq)
.retrieve()
.toEntity(myResponseDto.class);
try {
return responseEntityMono.block();
} catch (Exception e) {
log.warn("EXCEPTION: ", e);
}
return null;
}
public ResponseEntity<MyResponseDto> nullResponse(MyReq myReq) {
log.warn("Fallback method invoked for {}", myReq);
fallbackMethodIvocationCount.increment();
return null;
}
它成为错误的原因(它有时会重现,有时 - 不会)
2019-11-11 17:33:51.954 WARN 2996 --- [ConnectorImpl-9] b.m.a.p.MyDetectorAPIConnectorImpl : EXCEPTION:
2019-11-11 17:33:51.954 WARN 2996 --- [ConnectorImpl-9] b.m.a.p.MyDetectorAPIConnectorImpl : EXCEPTION:
reactor.core.Exceptions$ReactiveException: java.lang.InterruptedException
at reactor.core.Exceptions.propagate(Exceptions.java:336)
at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:85)
at reactor.core.publisher.Mono.block(Mono.java:1663)
at my.MyService.executeHttpCall(MyDetectorAPIConnectorImpl.java:89)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
此问题可能是什么原因以及如何解决?
是因为hystrix默认超时。可以禁用此超时以使用以下 属性:
hystrix.command.default.execution.timeout.enabled: false