我正在使用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中的代码。非常感谢!