Gateway 报错 java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is
引起错误的原因,在负载均衡调用时 BlockingLoadBalancerClient 会有一个 block 的操作@Overridepublic <T> ServiceInstance choose(String serviceId, Request<T> request) {// 略...// blockResponse<ServiceInstance> l
·
引起错误的原因,在负载均衡调用时 BlockingLoadBalancerClient 会有一个 block 的操作
@Override
public <T> ServiceInstance choose(String serviceId, Request<T> request) {
// 略...
// block
Response<ServiceInstance> loadBalancerResponse = Mono.from(loadBalancer.choose(request)).block();
// 略...
return loadBalancerResponse.getServer();
}
往里面走会看到有个 blockingGet 方法,有做一个判断当前线程是否为非阻塞线程(NonBlocking)
// BlockingSingleSubscriber 类方法
final T blockingGet() {
if (Schedulers.isInNonBlockingThread()) {
throw new IllegalStateException("block()/blockFirst()/blockLast() are blocking, which is not supported in thread " + Thread.currentThread().getName());
}
}
// Schedulers 类方法
public static boolean isInNonBlockingThread() {
return Thread.currentThread() instanceof NonBlocking;
}
由于 Gateway 使用的线程为 NonBlocking,因此会报错,解决方案可以直接使用其他线程池调用,使用 Future#get(long, Timeunit) 获取响应结果;简单的例子如下:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1 + 1);
Integer ret = future.get(1, TimeUnit.SECONDS);
更多推荐
所有评论(0)
您需要登录才能发言
加载更多