ในบล็อกก่อนหน้านี้เราแนะนำการใช้ Spring retry บทความนี้แสดงให้เห็นถึงหลักการดำเนินการของการลองใหม่ของฤดูใบไม้ผลิผ่านตัวอย่างง่ายๆ คำอธิบายประกอบที่กำหนดไว้ในตัวอย่างมีเพียงจำนวนแอตทริบิวต์การลองใหม่เท่านั้น ในความเป็นจริงคำอธิบายประกอบใน Spring Retry สามารถตั้งค่าแอตทริบิวต์ได้มากขึ้น เพื่ออธิบายหลักการมันง่ายกว่า สำหรับ Spring Retry คุณสามารถตรวจสอบเอกสารและบล็อกที่เกี่ยวข้อง
คำจำกัดความคำอธิบายประกอบ
Package retry.annotation; นำเข้า java.lang.annotation.*;/*** สร้างโดย Jack.wu เมื่อปี 2016/9/30 */@Target (ElementType.Method) @retention (RetentionPolicy.runtime) @DocumentedPublic @Interface retryable {int maxattemps () ค่าเริ่มต้น 0;}การใช้งานตัวแทน
การใช้ CGLIB เป็นเครื่องมือพร็อกซีก่อนอื่นเขียนการใช้งานการเรียกกลับซึ่งเป็นตรรกะหลักของการใช้งานลองอีกครั้ง
แพ็คเกจ retry.interceptor; นำเข้า net.sf.cglib.proxy.methodinterceptor; นำเข้า net.sf.cglib.proxy.methodproxy; นำเข้า retry.annotation.retryable; นำเข้า java.lang.reflect.method;/*** */คลาสสาธารณะ AnnotationAwareretryOperationsInterceptor ใช้ MethodInterceptor {// บันทึกจำนวนการตอบกลับเวลาส่วนตัว INT = 0; @Override การสกัดกั้นวัตถุสาธารณะ (Object OBJ, วิธีการ, วัตถุ [] args, methodproxy proxy) โยน {// รับคำอธิบายประกอบที่สามารถปรับเปลี่ยนได้ในวิธีที่สกัดกั้น retryable retryable = method.getannotation (retryable.class); if (retryable == null) {return proxy.invokesuper (obj, args); } else {// ด้วยคำอธิบายประกอบใหม่อีกครั้งเพิ่มข้อยกเว้นลองใช้ตรรกะ retry int maxattemps = retryable.maxattemps (); ลอง {return proxy.invokesuper (obj, args); } catch (throwable e) {if (times ++ == maxattemps) {system.out.println ("ถึงการตอบกลับสูงสุดแล้ว:" + Maxattemps + "ไม่ลองอีกครั้ง!"); } else {system.out.println ("call" + method.getName () + "ข้อยกเว้นเมธอดเริ่มต้น" + times + "ลอง ... รีไซเคิล ... "); // โปรดทราบว่านี่ไม่ใช่วิธีการเรียกใช้คำเรียกร้องการเรียกใช้จะออกจากการประมวลผลการประมวลผลปัจจุบัน proxy.invoke (OBJ, args); }}} return null; -จากนั้นเขียนคลาสพร็อกซีและใช้ AnnotationAwareretryoperationsInterceptor เป็น interceptor
Package retry.core; นำเข้า net.sf.cglib.proxy.enhancer; Import retry.interceptor.annotationawareretryoperationsInterceptor;/*** สร้างโดย jack.wu เมื่อปี 2016/9/30 */คลาสสาธารณะ SpringRetryProxy {วัตถุสาธารณะ newProxyInstance (เป้าหมายวัตถุ) {enhancer enhancer = ใหม่ enhancer (); enhancer.setsuperclass (target.getClass ()); enhancer.setCallback (หมายเหตุใหม่ใหม่ WarereretryOperationsInterceptor ()); return enhancer.create (); -ทดสอบ
ทดสอบรหัสข้างต้นด้วยวิธีการทางธุรกิจที่เกี่ยวข้องกับผู้ใช้
คำจำกัดความอินเตอร์เฟส:
Package Facade;/*** สร้างโดย Jack.wu เมื่อปี 2016/9/26 */อินเตอร์เฟสสาธารณะ userfacade {void add () โยนข้อยกเว้น; Void Query () โยนข้อยกเว้น;}การใช้งานอินเตอร์เฟส: Package Facade.impl;
นำเข้า facade.userfacade; Import retry.annotation.retryable;/*** สร้างโดย Jack.wu เมื่อปี 2016/9/26 */คลาสสาธารณะ UserFacadeImpl ใช้ userfacade {@Override โมฆะสาธารณะเพิ่ม () พ่นข้อยกเว้น {system.out.println ("เพิ่มผู้ใช้ ... "); โยน runtimeException ใหม่ (); } @Override @Retryable (maxattemps = 3) การสืบค้นโมฆะสาธารณะ () {system.out.println ("ผู้ใช้แบบสอบถาม ... "); โยน runtimeException ใหม่ (); -ทดสอบ:
คลาสสาธารณะหลัก {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่นข้อยกเว้น {userfacadeimpl user = userfacadeimpl ใหม่ (); // SpringRetry Proxy Test SpringRetryProxy SpringRetryProxy = ใหม่ SpringRetryProxy (); userfacade u = (userfacade) springretryproxy.newproxyinstance (ผู้ใช้); //u.add();//no retry uchery (); // ล้มเหลวลอง retry}}} วิธีการเพิ่มไม่ได้เพิ่มคำอธิบายประกอบใหม่โปรแกรมจะสิ้นสุดลงอย่างผิดปกติวิธีการสืบค้นเพิ่มคำอธิบายประกอบใหม่ใหม่ตั้งค่าการลองใหม่ 3 ครั้งและเอฟเฟกต์การทำงานมีดังนี้
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น