ในระบบแบบกระจายเพื่อให้แน่ใจว่ามีความสอดคล้องที่แข็งแกร่งของการทำธุรกรรมแบบกระจายข้อมูลเมื่อเรียกอินเทอร์เฟซ RPC หรือส่ง MQ คุณจะดำเนินการลองอีกครั้งเพื่อป้องกันการหมดเวลาคำขอของเครือข่าย วิธีที่พบบ่อยที่สุดในการลองใหม่คือ MQ แต่ถ้าคุณไม่แนะนำ MQ ในโครงการของคุณมันจะไม่สะดวก บทความนี้ส่วนใหญ่แนะนำวิธีการใช้ Spring retry เพื่อดำเนินการลองใหม่
1. เพิ่มการพึ่งพา Maven
<การพึ่งพา> <roupId> org.springframework.retry </groupId> <ratifactid> Spring-retery </artifactid> <sersion> 1.1.2.Release </Side> </การพึ่งพา> <การพึ่งพา> <roupId> org.aspectj </groupid>
2. เพิ่มการกำหนดค่าลองใหม่ในการเริ่มต้น
@springbootapplication @enableretry แอปพลิเคชันคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {springapplication.run (application.class, args); - 3. บริการเขียน
@Service คลาสสาธารณะระดับ Remoteservice {ส่วนตัว Logger สุดท้ายคงที่ logger = loggerFactory.getLogger (testController.class); @Retryable (value = {BusinessException.class}, maxattempts = 3, backoff = @backoff (delay = 5000l, multiplier = 2)) การเรียกโมฆะสาธารณะ () โยนข้อยกเว้น {logger.info ("ทำอะไรบางอย่าง ... "); โยน BusinessException ใหม่ ("RPC Call Exception"); } @Recover โมฆะสาธารณะกู้คืน (BusinessException E) {logger.info ("-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 4. เขียนคอนโทรลเลอร์
@RestController @RequestMapping ("/test") Public Class TestController {Private Static Final Logger สุดท้าย Logger = loggerFactory.getLogger (testController.class); @autowired Remoteservice Remoteservice; @RequestMapping ("/test") การเข้าสู่ระบบสตริงสาธารณะ () โยนข้อยกเว้น {remoteservice.call (); return string.valueof ("11"); - 5. เยี่ยมชม http: // localhost: 8080/ทดสอบ/ทดสอบ
6. บันทึกทดสอบ
2017-07-25 19:28:07 [Info]-[http-Nio-53602-Exec-1]-[com.test.retry.service.remoteservice.call (remoteservice.java:19)] ทำอะไร ...
2017-07-25 19:28:12 [ข้อมูล]-[http-Nio-53602-Exec-1]-[com.test.Retry.service.Remoteservice.Call (Remoteservice.java:19)] ทำอะไร ...
2017-07-25 19:28:22 [ข้อมูล]-[http-Nio-53602-Exec-1]-[com.test.Retry.service.Remoteservice.CALL (Remoteservice.java:19) ทำอะไร ...
2017-07-25 19:28:22 [ข้อมูล]-[http-Nio-53602-Exec-1]-[com.test.Retry.service.Remoteservice.Recover (Remoteservice.java:24)] -
2017-07-25 19:28:22 [ข้อมูล]-[http-Nio-53602-Exec-1]-[com.test.Retry.service.Remoteservice.Recover (Remoteservice.java:25)
7. คำแนะนำการกำหนดค่าที่เกี่ยวข้อง
@enableretry ลองอีกครั้งได้ ไหม เมื่อคุณสมบัติ ProxytargetClass เป็นจริงให้ใช้ CGLIB Proxy คำอธิบายประกอบ Java มาตรฐานถูกใช้โดยค่าเริ่มต้น ใน Spring Boot พารามิเตอร์นี้สามารถเขียนได้ในทางเข้าโปรแกรม
@retryable วิธีการติดฉลากคำอธิบายประกอบนี้จะถูกลองอีกครั้งเมื่อมีข้อยกเว้นเกิดขึ้น
ค่า: ระบุคลาสข้อยกเว้นที่จะประมวลผล
รวม: คลาสข้อยกเว้นที่ระบุที่จัดการนั้นเหมือนกับค่าและค่าเริ่มต้นจะว่างเปล่า เมื่อยกเว้นจะว่างเปล่าข้อยกเว้นทั้งหมดจะผิดนัดเป็นทั้งหมด
ไม่รวม: ระบุว่าไม่มีการประมวลผลข้อยกเว้นค่าเริ่มต้นจะว่างเปล่าเมื่อรวมยังว่างเปล่าค่าเริ่มต้นทั้งหมดข้อยกเว้นทั้งหมด
MaxAttempts: จำนวนการลองใหม่สูงสุด เริ่มต้น 3 ครั้ง
Backoff: ลองใช้นโยบายรออีกครั้ง ใช้ @backoff Annotation โดยค่าเริ่มต้น
@backoff ลองใช้นโยบายการรออีกครั้ง <br /> เมื่อไม่ได้ตั้งค่าพารามิเตอร์การกำหนดคืน backoffpolicy จะถูกใช้โดยค่าเริ่มต้น (ระบุเวลารอ) และลองรออีก 1,000ms
ตั้งค่าความล่าช้าใช้ reamentbackoffpolicy (ระบุเวลารอ) และลองใช้เวลารอคอยที่จะกรอกอีกครั้ง
เมื่อตั้งค่าความล่าช้าและ maxdealy ลองอีกครั้งและรอการกระจายที่เป็นเนื้อเดียวกันระหว่างค่าทั้งสองนี้
ตั้งค่าความล่าช้า, maxdealy และตัวทวีคูณใช้ exponentialbackFoloffPolicy (การดำเนินการตามช่วงเวลาลองใหม่) ตัวคูณระบุความล่าช้าหลายอย่างเช่นความล่าช้า = 5000L, ตัวคูณ = 2, การลองครั้งแรกคือ 5 วินาทีครั้งที่สองคือ 10 วินาทีและครั้งที่สามคือ 20 วินาที ...
@Recover ใช้สำหรับวิธีการลองใหม่ที่ล้มเหลวของ @retryable พารามิเตอร์วิธีการของคำอธิบายประกอบนี้จะต้องเป็นข้อยกเว้นที่ถูกโยนทิ้งโดย @Retryable มิฉะนั้นจะไม่ได้รับการยอมรับ การประมวลผลบันทึกสามารถทำได้ในวิธีนี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น