引起错误的原因,在负载均衡调用时 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);
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐