java 由于Tomcat错误“Socket accept failed”,无法使用SpringApplication.exit()终止Sping Boot 作业应用程序

jm81lzqq  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(458)

我有一个需要终止的作业应用程序(在EKS中作为外部cron运行,而不是在Sping Boot 应用程序本身中运行cron)。我在Eclipse中以Application.java-〉Run运行它,当它完成时,它不会终止(类似于Web应用程序)。
但是当我在run()的末尾手动执行此操作时:

@SpringBootApplication
public class MyApplication implements CommandLineRunner {

    @Autowired
    private ApplicationContext appContext;

    @Override
    public void run(String... args) throws Exception {

            // ... Run job, and at the end terminate manually

            SpringApplication.exit(appContext, new ExitCodeGenerator() {

                @Override
                public int getExitCode() {
                    return 0;
                }
                
            });

我得到这个错误:

org.apache.tomcat.util.net.Acceptor.log(175)- Socket接受失败

023-03-24 11:27:29.364 [main] INFO  o.a.coyote.http11.Http11NioProtocol.log(173) - Pausing ProtocolHandler ["http-nio-8081"]
2023-03-24 11:27:29.364 [main] WARN  o.apache.tomcat.util.net.NioEndpoint.log(173) - Failed to unlock acceptor for [http-nio-8081] because the local address was not available
2023-03-24 11:27:29.364 [main] INFO  o.a.catalina.core.StandardService.log(173) - Stopping service [Tomcat]
2023-03-24 11:27:29.364 [http-nio-8081-Acceptor] ERROR org.apache.tomcat.util.net.Acceptor.log(175) - Socket accept failed
java.nio.channels.AsynchronousCloseException: null
    at java.base/java.nio.channels.spi.AbstractInterruptibleChannel.end(AbstractInterruptibleChannel.java:202)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.end(ServerSocketChannelImpl.java:376)
    at java.base/sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:399)
    at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:520)
    at org.apache.tomcat.util.net.NioEndpoint.serverSocketAccept(NioEndpoint.java:79)
    at org.apache.tomcat.util.net.Acceptor.run(Acceptor.java:128)
    at java.base/java.lang.Thread.run(Thread.java:833)

有没有办法从这个Sping Boot 作业应用中删除Tomcat层,并手动终止它?

bejyjqdl

bejyjqdl1#

看起来你正在使用嵌入式Tomcat服务器与你的spring应用程序。为了避免这种情况并将其作为独立应用程序运行,需要实现CommandLineRunner接口,以便你可以将作业作为独立应用程序运行。这样的实现将是:

@Bean
    public CommandLineRunner commandLineRunner(ApplicationContext applicationContext) {
        return args -> {
            // Job code
            System.exit(0);
        };
    }
ep6jt1vc

ep6jt1vc2#

我找到了解决办法:只需从Pom.xml中删除spring-boot-starter-web依赖项,根据this thread

<!--  Removed 
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    -->

这会自动删除嵌入的Tomcat。实际上,我甚至不需要再执行SpringApplication.exit(),我去掉了那些额外的代码。现在,作业在完成时立即终止。

相关问题