1. การปฏิบัติงานและการกำหนดเวลา
สปริงใช้อินเทอร์เฟซ taskexecutor และ taskscheduler เพื่อให้ abstractions สำหรับการดำเนินการแบบอะซิงโครนัสและงานการจัดตารางเวลา
taskexecutor ของฤดูใบไม้ผลิเหมือนกับ java.util.concurrent.executor อินเตอร์เฟส อินเทอร์เฟซนี้มีวิธีเดียวที่ดำเนินการ (งานที่เรียกใช้ได้)
1.1. ประเภท taskexecutor
ฤดูใบไม้ผลิมีการใช้งาน taskexecutor ในตัวและคุณไม่จำเป็นต้องนำไปใช้ด้วยตัวเอง:
1.2. คำอธิบายประกอบสนับสนุนการกำหนดเวลาและการดำเนินการแบบอะซิงโครนัส
เพื่อเปิดใช้งานการสนับสนุนสำหรับ @Scheduled และ @async Annotations เพิ่ม @enablecheduling และ @enableasync ให้กับหนึ่งในของคุณ
@configuration คลาส:@configuration@enableasync@enablechedulingpublic คลาส appconfig {}ให้ความสนใจเป็นพิเศษ
โหมดคำแนะนำเริ่มต้นสำหรับการประมวลผลคำอธิบายประกอบ @async คือ "พร็อกซี" ซึ่งอนุญาตให้มีการรบกวนการโทรผ่านพร็อกซีเท่านั้น การโทรในท้องถิ่นภายในคลาสเดียวกันไม่สามารถสกัดกั้นด้วยวิธีนั้นได้ สำหรับโหมดการรบกวนขั้นสูงให้พิจารณาเปลี่ยนไปใช้โหมด "spectionj" ร่วมกับการเชื่อมเวลาหรือการเชื่อมเวลาโหลด
โดยค่าเริ่มต้น @async ได้รับการจัดการด้วยพร็อกซี ดังนั้นวิธีการในคลาสเดียวกันจึงไม่สามารถเรียกได้แบบอะซิงโครนัสด้วย @async และสถานการณ์นี้ยังคงเป็นแบบซิงโครนัส
ตัวอย่างเช่น: ต่อไปนี้การโทร sayshi () โดยตรงสามารถดำเนินการแบบอะซิงโครนัสได้ในขณะที่การพูด () ยังคงดำเนินการแบบซิงโครนัสเมื่อโทร Sayshello ()
คลาสสาธารณะ A {โมฆะสาธารณะ Sayshello () {sayhi (); } @async โมฆะสาธารณะ sayshi () {}}1.3. @Async คำอธิบายประกอบ
การเพิ่มคำอธิบายประกอบ @async ลงในวิธีนี้หมายความว่านี่เป็นการโทรแบบอะซิงโครนัส กล่าวอีกนัยหนึ่งผู้โทรของวิธีการจะได้รับผลตอบแทนทันทีและการดำเนินการวิธีการจริงคือการส่งงานใน taskexecutor ของฤดูใบไม้ผลิ
กล่าวอีกนัยหนึ่งผู้โทรจะส่งคืนทันทีเมื่อการเรียกร้องและการดำเนินการจริงของวิธีการจะเกิดขึ้นในงานที่ส่งไปยังสปริง taskexecutor
@asyncvoid dosomething () {// สิ่งนี้จะถูกดำเนินการแบบอะซิงโครนัส} @asyncVoid Dosomething (String s) {// สิ่งนี้จะถูกเรียกใช้งานแบบอะซิงโครนัส} @asyncFuture <String> returnsomething (int i) {// สิ่งนี้จะถูกดำเนินการแบบอะซิงโครนัส}สังเกต:
@async วิธีการอาจไม่เพียง แต่ประกาศ java.util.concurrent.future ประเภทการกลับมา แต่ยังรวมถึง org.springframework.util.concurrent.listenablefuture หรือในฤดูใบไม้ผลิ 4.2, Java.util.current.com
1.4. @Async Limited Executor
โดยค่าเริ่มต้นเมื่อมีการเพิ่มคำอธิบายประกอบ @async ลงในวิธีการจะใช้ผู้ดำเนินการที่รองรับไดรเวอร์คำอธิบายประกอบ อย่างไรก็ตามค่าค่าของคำอธิบายประกอบ @async สามารถระบุผู้ดำเนินการเพิ่มเติมได้
@async ("otherexecutor") เป็นโมฆะ dosomething (String s) {// สิ่งนี้จะถูกดำเนินการแบบอะซิงโครนัสโดย "otherexecutor"}ที่นี่ otherexecutor เป็นชื่อของถั่วผู้ดำเนินการใด ๆ ในคอนเทนเนอร์ฤดูใบไม้ผลิ
1.5. @async การจัดการข้อยกเว้น
เมื่อเมธอด @async มีค่าส่งคืนของประเภทในอนาคตมันเป็นเรื่องง่ายที่จะจัดการข้อยกเว้นที่โยนเมื่อพิมพ์เมธอด Get () ในอนาคตเพื่อให้ได้ผลการดำเนินการของงาน หากประเภทการส่งคืนเป็นโมฆะข้อยกเว้นจะไม่ถูกจับ
ชั้นเรียนสาธารณะ Myasyncuncaughtexceptionhandler ใช้ asyncuncunchetxceptionhandler {@Override โมฆะสาธารณะที่จับที่จัดการ 2. การกำหนดค่าพูลเธรด
นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; นำเข้า org.springframework.scheduling.annotation.enableasync; org.springframework.scheduling.concurrent.threadpooltaskexecutor;@configuration@enableasyncpublic คลาส taskexecutorconfig {ส่วนตัวจำนวนเต็ม corepoolsize = 30; MaxPoolSize ส่วนตัว = 50; จำนวนเต็มส่วนตัว KeepaliveSeconds = 300; // queuecapacity จำนวนเต็มส่วนตัว = 2000; @Bean ("MyThreadPoolTaskexecutor") Public Threadpooltaskexecutor MyThreadPoolTaskexecutor () {ThreadPoolTaskexecutor Executor = New ThreadPoolTaskexecutor (); Executor.SetCorePoolSize (CorePoolSize); Executor.SetMaxPoolSize (MaxPoolSize); Executor.SetKeepaliveseconds (KeepaliveSeconds); // Executor.SetqueUecapacity (QueUecapacity); Executor.SetWaitFortAskStocompleteOnShutdown (จริง); Executor.initialize (); ส่งคืนผู้บริหาร; - เรียก
@async ("MyThreadPoolTaskexecutor") @Override โมฆะสาธารณะปัจจุบัน (คูปองเอนทิตีที่มีความเป็นส่วนตัว) {ลอง {CouponBaseresponse rst = CouponSendRpcService.Send (Entity.getUserId () if (null! = rst && rst.issuccess ()) {entity.setStatus (presentstatusenum.success.getType ()); } else {string reision = (null == rst)? "ข้อยกเว้นการตอบกลับ": rst.getmsg (); entity.setFailureRessorason (เหตุผล); entity.setstatus (presentstatusenum.failure.getType ()); }} catch (exception ex) {log.error (ex.getMessage (), ex); Entity.SetFailureReason (Ex.GetMessage ()); entity.setstatus (presentstatusenum.failure.getType ()); } couponpresentlogdao.update (เอนทิตี); -ผลลัพธ์
[ข้อมูล] 2018-05-09 16: 27: 39.887 [Mythreadpooltaskexecutor-1] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-รับวิธีการ: ส่ง; อาร์กิวเมนต์: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
[ข้อมูล] 2018-05-09 16: 27: 39.889 [Mythreadpooltaskexecutor-2] [com.ourhours.coupon.rpc.dubbo.receivelogfilter]-รับวิธีการ: ส่ง; อาร์กิวเมนต์: [10046031, "4D7CC32F8F7E4B00BCA56F6BF4B3B658", "1", 10001]
อ้างถึง:
เอกสารอ้างอิง Spring Framework 4.3.17.release
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น