คำนำ
บทความนี้ส่วนใหญ่แนะนำข้อผิดพลาดของ @scheduled และ httpClient ในฤดูใบไม้ผลิ เราจะแบ่งปันพวกเขาสำหรับการอ้างอิงและการเรียนรู้ของคุณ ฉันจะไม่พูดด้านล่างมากนักลองมาดูการแนะนำรายละเอียดด้วยกัน
ฉันเคยก้าวขึ้นไปบนหลุมขนาดใหญ่:
เนื่องจากความพิเศษของธุรกิจงานที่กำหนดเวลาจำนวนมากจะทำงานเป็นประจำและชดเชยข้อมูลธุรกิจ
ในระหว่างการใช้งานฤดูใบไม้ผลิเราสามารถใช้คำอธิบายประกอบ @Scheduled เพื่อใช้งานเวลาได้อย่างง่ายดาย
เช้าวันหนึ่งฉันก็ตระหนักว่าตั้งแต่ช่วงเวลาหนึ่งเมื่อคืนก่อนงานที่กำหนดเวลาทั้งหมดติดอยู่และหยุดวิ่ง
@scheduleddefault เธรดเดี่ยว
หลังจากการสอบสวนพบว่าถ้าเราใช้คำอธิบายประกอบ @Scheduled เพื่ออธิบายการกำหนดค่าเริ่มต้นงานทั้งหมดจะเรียกใช้โดยเธรดเดียว หลังจากเขียนงานทดสอบเพื่อนอนหลับมันเป็นเรื่องง่ายที่จะพบว่างานอื่น ๆ ทั้งหมดจะไม่ถูกกระตุ้นเมื่อถึงเวลา
หากคุณต้องการเปิดใช้งานมัลติเธรดคุณต้องดำเนินการกำหนดค่าต่อไปนี้และตั้งค่าจำนวนเธรด:
@ConfigurationPublic คลาส ScheduleConfig ใช้ schedulingConfigurer {@Override โมฆะสาธารณะ configureTasks (ScheduleDTaskIgristrigentrar TaskRegistrar) {TaskRegistrar.setScheduler -สิ่งนี้จะแก้ปัญหาที่ถ้างานติดมันจะทำให้งานทั้งหมดติดอยู่
แต่ทำไมต้องมีงานติดอยู่?
การกำหนดค่าพารามิเตอร์เริ่มต้น HTTPClient
ปรากฎว่างานบางอย่างจะขออินเทอร์เฟซที่เหลือของบริการภายนอกเป็นประจำและการกำหนดค่าของ httpClient มีดังนี้:
PoolinghttpClientConnectionManager ConnManager = ใหม่ PoolinghttpClientConnectionManager (); ConnManager.setMaxtotal (MaxConnection); httpClient = httpClients.custom () .setConnectionManager (ConnManager) .build ();
เมื่อฉันใช้ httpClient ครั้งแรกฉันไม่ได้คิดมากเกี่ยวกับเรื่องนี้และโดยทั่วไปฉันใช้การกำหนดค่าเริ่มต้น
การติดตามซอร์สโค้ดสามารถค้นหาได้ว่าเมื่อกำหนดค่าโดยใช้วิธีการข้างต้นเวลาหมดเวลาของ HTTPClient คือ -1 จริง ๆ แล้วซึ่งหมายความว่าหากมีปัญหากับบริการของอีกฝ่ายคำขอของ HTTPClient จะไม่หมดเวลาและจะรอ ซอร์สโค้ดมีดังนี้:
builder () {super (); this.staleConnectionCheckEnabled = false; this.redirectSenabled = true; this.maxredirects = 50; this.relativeredirectsallowed = true; this.authenticationEnabled = true; this.connectionRequestTimeout = -1; this.connecttimeout = -1; this.sockettimeout = -1; this.ContentCompressionEnabled = true;}ดังนั้นเราต้องระบุเวลาหมดเวลาด้วยตนเองในเวลานี้และปัญหาได้รับการแก้ไข ตัวอย่างเช่น:
PoolinghttpClientConnectionManager ConnManager = ใหม่ PoolinghttpClientConnectionManager (); ConnManager.setMaxtotal (MaxConnection); requestconfig defaultrequestconfig = requestconfig.custom () .setsockettimeout (3000) .setConnectTimeout (3000) .SetConnectionRequestTimeOut (3000) .build (); httpClient = httpClients.custom () .setDefaulTrequestConfig (defaultrequestConfig) .SetConnectionManager (ConnManager) .build ();
เตือนปัญหาอื่น
ในความเป็นจริงปัญหาการกำหนดค่าอื่นที่พบในระหว่างการใช้ httpClient ซึ่งเป็นพารามิเตอร์ defaultmaxperroute
ฉันไม่ได้ใส่ใจกับพารามิเตอร์นี้เมื่อฉันใช้ครั้งแรก แต่ฉันเพิ่งตั้งค่าการเชื่อมต่อสูงสุดใน Maxtotal การเชื่อมต่อพูล
พารามิเตอร์ defaultMaxperRoute จริง ๆ แล้วแสดงถึงจำนวนสูงสุดของการเชื่อมต่อต่อเส้นทาง ตัวอย่างเช่นระบบของคุณจำเป็นต้องเข้าถึงบริการอื่น ๆ อีกสองรายการ: google.com และ bing.com หาก maxtotal ของคุณถูกตั้งค่าเป็น 100 และ DefaultMaxperRoute ถูกตั้งค่าเป็น 50 ดังนั้นจำนวนคำขอสูงสุดสำหรับแต่ละบริการอาจเป็น 50
ดังนั้นหากไม่ได้ตั้งค่า defaultMaxperRoute ให้ติดตามซอร์สโค้ด:
สาธารณะ poolinghttpClientConnectionManager (สุดท้าย httpClientConnectionOperator httpClientConnectionOperator, httpConnectionFactory สุดท้าย <httproute, ManagedhttpClientConnection> Connactory สุดท้าย this.configdata = new configdata (); // เมธอด cpool constructor ที่ใช้ที่นี่พารามิเตอร์ที่สองคือ defaultMaxPerRoute ซึ่งเป็นค่าเริ่มต้นคือ 2. this.pool = ใหม่ cpool (ใหม่ InternalConnectionFactory (this.ConfigData, ConnFactory), 2, 20, TimetOlive, Tunit); this.pool.setValidateFterinactivity (2000); this.ConnectionOperator = args.notNull (httpClientConnectionOperator, "httpClientConnectionOperator"); this.isshutdown = new Atomicboolean (false);}
พบที่นี่ว่าค่าเริ่มต้นมีเพียง 2 ไม่น่าแปลกใจที่มีการหมดเวลาในสถานการณ์ที่เกิดขึ้นพร้อมกันสูงในเวลานั้นแม็กซัตถูกตั้งค่าสูงมากอย่างชัดเจน
ดังนั้นหากบริการของคุณเข้าถึงบริการภายนอกที่แตกต่างกันมากมายและมีการเกิดขึ้นพร้อมกันขนาดใหญ่คุณต้องกำหนดค่าพารามิเตอร์สองพารามิเตอร์และค่าเริ่มต้น MaxperRoute
ดังนั้นเมื่อคุณใช้สิ่งใหม่ ๆ ในภายหลังคุณจะได้ดูการกำหนดค่าที่คุณมี หากคุณมีคำถามใด ๆ คุณต้องตรวจสอบก่อน อย่าคัดลอกรหัสออนไลน์และใช้โดยตรง มันอาจจะดีในเวลานั้น แต่บางทีฉันอาจจะโกงในอนาคต
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่าเนื้อหาของบทความนี้จะมีค่าอ้างอิงบางอย่างสำหรับการศึกษาหรือที่ทำงานของทุกคน หากคุณมีคำถามใด ๆ คุณสามารถฝากข้อความไว้เพื่อสื่อสาร ขอบคุณสำหรับการสนับสนุน Wulin.com