首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring boot应用程序不等待SIGTERM

Spring boot应用程序不等待SIGTERM
EN

Stack Overflow用户
提问于 2015-12-27 02:42:29
回答 1查看 1.9K关注 0票数 0

我正在尝试为我的spring boot应用程序添加一个SIGTERM支持。为了测试它,我添加了一个控制器映射,它应该模拟长请求:

代码语言:javascript
复制
@RequestMapping(value = "/sleep/{time}", method = RequestMethod.POST)
public void sleep(@PathVariable("time") int time) throws InterruptedException {
    int sleepLimit = 30000;
    if (time >= sleepLimit)
        throw new IllegalArgumentException("Sleep time cannot be more than " + sleepLimit + " ms.");
    Thread.sleep(time);
}

我使用的是嵌入式tomcat。问题在于,在请求处于活动状态时(在docker内的shell脚本中使用CTRL+C、/shutdown端点或陷阱)向进程发送kill SIGTERM时,应用程序会“关闭”测试请求,而不是等待调用完成。下面是调用SIGTERM时的日志:

代码语言:javascript
复制
2015-12-26 20:22:43.812  INFO 11608 --- [       Thread-8] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@548753b8: startup date [Sat Dec 26 20:22:13
 IST 2015]; root of context hierarchy
2015-12-26 20:22:43.815  INFO 11608 --- [       Thread-8] o.s.c.support.DefaultLifecycleProcessor  : Stopping beans in phase 0
2015-12-26 20:22:43.854  INFO 11608 --- [       Thread-8] o.s.j.e.a.AnnotationMBeanExporter        : Unregistering JMX-exposed beans on shutdown
2015-12-26 20:22:43.856  INFO 11608 --- [       Thread-8] o.s.j.d.e.EmbeddedDatabaseFactory        : Shutting down embedded database: url='jdbc:hsqldb:mem:testdb'
2015-12-26 20:22:43.880  INFO 11608 --- [       Thread-8] org.mongodb.driver.connection            : Closed connection [connectionId{localValue:2, serverValue:2}] to 127.0.0.1:26140 because the pool has been closed.
2015-12-26 20:22:45.093  WARN 11608 --- [       Thread-3] d.f.e.p.store.CachingArtifactStore       : Already removed de.flapdoodle.embed.process.extract.ImmutableExtractedFileSet@45524cfd for Version{3.0.2}:Windows:B64, emergency shutdown?

如何让我的应用程序等待此请求结束?谢谢!

EN

回答 1

Stack Overflow用户

发布于 2015-12-27 07:28:41

以下是我对此的解决方案:

代码语言:javascript
复制
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.metrics.CounterService;
import org.springframework.boot.actuate.metrics.buffer.BufferMetricReader;
import org.springframework.boot.context.embedded.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import javax.annotation.PreDestroy;
import javax.servlet.*;
import java.io.IOException;

@Service
@Scope("singleton")
public class ActiveSessionsService {

    private static final org.slf4j.Logger logger = LoggerFactory.getLogger(ActiveSessionsService.class);
    @Autowired
    CounterService counterService;
    @Autowired
    BufferMetricReader metrics;

    @Bean
    public FilterRegistrationBean filterRegistrationBean() {
        Filter filter = new Filter() {
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {
            }

            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                try {
                    counterService.increment("active-http-sessions");
                    filterChain.doFilter(servletRequest, servletResponse);
                } finally {
                    counterService.decrement("active-http-sessions");
                }
            }

            @Override
            public void destroy() {
            }
        };
        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns("/base/*");
        return registrationBean;
    }
    @PreDestroy
    public void cleanUp() throws Exception {
        int waitTime=0;
        while (waitTime < 10) {
            if(!isThereActiveRequests())
                break;
            Thread.sleep(1000);
        }
    }

    private boolean isThereActiveRequests() {
        int activeCalls =metrics.findOne("counter.active-http-sessions").getValue().intValue();
        logger.info(activeCalls +" Active sessions");
        return activeCalls>0;
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34474143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档