1import{_ as i,c as a,b as n,o as l}from"./app-BX6j4ZW7.js";const h={};function t(k,s){return l(),a("div",null,[...s[0]||(s[0]=[n(`<h2 id="åè¨" tabindex="-1"><a class="header-anchor" href="#åè¨"><span>åè¨</span></a></h2><div class="article-referral-ad"><p>æè¿ç¼ºé¡¹ç®ç»åæ³å¿«éæå项ç®å®æè½åï¼å å«å¤ä¸ªAI项ç®ï¼ï¼æè æè¿æ¾å·¥ä½ï¼æè æ³å¦ä¹ AIçå°ä¼ä¼´ï¼å¯ä»¥ççä¸é¢ðð»ç<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad1" rel="nofollow">è¿ä¸ªé¾æ¥</a>ï¼æè®¸ççè½å¤å¸®å°ä½ ï¼ã</p></div><p>æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼</p><p>è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å ¥MQè¿ä¹ä¸ª"ä¸é´å"ï¼</p><p>ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£äºMQçä»·å¼ã</p><p>ä»å¤©ææ³å大家å享æå¨å®é å·¥ä½ä¸ä½¿ç¨æ¶æ¯éåï¼MQï¼ç10ç§å ¸ååºæ¯ï¼å¸æå¯¹ä½ 伿æå¸®å©ã</p><h2 id="ä¸ã为ä»ä¹éè¦æ¶æ¯éå-mq" tabindex="-1"><a class="header-anchor" href="#ä¸ã为ä»ä¹éè¦æ¶æ¯éå-mq"><span>ä¸ã为ä»ä¹éè¦æ¶æ¯éåï¼MQï¼ï¼</span></a></h2><p>卿·±å ¥å ·ä½åºæ¯ä¹åï¼æä»¬å æ¥æèä¸ä¸ªåºæ¬é®é¢ï¼ä¸ºä»ä¹è¦ä½¿ç¨æ¶æ¯éåï¼</p><p>ç³»ç»é´çç´æ¥è°ç¨ï¼ <img src="https://files.mdnice.com/user/5303/2c4ccb38-1bbe-4e89-889a-f21bd64f2f25.png" alt=""></p><p>å¼å ¥æ¶æ¯éååï¼ <img src="https://files.mdnice.com/user/5303/57425719-d707-4fee-899d-96cbda84b5ec.png" alt=""></p><p>æ¥ä¸æ¥æä»¬å°éè¿10ä¸ªå ·ä½åºæ¯ï¼å¸¦å¤§å®¶æ¥æ·±å ¥çè§£MQçä»·å¼ã</p><h2 id="åºæ¯ä¸-ç³»ç»è§£è¦" tabindex="-1"><a class="header-anchor" href="#åºæ¯ä¸-ç³»ç»è§£è¦"><span>åºæ¯ä¸ï¼ç³»ç»è§£è¦</span></a></h2><h3 id="èæ¯æè¿°" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°"><span>èæ¯æè¿°</span></a></h3><p>å¨ææ©æåä¸çä¸ä¸ªçµå项ç®ä¸ï¼è®¢åå建åéè¦éç¥å¤ä¸ªç³»ç»ï¼</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// æ©æçç´§è¦å设计</span></span> 2<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 3<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> InventoryService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> inventoryService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 4<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> PointsService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> pointsService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 5<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> EmailService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> emailService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 6<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> AnalyticsService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> analyticsService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 7<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 8<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> createOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Order</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">
8 order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 9<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. ä¿å订å</span></span> 10<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">save</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 11<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 12<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. è°ç¨åºåæå¡</span></span> 13<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> inventoryService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">updateInventory</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 14<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 15<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 3. è°ç¨ç§¯åæå¡</span></span> 16<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> pointsService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">addPoints</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getAmount</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 17<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 18<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 4. åéé®ä»¶éç¥</span></span> 19<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> emailService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">sendOrderConfirmation</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 20<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 21<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 5. è®°å½åææ°æ®</span></span> 22<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> analyticsService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">trackOrderCreated</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 23<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 24<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æ´å¤æå¡...</span></span> 25<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 26<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>è¿ç§æ¶æåå¨ä¸¥éé®é¢ï¼</p><ul><li><strong>ç´§è¦å</strong>ï¼è®¢åæå¡éè¦ç¥éææä¸æ¸¸æå¡</li><li><strong>åç¹æ é</strong>ï¼ä»»ä½ä¸ä¸ªä¸æ¸¸æå¡ææé½ä¼å¯¼è´è®¢åå建失败</li><li><strong>æ§è½ç¶é¢</strong>ï¼åæ¥è°ç¨å¯¼è´ååºæ¶é´æ ¢</li></ul><h3 id="mqè§£å³æ¹æ¡" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡"><span>MQè§£å³æ¹æ¡</span></a></h3><p>å¼å ¥MQåï¼æ¶æå为ï¼</p><p><img src="https://files.mdnice.com/user/5303/a0a663ad-b312-4ef7-923e-59b2f4cd55e7.png" alt=""></p><p><strong>代ç å®ç°</strong>ï¼</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åæå¡ - ç产è </span></span> 27<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 28<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 29<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 30<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RabbitTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 31<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 32<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> createOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Order</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">
32 order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 33<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. ä¿å订å</span></span> 34<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">save</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 35<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 36<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. åéæ¶æ¯å°MQ</span></span> 37<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">convertAndSend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 38<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order.exchange"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 39<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order.created"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 40<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> OrderCreatedEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getAmount</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())</span></span> 41<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 42<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 43<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 44<span class="line"></span> 45<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// åºåæå¡ - æ¶è´¹è </span></span> 46<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 47<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">queues</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "inventory.queue"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 48<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> InventoryConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 49<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 50<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> InventoryService</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> inventoryService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 51<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 52<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitHandler</span></span> 53<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> handleOrderCreated</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">OrderCreatedEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 54<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> inventoryService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">updateInventory</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getOrderId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 55<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 56<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="ææ¯è¦ç¹" tabindex="-1"><a class="header-anchor" href="#ææ¯è¦ç¹"><span>ææ¯è¦ç¹</span></a></h3><ol><li><strong>æ¶æ¯åè®®éæ©</strong>ï¼æ ¹æ®ä¸å¡éæ±éæ©RabbitMQãKafkaæRocketMQ</li><li><strong>æ¶æ¯æ ¼å¼</strong>ï¼ä½¿ç¨JSONæProtobufçè·¨è¯è¨æ ¼å¼</li><li><strong>é误å¤ç</strong>ï¼å®ç°éè¯æºå¶åæ»ä¿¡éå</li></ol><h2 id="åºæ¯äº-弿¥å¤ç" tabindex="-1"><a class="header-anchor" href="#åºæ¯äº-弿¥å¤ç"><span>åºæ¯äºï¼å¼æ¥å¤ç</span></a></h2><h3 id="èæ¯æè¿°-1" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-1"><span>èæ¯æè¿°</span></a></h3><p>ç¨æ·ä¸ä¼ è§é¢åéè¦æ§è¡è½¬ç ãçæç¼©ç¥å¾ãå å®¹å®¡æ ¸çèæ¶æä½ï¼å¦æåæ¥å¤çï¼ç¨æ·éè¦çå¾ å¾é
56¿æ¶é´ã</p><h3 id="mqè§£å³æ¹æ¡-1" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-1"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// è§é¢æå¡ - ç产è </span></span> 57<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 58<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> VideoService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 59<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 60<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> KafkaTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Object</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> kafkaTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 61<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 62<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> UploadResponse</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> uploadVideo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">MultipartFile</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> file</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> userId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 63<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. ä¿ååå§è§é¢</span></span> 64<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> String</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> videoId</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> saveOriginalVideo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(file);</span></span> 65<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 66<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. åéå¤çæ¶æ¯</span></span> 67<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> kafkaTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">send</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"video-processing"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> VideoProcessingEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(videoId, userId));
67</span></span> 68<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 69<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 3. ç«å³è¿åååº</span></span> 70<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> UploadResponse</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(videoId, </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"upload_success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 71<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 72<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 73<span class="line"></span> 74<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// è§é¢å¤çæå¡ - æ¶è´¹è </span></span> 75<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 76<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> VideoProcessingConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 77<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">KafkaListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">topics</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "video-processing"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 78<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> processVideo</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">VideoProcessingEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 79<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 弿¥æ§è¡èæ¶æä½</span></span> 80<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> videoProcessor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">transcode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getVideoId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 81<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> videoProcessor</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">generateThumbnails</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getVideoId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 82<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> contentModerationService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">checkContent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getVideoId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 83<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 84<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åéå¤ç宿éç¥</span></span> 85<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> notificationService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">notifyUser</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getVideoId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 86<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 87<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="æ¶æä¼å¿" tabindex="-1"><a class="header-anchor" href="#æ¶æä¼å¿"><span>æ¶æä¼å¿</span></a></h3><ol><li><strong>å¿«éååº</strong>ï¼ç¨æ·ä¸ä¼ åç«å³å¾å°ååº</li><li><strong>å¼¹æ§æ©å±</strong>
87ï¼å¯ä»¥æ ¹æ®å¤çååå¨æè°æ´æ¶è´¹è æ°é</li><li><strong>æ éé离</strong>ï¼å¤çæå¡æ éä¸ä¼å½±åä¸ä¼ åè½</li></ol><h2 id="åºæ¯ä¸-æµéåå³°" tabindex="-1"><a class="header-anchor" href="#åºæ¯ä¸-æµéåå³°"><span>åºæ¯ä¸ï¼æµéåå³°</span></a></h2><h3 id="èæ¯æè¿°-2" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-2"><span>èæ¯æè¿°</span></a></h3><p>çµåç§ææ´»å¨æ¶ï¼ç¬æ¶æµéå¯è½æ¯å¹³æ¶çç¾å以ä¸ï¼ç´æ¥å²å»æ°æ®åºåæå¡ã</p><h3 id="mqè§£å³æ¹æ¡-2" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-2"><span>MQè§£å³æ¹æ¡</span></a></h3><p><img src="https://files.mdnice.com/user/5303/5967cea3-321d-4ee7-856b-a86afbfc6636.png" alt=""></p><p><strong>代ç å®ç°</strong>ï¼</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// ç§ææå¡</span></span> 88<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 89<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> SecKillService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 90<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 91<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RedisTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Object</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> redisTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 92<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 93<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 94<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RabbitTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 95<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 96<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> SecKillResponse</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> secKill</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">SecKillRequest</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 97<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. æ ¡éªç¨æ·èµæ ¼</span></span> 98<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">!</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">checkUserQualification</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())) {</span></span> 99<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> SecKillResponse</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">failed</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"ç¨æ·æ èµæ ¼"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 100<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 101<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 102<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. é¢ååºåï¼Redisååæä½ï¼</span></span> 103<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Long</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> remaining</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> redisTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">opsForValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">decrement</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 104<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "sec_kill_stock:"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getItemId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 105<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 106<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (remaining </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">==</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> ||</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> remaining </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"><</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 0</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 107<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åºåä¸è¶³ï¼æ¢å¤åºå</span></span> 108<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> redisTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">opsForValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">increment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"sec_kill_stock:"</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> +</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getItemId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 109<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> SecKillResponse</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">failed</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"åºåä¸è¶³"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 110<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 111<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 112<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 3. åéç§ææåæ¶æ¯å°MQ</span></span> 113<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">convertAndSend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 114<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "sec_kill.exchange"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 115<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "sec_kill.success"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 116<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> SecKillSuccessEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">request</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getItemId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())</span></span> 117<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 118<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 119<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> SecKillResponse</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">success</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"ç§ææå"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 120<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 121<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 122<span class="line"></span> 123<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åå¤çæ¶è´¹è </span></span> 124<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 125<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">queues</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "sec_kill.order.queue"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 126<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> SecKillOrderConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 127<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitHandler</span></span> 128<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> handleSecKillSuccess</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">SecKillSuccessEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 129<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 弿¥å建订å</span></span> 130<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">createSecKillOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getItemId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 131<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 132<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div
132class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="ææ¯è¦ç¹-1" tabindex="-1"><a class="header-anchor" href="#ææ¯è¦ç¹-1"><span>ææ¯è¦ç¹</span></a></h3><ol><li><strong>åºå颿£</strong>ï¼ä½¿ç¨Redisååæä½é¿å è¶ å</li><li><strong>éåç¼å²</strong>ï¼MQç¼å²è¯·æ±ï¼é¿å ç´æ¥å²å»æ°æ®åº</li><li><strong>éæµæ§å¶</strong>ï¼å¨ç½å ³å±è¿è¡éæµï¼æç»è¿å¤è¯·æ±</li></ol><h2 id="åºæ¯å-æ°æ®åæ¥" tabindex="-1"><a class="header-anchor" href="#åºæ¯å-æ°æ®åæ¥"><span>åºæ¯åï¼æ°æ®åæ¥</span></a></h2><h3 id="èæ¯æè¿°-3" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-3"><span>èæ¯æè¿°</span></a></h3><p>å¨å¾®æå¡æ¶æä¸ï¼ä¸åæå¡æèªå·±çæ°æ®åºï¼éè¦ä¿è¯æ°æ®ä¸è´æ§ã</p><h3 id="mqè§£å³æ¹æ¡-3" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-3"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// ç¨æ·æå¡ - æ°æ®åæ´æ¶åéæ¶æ¯</span></span> 133<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 134<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> UserService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 135<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Transactional</span></span> 136<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> User</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> updateUser</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">User</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> user</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 137<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. æ´æ°æ°æ®åº</span></span> 138<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> userDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">update</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(user);</span></span> 139<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 140<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. åéæ¶æ¯ï¼å¨äºå¡å ï¼</span></span> 141<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rocketMQTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">sendMessageInTransaction</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 142<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "user-update-topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 143<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> MessageBuilder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">withPayload</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> UserUpdateEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">user</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">user</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getStatus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()))</span></span> 144<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> .</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">build</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(),</span></span> 145<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span></span> 146<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 147<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 148<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> user;</span></span> 149<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 150<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 151<span class="line"></span> 152<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// å ¶ä»æå¡ - æ¶è´¹ç¨æ·æ´æ°æ¶æ¯</span></span> 153<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 154<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RocketMQMessageListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">topic</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "user-update-topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> consumerGroup</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order-group"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 155<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> UserUpdateConsumer</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQListener</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">UserUpdateEvent</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 156<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">
156Override</span></span> 157<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> onMessage</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">UserUpdateEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 158<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æ´æ°æ¬å°ç¨æ·ä¿¡æ¯ç¼å</span></span> 159<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">updateUserCache</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getUserId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getStatus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 160<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 161<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="ä¸è´æ§ä¿è¯" tabindex="-1"><a class="header-anchor" href="#ä¸è´æ§ä¿è¯"><span>ä¸è´æ§ä¿è¯</span></a></h3><ol><li><strong>æ¬å°äºå¡è¡¨</strong>ï¼å°æ¶æ¯åä¸å¡æ°æ®æ¾å¨åä¸ä¸ªæ°æ®åºäºå¡ä¸</li><li><strong>äºå¡æ¶æ¯</strong>ï¼ä½¿ç¨RocketMQçäºå¡æ¶æ¯æºå¶</li><li><strong>å¹çæ¶è´¹</strong>ï¼æ¶è´¹è å®ç°å¹çæ§ï¼é¿å éå¤å¤ç</li></ol><h2 id="åºæ¯äº-æ¥å¿æ¶é" tabindex="-1"><a class="header-anchor" href="#åºæ¯äº-æ¥å¿æ¶é"><span>åºæ¯äºï¼æ¥å¿æ¶é</span></a></h2><h3 id="èæ¯æè¿°-4" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-4"><span>èæ¯æè¿°</span></a></h3><p>åå¸å¼ç³»ç»ä¸ï¼æ¥å¿åæ£å¨å个èç¹ï¼éè¦é䏿¶éååæã</p><h3 id="mqè§£å³æ¹æ¡-4" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-4"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="article-referral-ad"><p>æè¿ç¼ºé¡¹ç®ç»åæ³å¿«éæå项ç®å®æè½åï¼å å«å¤ä¸ªAI项ç®ï¼ï¼æè æè¿æ¾å·¥ä½ï¼æè æ³å¦ä¹ AIçå°ä¼ä¼´ï¼å¯ä»¥ççä¸é¢ðð»ç<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad2" rel="nofollow">è¿ä¸ªé¾æ¥</a>ï¼æè®¸ççè½å¤å¸®å°ä½ ï¼ã</p></div><p><img src="https://files.mdnice.com/user/5303/0cdcaa69-a27f-40d1-8377-403c6e629a08.png" alt=""></p><p><strong>代ç å®ç°</strong>ï¼</p><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// æ¥å¿æ¶éç»ä»¶</span></span> 162<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 163<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> LogCollector</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 164<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 165<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">
165 KafkaTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> String</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> kafkaTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 166<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 167<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> collectLog</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> appId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> level</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Map</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Object</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">> </span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">context</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 168<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> LogEvent</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> logEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> LogEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(appId, level, message, context, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">System</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">currentTimeMillis</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 169<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 170<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åéå°Kafka</span></span> 171<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> kafkaTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">send</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"app-logs"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, appId, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">JsonUtils</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">toJson</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(logEvent));</span></span> 172<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 173<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 174<span class="line"></span> 175<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// æ¥å¿æ¶è´¹è </span></span> 176<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 177<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> LogConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 178<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">KafkaListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">topics</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "app-logs"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> groupId</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "log-es"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 179<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> consumeLog</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 180<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> LogEvent</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> logEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> JsonUtils</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">fromJson</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(message, </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">LogEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">class</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 181<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 182<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åå¨å°Elasticsearch</span></span> 183<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> elasticsearchService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">indexLog</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(logEvent);</span></span> 184<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 185<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 宿¶çæ§æ£æ¥</span></span> 186<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"ERROR"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">equals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">logEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getLevel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())) {</span></span> 187<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> alertService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">checkAndAlert</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(logEvent);</span></span> 188<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 189<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 190<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="ææ¯ä¼å¿" tabindex="-1"><a class="header-anchor" href="#ææ¯ä¼å¿"><span>ææ¯ä¼å¿</span></a></h3><ol><li><strong>è§£è¦</strong>ï¼åºç¨èç¹æ éå ³å¿æ¥å¿å¦ä½å¤ç</li><li><strong>ç¼å²</strong>ï¼åºå¯¹æ¥å¿äº§çéçæ³¢å¨</li><li><strong>夿¶è´¹</strong>ï¼åä¸ä»½æ¥å¿å¯ä»¥è¢«å¤ä¸ªæ¶è´¹è å¤ç</li></ol><h2 id="åºæ¯å -æ¶æ¯å¹¿æ" tabindex="-1"><a class="header-anchor" href="#åºæ¯å -æ¶æ¯å¹¿æ"><span>åºæ¯å ï¼æ¶æ¯å¹¿æ</span></a></h2><h3 id="èæ¯æè¿°-5" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-5"><span>èæ¯æè¿°</span></a></h3><p>
190ç³»ç»é ç½®æ´æ°åï¼éè¦éç¥æææå¡èç¹æ´æ°æ¬å°é ç½®ã</p><h3 id="mqè§£å³æ¹æ¡-5" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-5"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// é ç½®æå¡ - 广æé ç½®æ´æ°</span></span> 191<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 192<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ConfigService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 193<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 194<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RedisTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">,</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Object</span><span style="--shiki-light:#E45649;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> redisTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 195<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 196<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> updateConfig</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> configKey</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> configValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 197<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. æ´æ°é ç½®åå¨</span></span> 198<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> configDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">updateConfig</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(configKey, configValue);</span></span> 199<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 200<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. 广æé ç½®æ´æ°æ¶æ¯</span></span> 201<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> redisTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">convertAndSend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"config-update-channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span></span> 202<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> ConfigUpdateEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(configKey, configValue));</span></span> 203<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 204<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 205<span class="line"></span> 206<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// æå¡èç¹ - 订é é ç½®æ´æ°</span></span> 207<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 208<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> ConfigUpdateListener</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 209<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 210<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">
210 LocalConfigCache</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> localConfigCache</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 211<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 212<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RedisListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">channel</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "config-update-channel"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 213<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> handleConfigUpdate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">ConfigUpdateEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 214<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æ´æ°æ¬å°é ç½®ç¼å</span></span> 215<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> localConfigCache</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">updateConfig</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getKey</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getValue</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 216<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 217<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="åºç¨åºæ¯" tabindex="-1"><a class="header-anchor" href="#åºç¨åºæ¯"><span>åºç¨åºæ¯</span></a></h3><ol><li><strong>åè½å¼å ³</strong>ï¼å¨æå¼å¯æå ³éåè½</li><li><strong>åæ°è°æ´</strong>ï¼è°æ´è¶ æ¶æ¶é´ãéæµéå¼ç</li><li><strong>é»ç½åå</strong>ï¼æ´æ°é»ç½ååé ç½®</li></ol><h2 id="åºæ¯ä¸-é¡ºåºæ¶æ¯" tabindex="-1"><a class="header-anchor" href="#åºæ¯ä¸-é¡ºåºæ¶æ¯"><span>åºæ¯ä¸ï¼é¡ºåºæ¶æ¯</span></a></h2><h3 id="èæ¯æè¿°-6" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-6"><span>èæ¯æè¿°</span></a></h3><p>卿äºä¸å¡åºæ¯ä¸ï¼æ¶æ¯çå¤ç顺åºå¾éè¦ï¼å¦è®¢åç¶æåæ´ã</p><h3 id="mqè§£å³æ¹æ¡-6" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-6"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åç¶æåæ´æå¡</span></span> 218<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 219<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderStateService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 220<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 221<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rocketMQTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 222<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 223<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> changeOrderState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> orderId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> oldState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">String</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> newState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 224<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderStateEvent</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> OrderStateEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(orderId, oldState, newState);</span></span> 225<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 226<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åéé¡ºåºæ¶æ¯ï¼ä½¿ç¨orderIdä½ä¸ºsharding key</span></span> 227<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rocketMQTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">syncSendOrderly</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 228<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order-state-topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span></span> 229<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> event, </span></span> 230<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> orderId </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// ä¿è¯åä¸è®¢åçæ¶æ¯æé¡ºåºå¤ç</span></span> 231<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 232<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 233<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 234<span class="line"></span> 235<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åç¶ææ¶è´¹è </span></span> 236<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 237<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RocketMQMessageListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span></span> 238<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> topic</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order-state-topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 239<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> consumerGroup</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order-state-group"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 240<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> consumeMode</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> ConsumeMode</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">ORDERLY</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // é¡ºåºæ¶è´¹</span></span> 241<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 242<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderStateConsumer</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQListener</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;"><</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">OrderStateEvent</span><span style="--shiki-light:#C18401;--shiki-dark:#ABB2BF;">></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 243<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">
243Override</span></span> 244<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> onMessage</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">OrderStateEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 245<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æé¡ºåºå¤ç订åç¶æåæ´</span></span> 246<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">processStateChange</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(event);</span></span> 247<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 248<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="顺åºä¿è¯æºå¶" tabindex="-1"><a class="header-anchor" href="#顺åºä¿è¯æºå¶"><span>顺åºä¿è¯æºå¶</span></a></h3><ol><li><strong>ååºé¡ºåº</strong>ï¼åä¸ååºå çæ¶æ¯ä¿è¯é¡ºåº</li><li><strong>é¡ºåºæé</strong>ï¼MQä¿è¯æ¶æ¯æåéé¡ºåºæé</li><li><strong>顺åºå¤ç</strong>ï¼æ¶è´¹è 顺åºå¤çæ¶æ¯</li></ol><h2 id="åºæ¯å «-å»¶è¿æ¶æ¯" tabindex="-1"><a class="header-anchor" href="#åºæ¯å «-å»¶è¿æ¶æ¯"><span>åºæ¯å «ï¼å»¶è¿æ¶æ¯</span></a></h2><h3 id="èæ¯æè¿°-7" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-7"><span>èæ¯æè¿°</span></a></h3><p>éè¦å®ç°å®æ¶ä»»å¡ï¼å¦è®¢åè¶ æ¶æªæ¯ä»èªå¨åæ¶ã</p><h3 id="mqè§£å³æ¹æ¡-7" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-7"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åæå¡ - åéå»¶è¿æ¶æ¯</span></span> 249<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 250<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 251<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 252<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RabbitTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 253<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 254<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> createOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Order</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;">
254 order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 255<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // ä¿å订å</span></span> 256<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">save</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 257<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 258<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // åéå»¶è¿æ¶æ¯ï¼30åéåæ£æ¥æ¯ä»ç¶æ</span></span> 259<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">convertAndSend</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 260<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order.delay.exchange"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 261<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order.create"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 262<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> OrderCreateEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()),</span></span> 263<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> message </span><span style="--shiki-light:#C18401;--shiki-dark:#C678DD;">-></span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 264<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getMessageProperties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">setDelay</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">30</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> *</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 60</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> *</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> 1000</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">); </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 30åé</span></span> 265<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> message;</span></span> 266<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 267<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 268<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 269<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 270<span class="line"></span> 271<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// 订åè¶ æ¶æ£æ¥æ¶è´¹è </span></span> 272<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 273<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">queues</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order.delay.queue"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 274<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderTimeoutConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 275<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitHandler</span></span> 276<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> checkOrderPayment</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">OrderCreateEvent</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 277<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;">
277 order</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">findById</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">event</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getOrderId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 278<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"UNPAID"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">equals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getStatus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())) {</span></span> 279<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // è¶ æ¶æªæ¯ä»ï¼åæ¶è®¢å</span></span> 280<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">cancelOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"è¶ æ¶æªæ¯ä»"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 281<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 282<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 283<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="æ¿ä»£æ¹æ¡å¯¹æ¯" tabindex="-1"><a class="header-anchor" href="#æ¿ä»£æ¹æ¡å¯¹æ¯"><span>æ¿ä»£æ¹æ¡å¯¹æ¯</span></a></h3><table><thead><tr><th>æ¹æ¡</th><th>ä¼ç¹</th><th>缺ç¹</th></tr></thead><tbody><tr><td><strong>æ°æ®åºè½®è¯¢</strong></td><td>å®ç°ç®å</td><td>宿¶æ§å·®ï¼æ°æ®åºåå大</td></tr><tr><td><strong>å»¶æ¶éå</strong></td><td>宿¶æ§å¥½</td><td>å®ç°å¤æï¼æ¶æ¯å 积é®é¢</td></tr><tr><td><strong>宿¶ä»»å¡</strong></td><td>坿§æ§å¼º</td><td>åå¸å¼åè°å¤æ</td></tr></tbody></table><h2 id="åºæ¯ä¹-æ¶æ¯éè¯" tabindex="-1"><a class="header-anchor" href="#åºæ¯ä¹-æ¶æ¯éè¯"><span>åºæ¯ä¹ï¼æ¶æ¯éè¯</span></a></h2><h3 id="èæ¯æè¿°-8" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-8"><span>èæ¯æè¿°</span></a></h3><p>å¤çæ¶æ¯æ¶å¯è½éå°ä¸´æ¶æ éï¼éè¦éè¯æºå¶ä¿è¯æç»å¤çæåã</p><h3 id="mqè§£å³æ¹æ¡-8" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-8"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// æ¶æ¯æ¶è´¹è with éè¯æºå¶</span></span> 284<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 285<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Slf4j</span></span> 286<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RetryableConsumer</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 287<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 288<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RabbitTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rabbitTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 289<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 290<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RabbitListener</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">(</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">queues</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "business.queue"</span><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;">)</span></span> 291<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> processMessage</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Message</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Channel</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> channel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 292<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 293<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // ä¸å¡å¤ç</span></span> 294<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> businessService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">process</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(message);</span></span> 295<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 296<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // ç¡®è®¤æ¶æ¯</span></span> 297<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> channel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">basicAck</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getMessageProperties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getDeliveryTag</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(), </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;">
297false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 298<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 299<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">TemporaryException</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 300<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 临æ¶å¼å¸¸ï¼éè¯</span></span> 301<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> log</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">warn</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"å¤ç失败ï¼åå¤éè¯"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, e);</span></span> 302<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 303<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æç»æ¶æ¯ï¼requeue=true</span></span> 304<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> channel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">basicNack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 305<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getMessageProperties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getDeliveryTag</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(),</span></span> 306<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 307<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> true</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // éæ°å ¥é</span></span> 308<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 309<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 310<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">PermanentException</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 311<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æ°¸ä¹ å¼å¸¸ï¼è¿å ¥æ»ä¿¡éå</span></span> 312<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> log</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">error</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"
312å¤ç失败ï¼è¿å ¥æ»ä¿¡éå"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, e);</span></span> 313<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 314<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> channel</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">basicNack</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 315<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> message</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getMessageProperties</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getDeliveryTag</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(),</span></span> 316<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 317<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> false</span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // ä¸éæ°å ¥é</span></span> 318<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 319<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 320<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 321<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="éè¯çç¥" tabindex="-1"><a class="header-anchor" href="#éè¯çç¥"><span>éè¯çç¥</span></a></h3><ol><li><strong>ç«å³éè¯</strong>ï¼ä¸´æ¶æ éç«å³éè¯</li><li><strong>å»¶è¿éè¯</strong>ï¼éæ¥å¢å éè¯é´é</li><li><strong>æ»ä¿¡éå</strong>ï¼æç»æ æ³å¤ççæ¶æ¯è¿å ¥æ»ä¿¡éå</li></ol><h2 id="åºæ¯å-äºå¡æ¶æ¯" tabindex="-1"><a class="header-anchor" href="#åºæ¯å-äºå¡æ¶æ¯"><span>åºæ¯åï¼äºå¡æ¶æ¯</span></a></h2><h3 id="èæ¯æè¿°-9" tabindex="-1"><a class="header-anchor" href="#èæ¯æè¿°-9"><span>èæ¯æè¿°</span></a></h3><p>åå¸å¼ç³»ç»ä¸ï¼éè¦ä¿è¯å¤ä¸ªæå¡çæ°æ®ä¸è´æ§ã</p><h3 id="mqè§£å³æ¹æ¡-9" tabindex="-1"><a class="header-anchor" href="#mqè§£å³æ¹æ¡-9"><span>MQè§£å³æ¹æ¡</span></a></h3><div class="language-java line-numbers-mode" data-highlighter="shiki" data-ext="java" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34;"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-java"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">
321// äºå¡æ¶æ¯ç产è </span></span> 322<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Service</span></span> 323<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TransactionalMessageService</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 324<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 325<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQTemplate</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> rocketMQTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 326<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 327<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Transactional</span></span> 328<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> void</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> createOrderWithTransaction</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Order</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 329<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 1. ä¿å订åï¼æ°æ®åºäºå¡ï¼</span></span> 330<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">save</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(order);</span></span> 331<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 332<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 2. åéäºå¡æ¶æ¯</span></span> 333<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> TransactionSendResult</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> result</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> rocketMQTemplate</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">sendMessageInTransaction</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span></span> 334<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "order-tx-topic"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">,</span></span> 335<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> MessageBuilder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">withPayload</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> OrderCreatedEvent</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">
335order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">()))</span></span> 336<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> .</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">build</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(),</span></span> 337<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> order </span><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// äºå¡åæ°</span></span> 338<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> );</span></span> 339<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 340<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">!</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">result</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">equals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">LocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">COMMIT_MESSAGE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)) {</span></span> 341<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> throw</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> new</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> RuntimeException</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"äºå¡æ¶æ¯åé失败"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 342<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 343<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 344<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span> 345<span class="line"></span> 346<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;">// äºå¡æ¶æ¯çå¬å¨</span></span> 347<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Component</span></span> 348<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">@</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">RocketMQTransactionListener</span></span> 349<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">public</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> class</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderTransactionListener</span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> implements</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionListener</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 350<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">Autowired</span></span> 351<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> private</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> OrderDao</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 352<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 353<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">
353Override</span></span> 354<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> executeLocalTransaction</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Message</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> msg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">, </span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Object</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> arg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 355<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> try</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 356<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // æ£æ¥æ¬å°äºå¡ç¶æ</span></span> 357<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> order</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (Order) arg;</span></span> 358<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> existOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">findById</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getId</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">());</span></span> 359<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 360<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (existOrder </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">!=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> &&</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "CREATED"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">equals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">existOrder</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getStatus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())) {</span></span> 361<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">COMMIT_MESSAGE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 362<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 363<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">ROLLBACK_MESSAGE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 364<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 365<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">catch</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Exception</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> e</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">) {</span></span> 366<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">UNKNOWN</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 367<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 368<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 369<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#E06C75;"> </span></span> 370<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> @</span><span style="--shiki-light:#A626A4;--shiki-dark:#E5C07B;">
370Override</span></span> 371<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> public</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;"> checkLocalTransaction</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;">Message</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic;"> msg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">)</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 372<span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic;"> // 忥æ¬å°äºå¡ç¶æ</span></span> 373<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> String</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> orderId</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (String) </span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">msg</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getHeaders</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">().</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">get</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;">"order_id"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">);</span></span> 374<span class="line"><span style="--shiki-light:#C18401;--shiki-dark:#E5C07B;"> Order</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75;"> order</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> =</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> orderDao</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">findById</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(orderId);</span></span> 375<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> </span></span> 376<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> if</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> (order </span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;">!=</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66;"> null</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2;"> &&</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379;"> "CREATED"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">equals</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">(</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">order</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF;">getStatus</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">())) {</span></span> 377<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">COMMIT_MESSAGE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 378<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> } </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;">else</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> {</span></span> 379<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD;"> return</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;"> RocketMQLocalTransactionState</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E5C07B;">ROLLBACK_MESSAGE</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">;</span></span> 380<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 381<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;"> }</span></span> 382<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF;">}</span></span></code></pre><div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0;"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h3 id="äºå¡æ¶æ¯æµç¨" tabindex="-1"><a class="header-anchor" href="#äºå¡æ¶æ¯æµç¨"><span>äºå¡æ¶æ¯æµç¨</span></a></h3><p><img src="https://files.mdnice.com/user/5303/0e06e736-38ad-4069-81eb-bff727394026.png" alt=""></p><h2 id="æ»ç»" tabindex="-1"><a class="header-anchor" href="#æ»ç»"><span>æ»ç»</span></a></h2><p>éè¿ä»¥ä¸10ä¸ªåºæ¯ï¼æä»¬å¯ä»¥æ»ç»åºMQ使ç¨çæ ¸å¿ååï¼</p><h3 id="éç¨åºæ¯" tabindex="-1"><a class="header-anchor" href="#éç¨åºæ¯"><span>éç¨åºæ¯</span></a></h3><ol><li><strong>弿¥å¤ç</strong>ï¼æåç³»ç»ååºé度</li><li><strong>ç³»ç»è§£è¦</strong>ï¼éä½ç³»ç»é´ä¾èµ</li><li><strong>æµéåå³°</strong>ï¼åºå¯¹çªåæµé</li><li><strong>æ°æ®åæ¥</strong>ï¼ä¿è¯æç»ä¸è´æ§</li><li><strong>åå¸å¼äºå¡</strong>ï¼è§£å³æ°æ®ä¸è´æ§é®é¢</li></ol><h3 id="ææ¯éå建议" tabindex="-1"><a class="header-anchor" href="#ææ¯éå建议"><span>ææ¯éå建议</span></a></h3><table><thead><tr><th>
382åºæ¯</th><th>æ¨èMQ</th><th>åå </th></tr></thead><tbody><tr><td>é«åå</td><td>Kafka</td><td>é«ååéï¼æä¹
ååå¨</td></tr><tr><td>äºå¡æ¶æ¯</td><td>RocketMQ</td><td>宿´çäºå¡æ¶æ¯æºå¶</td></tr><tr><td>å¤æè·¯ç±</td><td>RabbitMQ</td><td>çµæ´»çè·¯ç±é
ç½®</td></tr><tr><td>å»¶è¿æ¶æ¯</td><td>RabbitMQ</td><td>åçæ¯æå»¶è¿éå</td></tr></tbody></table><h3 id="æä½³å®è·µ" tabindex="-1"><a class="header-anchor" href="#æä½³å®è·µ"><span>æä½³å®è·µ</span></a></h3><ol><li><strong>æ¶æ¯å¹çæ§</strong>ï¼æ¶è´¹è
å¿
é¡»å®ç°å¹çå¤ç</li><li><strong>æ»ä¿¡éå</strong>ï¼å¤çå¤±è´¥çæ¶æ¯è¦æå
åºæ¹æ¡</li><li><strong>çæ§åè¦</strong>ï¼å®åçæ¶æ¯å ç§¯çæ§ååè¦</li><li><strong>æ§è½ä¼å</strong>ï¼æ ¹æ®ä¸å¡ç¹ç¹è°æ´MQåæ°</li></ol><div class="article-referral-ad"><p>æè¿ç¼ºé¡¹ç®ç»åæ³å¿«éæå项ç®å®æè½åï¼å
å«å¤ä¸ªAI项ç®ï¼ï¼æè
æè¿æ¾å·¥ä½ï¼æè
æ³å¦ä¹ AIçå°ä¼ä¼´ï¼å¯ä»¥ççä¸é¢ðð»ç<a class="article-referral-ad-link" href="/pay/project.html?from=article_ad3" rel="nofollow">è¿ä¸ªé¾æ¥</a>ï¼æè®¸ççè½å¤å¸®å°ä½ ï¼ã</p></div>`,101)])])}const p=i(h,[["render",t]]),r=JSON.parse('{"path":"/article/10-mq-use-cases-in-my-work.html","title":"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯","lang":"zh-CN","frontmatter":{"title":"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯","date":"2025-10-09T09:59:00.000Z","category":["ææ¯æç« "],"tags":["MQ"],"description":"åè¨ æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼ è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å
¥MQè¿ä¹ä¸ª\\"ä¸é´å\\"ï¼ ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£","author":"èä¸","sidebar":false,"head":[["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"TechArticle\\",\\"headline\\":\\"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯\\",\\"description\\":\\"åè¨ æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼ è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å
¥MQè¿ä¹ä¸ª\\\\\\"ä¸é´å\\\\\\"ï¼ ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£\\",\\"keywords\\":\\"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯,MQ,ææ¯æç« \\",\\"image\\":\\"https://files.mdnice.com/user/5303/2c4ccb38-1bbe-4e89-889a-f21bd64f2f25.png\\",\\"datePublished\\":\\"2025-10-09T09:59:00.000Z\\",\\"dateModified\\":\\"2025-10-09T09:59:00.000Z\\",\\"author\\":{\\"@type\\":\\"Person\\",\\"name\\":\\"èä¸\\",\\"url\\":\\"https://www.susan.net.cn/contact/\\"},\\"publisher\\":{\\"@type\\":\\"Organization\\",\\"name\\":\\"Javaçªå»é\\",\\"url\\":\\"https://www.susan.net.cn\\",\\"logo\\":{\\"@type\\":\\"ImageObject\\",\\"url\\":\\"https://www.susan.net.cn/logo.png\\"}},\\"mainEntityOfPage\\":{\\"@type\\":\\"WebPage\\",\\"@id\\":\\"https://www.susan.net.cn/article/10-mq-use-cases-in-my-work.html\\"},\\"inLanguage\\":\\"zh-CN\\"}"],["meta",{"property":"og:url","content":"https://www.susan.net.cn/article/10-mq-use-cases-in-my-work.html"}],["meta",{"property":"og:site_name","content":"项ç®å®æç½ - Javaçªå»é"}],["meta",{"property":"og:title","content":"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯"}],["meta",{"property":"og:description","content":"åè¨ æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼ è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å
¥MQè¿ä¹ä¸ª\\"ä¸é´å\\"ï¼ ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£"}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://files.mdnice.com/user/5303/2c4ccb38-1bbe-4e89-889a-f21bd64f2f25.png"}],["meta",{"property":"og:locale","content":"zh-CN"}],["meta",{"property":"article:author","content":"èä¸"}],["meta",{"property":"article:tag","content":"MQ"}],["meta",{"property":"article:published_time","content":"2025-10-09T09:59:00.000Z"}],["link",{"rel":"canonical","href":"https://www.susan.net.cn/article/10-mq-use-cases-in-my-work.html"}],["meta",{"name":"keywords","content":"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯,MQ"}],["meta",{"name":"robots","content":"index,follow,archive"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:title","content":"æå·¥ä½ä¸ç¨MQç10ç§åºæ¯"}],["meta",{"name":"twitter:description","content":"åè¨ æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼ è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å
¥MQè¿ä¹ä¸ª\\"ä¸é´å\\"ï¼ ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£"}]]},"git":{},"filePathRelative":"article/10-mq-use-cases-in-my-work.md","excerpt":"<h2>åè¨</h2>\\n\\n<div class=\\"article-referral-ad\\">\\n<p>æè¿ç¼ºé¡¹ç®ç»åæ³å¿«éæå项ç®å®æè½åï¼å
å«å¤ä¸ªAI项ç®ï¼ï¼æè
æè¿æ¾å·¥ä½ï¼æè
æ³å¦ä¹ AIçå°ä¼ä¼´ï¼å¯ä»¥ççä¸é¢ðð»ç<a class=\\"article-referral-ad-link\\" href=\\"/pay/project.html?from=article_ad1\\" rel=\\"nofollow\\">è¿ä¸ªé¾æ¥</a>ï¼æè®¸ççè½å¤å¸®å°ä½ ï¼ã</p>\\n</div>\\n<p>æè¿æçå鮿ï¼MQç使ç¨åºæ¯æåªäºï¼å·¥ä½ä¸ä¸å®è¦ä½¿ç¨MQåï¼</p>\\n<p>è®°å¾åå·¥ä½é£ä¼å¿ï¼ææ»æ¯æ³ä¸æç½ï¼ä¸ºä»ä¹ææç´æ¥è°ç¨æ¥å£å°±è½å®æçåè½ï¼éè¦å¼å
¥MQè¿ä¹ä¸ª\\"ä¸é´å\\"ï¼</p>\\n<p>ç´å°ç»åäºç³»ç»å´©æºãæ°æ®ä¸¢å¤±ãæ§è½ç¶é¢çä¸ç³»åé®é¢åï¼ææçæ£çè§£äºMQçä»·å¼ã</p>\\n<p>
382ä»å¤©ææ³å大家å享æå¨å®é
å·¥ä½ä¸ä½¿ç¨æ¶æ¯éåï¼MQï¼ç10ç§å
¸ååºæ¯ï¼å¸æå¯¹ä½ 伿æå¸®å©ã</p>\\n<h2>ä¸ã为ä»ä¹éè¦æ¶æ¯éåï¼MQï¼ï¼</h2>\\n<p>卿·±å
¥å
·ä½åºæ¯ä¹åï¼æä»¬å
æ¥æèä¸ä¸ªåºæ¬é®é¢ï¼ä¸ºä»ä¹è¦ä½¿ç¨æ¶æ¯éåï¼</p>\\n<p>ç³»ç»é´çç´æ¥è°ç¨ï¼\\n<img src=\\"https://files.mdnice.com/user/5303/2c4ccb38-1bbe-4e89-889a-f21bd64f2f25.png\\" alt=\\"\\"></p>"}');export{p as comp,r as data};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.