java - 通过调用webClient请求出现IllegalStateException

标签 java spring-boot command-line webclient project-reactor

我的应用程序是一个非 Web Spring 启动应用程序,使用 WebClient 进行内部 get 调用。

每次启动它时,它都会返回java.lang.IllegalStateException:执行器不接受任务

问题与 webclient 调用有关:当我执行 block() 时,一切正常。当我尝试保持其 react 性时,它会抛出异常。

这是我的主要方法:

public static void main(String[] args) {
    SpringApplication app = new SpringApplication(Myapp.class);
    app.setBannerMode(Banner.Mode.OFF);
    app.run(args);
}

@Override
public void run(String... args) throws Exception {
    ///something that calls a webclient

    exit(0);
}

这是我的网络客户端调用:

@PostConstruct
private void init() {
    log.debug(String.format("diagram path %s", diagramPath));
    this.client = WebClient.builder()
            .baseUrl("blablabla")
            .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
            .build();
}

public Mono<String> getDiagram() {
    return client
            .get()
            .uri("/")
            .retrieve()
            .bodyToMono(MyResponse.class);

这是异常跟踪:

at io.netty.resolver.AddressResolverGroup.getResolver(AddressResolverGroup.java:60) ~[netty-resolver-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.bootstrap.Bootstrap.doResolveAndConnect0(Bootstrap.java:194) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.bootstrap.Bootstrap.access$000(Bootstrap.java:48) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:182) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.bootstrap.Bootstrap$1.operationComplete(Bootstrap.java:168) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:577) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:551) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:490) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:615) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.setSuccess0(DefaultPromise.java:604) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.DefaultPromise.trySuccess(DefaultPromise.java:104) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.DefaultChannelPromise.trySuccess(DefaultChannelPromise.java:84) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.safeSetSuccess(AbstractChannel.java:985) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.register0(AbstractChannel.java:505) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe.access$200(AbstractChannel.java:416) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.AbstractChannel$AbstractUnsafe$1.run(AbstractChannel.java:475) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:163) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:510) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:518) ~[netty-transport-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1050) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.43.Final.jar:4.1.43.Final]
    at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]

最佳答案

您的应用程序似乎处于关闭状态,因此 Netty 执行器不接受任务(要执行的请求)。如果不是 Web 应用程序,如何保持进程运行?

AddressResolverGroup源代码

59. if (executor.isShuttingDown()) {
60.     throw new IllegalStateException("executor not accepting a task");
61. }

(注意:在 @PostConstruct 方法中实例化 WebClient 实例看起来不正确)

关于java - 通过调用webClient请求出现IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58823079/

相关文章:

java - Spring Data REST + JPA 从 OneToMany 集合中删除 [不是所有者端]

java - 无法使用 Eclipse 访问 Amazon RDS

spring-boot - 如何解决 openapi-generator-maven-plugin 使用不推荐使用的类?

java - Null ModelAndView 返回到 DispatcherServlet,名称为 'dispatcherServlet' : assuming HandlerAdapter completed request handling

windows - 如何从 Windows 命令行执行 HTTP HEAD 请求?

linux - 输出重定向到没有临时文件的同一个文件

java - Maven - 如何组织项目/模块?

java - 自动虚拟机部署

firebase - 如何使用 Java 中的 FCM 将带有自定义图像的推送通知发送到 Web 应用程序

c - 在 C 中使用 read() 和 write() 代替 scanf() 和 printf()