背景
利用kafka進(jìn)行消息生產(chǎn)和消費(fèi),生產(chǎn)線程或消費(fèi)線程在tomcat關(guān)閉的時(shí)候無(wú)法優(yōu)雅的停止,一定要強(qiáng)制退出才行。很不體面坯钦。
Runtime.addShutdownHook解釋
如果你想在jvm關(guān)閉的時(shí)候
進(jìn)行內(nèi)存清理法严、對(duì)象銷(xiāo)毀等操作,或者僅僅想起個(gè)線程然后這個(gè)線程不會(huì)退出葫笼,你可以使用Runtime.addShutdownHook深啤。
這個(gè)方法的作用就是在JVM中增加一個(gè)關(guān)閉的鉤子。當(dāng)程序正常退出路星、系統(tǒng)調(diào)用 System.exit方法或者虛擬機(jī)被關(guān)閉時(shí)才會(huì)執(zhí)行系統(tǒng)中已經(jīng)設(shè)置的所有鉤子溯街,當(dāng)系統(tǒng)執(zhí)行完這些鉤子后,JVM才會(huì)關(guān)閉
洋丐。所謂鉤子呈昔,就是一個(gè)已初始化但并不啟動(dòng)的線程。JVM退出通常通過(guò)兩種事件友绝。
- 程序正常退出堤尾,例如最后一個(gè)非守護(hù)進(jìn)程退出、使用System.exit()退出等
- 程序異常退出迁客,例如使用Ctrl+C觸發(fā)的中斷郭宝、用戶(hù)退出或系統(tǒng)關(guān)閉等系統(tǒng)事件等 該方法的說(shuō)明如下,詳細(xì)說(shuō)明參見(jiàn)官方文檔掷漱。
void java.lang.Runtime.addShutdownHook(Thread hook)
Parameters:
hook - An initialized but unstarted Thread object
Throws:
IllegalArgumentException - If the specified hook has already been registered, or if it can be determined that the hook is already running or has already been run
IllegalStateException - If the virtual machine is already in the process of shutting down
SecurityException - If a security manager is present and it denies RuntimePermission("shutdownHooks")
kafka代碼示例
在start的時(shí)候加個(gè)鉤子即可
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
KafkaConsumer.this.close();
}
});