語音社交原始碼重啟,正在執行的任務會如何處理?
1.前言
在語音社交原始碼重啟過程中,正在進行的請求會如何被處理?正在消費的訊息會不會丟失?非同步執行的任務會不會被中斷?既然存在這些問題,那我們的語音社交原始碼是不是就不能重啟?但是,我們的語音社交原始碼隨著版本迭代也在不斷重啟為什麼這些問題沒有出現呢?還是應用做了額外處理?帶著這些疑問,結合場景模擬,看看實際情況怎麼處理。
2. 場景
2.1 http請求
2.1.1 建立請求
@RestController public class ShutDownController { @RequestMapping("shut/down") public String shutDown() throws InterruptedException { TimeUnit.SECONDS.sleep(20); return "hello"; } }
2.1.2 呼叫請求
2.1.3 模擬重啟
kill -2 應用pid
2.1.4 現象
2.1.5 結論
請求執行過程中,關閉語音社交原始碼出現無法訪問提示
2.1.6 開啟優雅關機
如上出現的現象對使用者來說很不友好,會造成使用者一臉懵逼,那麼有沒有什麼措施可以避免這種現象的出現呢?是否可以在應用關閉前執行完已經接受的請求,拒絕新的請求呢?答案可以的,只需要在語音社交原始碼配置檔案中新增優雅關機配置
server: shutdown: graceful # 設定優雅關閉,該功能在Spring Boot2.3版本中才有。注意:需要使用Kill -2 觸發來關閉應用,該命令會觸發shutdownHook spring: lifecycle: timeout-per-shutdown-phase: 30s # 設定緩衝時間,注意需要帶上時間單位(該時間用於等待任務執行完成)
新增完配置後,再次執行2.1.2和2.1.3流程,就會看到如下效果
可以看到,即便在請求執行過程中關閉語音社交原始碼,已接收的請求依然會執行下去
2.2 訊息消費
在前言提到過,訊息消費過程中,關閉語音社交原始碼,訊息是會丟失還是會被重新放入訊息佇列中呢?
2.2.1 建立生產者
@RestController public class RabbitMqController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendBusinessMessage") public void sendBusinessMessage() throws InterruptedException { rabbitTemplate.convertAndSend(RabbitmqConfig.BUSINESS_EXCHANGE, RabbitmqConfig.BUSINESS_ROUTING_KEY, "send message"); TimeUnit.SECONDS.sleep(10000); } }
2.2.2 建立消費者
@Component @RabbitListener(queues = RabbitmqConfig.BUSINESS_QUEUE_NAME) @Slf4j public class BusinessConsumer { /** * 操作場景: * 1.通過RabbitmqApplication啟動類啟動應用程式 * 2.呼叫/sendBusinessMessage介面傳送訊息 * 3.RabbitMQ broker將訊息傳送給消費者 * 4.消費者收到訊息後進行消費 * 5.消費者消費訊息過程中,應用程式關閉,斷開channel,斷開connection,未ack的訊息會被重新放入broker中 * * @param content 訊息內容 * @param channel channel通道 * @param message message物件 */ @RabbitHandler public void helloConsumer(String content, Channel channel, Message message) { log.info("business consumer receive message:{}", content); try { // 模擬業務執行耗時 TimeUnit.SECONDS.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } }
2.2.3 呼叫請求
2.2.4 未關閉應用前
2.2.5 關閉應用後
2.2.6 結論訊息消費過程中,關閉語音社交原始碼,未ack的訊息會被重新放入訊息佇列中,以此來保證訊息一定會被消費
2.3 非同步任務
2.3.1 執行緒池配置
@Component public class ThreadPoolConfig { @Bean public ThreadPoolTaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor(); threadPoolTaskExecutor.setThreadNamePrefix("test-"); threadPoolTaskExecutor.setCorePoolSize(3); threadPoolTaskExecutor.setMaxPoolSize(3); threadPoolTaskExecutor.setQueueCapacity(100); return threadPoolTaskExecutor; } }
2.3.2 非同步任務請求
@Autowired private ThreadPoolTaskExecutor threadPoolTaskExecutor; @RequestMapping("async/task") public void asyncTask() throws InterruptedException { for (int i = 0; i < 10; i++) { threadPoolTaskExecutor.execute(() -> { try { TimeUnit.SECONDS.sleep(10); } catch (InterruptedException e) { throw new RuntimeException(); } log.info("task execute complete..."); }); } }
2.3.3 呼叫請求
2.3.4 模擬重啟
kill -2 應用pid
2.3.5 現象
Exception in thread "test-2" Exception in thread "test-1" Exception in thread "test-3" java.lang.RuntimeException at com.boot.example.ShutDownController.lambda$asyncTask$0(ShutDownController.java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) java.lang.RuntimeException at com.boot.example.ShutDownController.lambda$asyncTask$0(ShutDownController.java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) java.lang.RuntimeException at com.boot.example.ShutDownController.lambda$asyncTask$0(ShutDownController.java:37) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
2.3.6 修改執行緒池配置
線上程池配置中新增如下配置:
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true); threadPoolTaskExecutor.setAwaitTerminationSeconds(120);
2.3.7 修改配置後現象
2021-12-09 17:09:40.054 INFO 22383 --- [ test-1] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:09:40.055 INFO 22383 --- [ test-3] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:09:40.055 INFO 22383 --- [ test-2] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:09:50.059 INFO 22383 --- [ test-3] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:09:50.059 INFO 22383 --- [ test-1] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:09:50.060 INFO 22383 --- [ test-2] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:10:00.062 INFO 22383 --- [ test-2] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:10:00.062 INFO 22383 --- [ test-1] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:10:00.065 INFO 22383 --- [ test-3] com.boot.example.ShutDownController : task execute complete... 2021-12-09 17:10:10.066 INFO 22383 --- [ test-1] com.boot.example.ShutDownController : task execute complete...
2.3.8 結論
使用執行緒池執行非同步任務,在沒有新增配置的情況下,任務無法執行完成,在新增配置的情況下,任務依然可以執行完成。
3. 總結
為了保證在語音社交原始碼重啟過程中任務仍然可以執行完成,需要開啟優雅關機配置並對執行緒池新增等待任務執行完成以及等待時間配置
本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69996194/viewspace-2847716/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何避免任務重複執行
- Java 多執行緒處理任務的封裝Java執行緒封裝
- Java多執行緒並行處理任務的實現Java執行緒並行
- Spark 叢集執行任務失敗的故障處理Spark
- 關機提示 ”task host window任務宿主正在執行關閉任務並且正在停止已執行的任務“我是這樣解決的
- 語音社交原始碼開發,兩個執行緒按照指定方式有序相交的實現原始碼執行緒
- Java實現終止執行緒池中正在執行的定時任務Java執行緒
- 計劃任務執行批處理指令碼,執行記錄顯示“上次執行結果(0x1)”指令碼
- 使用 Rx 的計算和最大化執行緒處理並行任務執行緒並行
- 查詢某個會話正在執行的事務會話
- [原始碼分析]並行分散式任務佇列 Celery 之 子程式處理訊息原始碼並行分散式佇列
- 音訊服務未執行win10如何處理_win10電腦顯示音訊服務未執行怎麼解決音訊Win10
- 使用Rustlang的Async Tokio執行時處理CPU密集型任務Rust
- 如何進行音訊修處理音訊
- eKuiper 原始碼解讀:從一條 SQL 到流處理任務的旅程UI原始碼SQL
- Springboot-之定時任務,啟動執行任務Spring Boot
- 如何編譯執行HanLP自然語言處理包編譯HanLP自然語言處理
- JAVA執行緒池原理原始碼解析—為什麼啟動一個執行緒池,提交一個任務後,Main方法不會退出?Java執行緒原始碼AI
- 13.你會處理Dart中的非同步任務嗎?Dart非同步
- YYWebImage 原始碼剖析:執行緒處理與快取策略Web原始碼執行緒快取
- 語音社交平臺受到關注 語音社交平臺會是新風口嗎?
- Spring Boot使用執行緒池處理事務任務Spring Boot執行緒
- CPA十六--債務重組的會計處理(轉載)
- PHP多程式處理並行處理任務例項(轉,備用)PHP並行
- Android 效能優化之使用執行緒池處理非同步任務Android優化執行緒非同步
- 海豚排程調優 | 正在執行的工作流(DAG)如何重新拉起失敗的任務(Task)
- 【Gp】PostgreSql中如何kill掉正在執行的sql語句SQL
- 語音識別----音高的處理
- BREW中的特殊語音處理
- 機器配音微信小程式原始碼 多種語音任微信小程式原始碼
- PHP 多程式處理任務PHP
- 如何處理執行緒死鎖執行緒
- ThreadPoolExecutor執行緒池任務執行失敗的時候會怎樣thread執行緒
- 如何使用WorkManager執行後臺任務(上)
- 語音派對系統原始碼的功能已突破現有社交格局原始碼
- 查詢正在執行的SQL語句SQL
- 小豹子帶你看原始碼:Java 執行緒池(三)提交任務原始碼Java執行緒
- Java中的任務超時處理Java