关于Spring Cloud Stream应用程序正常关闭

时间:2018-03-15 08:01:34

标签: java spring spring-cloud-stream

我正在使用Spring Cloud Stream作为我的服务通信框架。但是如何在不强制终止工作线程(生成@StreamListener)的情况下关闭应用程序。

我写了一些符合要求的代码,但依赖于Map。我认为这不是一个好的解决方案。

@SpringBootApplication
@EnableBinding(Sink.class)
public class MessageReceiverApplication {
    private static final Logger logger = LoggerFactory.getLogger(MessageReceiverApplication.class);

    private AtomicLong atomicLong = new AtomicLong();
    private Map<Long, Void> map = new ConcurrentHashMap<>();

    @StreamListener(Sink.INPUT)
    @Transactional(rollbackFor = Exception.class)
    public void process(Message<String> message) {
        long count = atomicLong.incrementAndGet();
        try {
            map.put(count, null);
            logger.info("Processing:\t[{}]", count);
            Thread.sleep(new Random().nextInt(5000));
            logger.info("      Done:\t[{}]", count);
        } catch (InterruptedException e) {
            logger.error("Terminate Exceptionally");
        } finally {
            map.remove(count);
        }
    }

    @PostConstruct
    public void init() {
        logger.info("Start listening");
    }

    @PreDestroy
    public void tearDown() throws InterruptedException {
        logger.info("Closing...");
        while(map.size() > 0) {
            logger.warn("Waiting for Stream job done");
            Thread.sleep(500);
        }
    }

    public static void main(String[] args) {
        SpringApplication.run(MessageReceiverApplication.class, args);
    }
}

在这个例子中,我通过“java -jar”启动应用程序,并使用CTRL + C来终止应用程序。应用程序将终止,直到process()方法完成,因为while(map.size() > 0)检查流监听器线程。 我想知道是否有更优雅的方法来关闭线程而不中断@StreamListener中的代码。非常感谢!

0 个答案:

没有答案