ฉันเพิ่งใช้ httpClient และดูเอกสารอย่างเป็นทางการ: การใช้งาน httpClient คาดว่าจะปลอดภัย ขอแนะนำว่าอินสแตนซ์เดียวกันของคลาสนี้จะถูกนำมาใช้ซ้ำสำหรับการดำเนินการตามคำขอหลายครั้ง การแปลหมายถึง: การใช้งาน HTTPClient คือเธรดที่ปลอดภัยและสามารถนำอินสแตนซ์เดียวกันกลับมาใช้ใหม่เพื่อดำเนินการตามคำขอหลายรายการ เมื่อเราพบคำอธิบายนี้เราควรคิดว่าจะต้องห่อหุ้ม httpClient เนื่องจากใช้สปริงบูตเราจะรวมการบูตสปริงเพื่อห่อหุ้ม httpClient
1. ขอลองใช้ Handler (ขอการประมวลผลอีกครั้ง)
เพื่อให้กลไกการยกเว้นแบบกำหนดเองมีผลบังคับใช้อินเตอร์เฟส HTTPREQUESTRETRYHANDLER จะต้องใช้งานรหัสมีดังนี้:
นำเข้า java.io.ioException; นำเข้า java.io.InterruptedioException; นำเข้า java.net.unknownhostexception; นำเข้า javax.net.ssl.sslexception; นำเข้า Javax.net.ssl.sslhandshakeException; นำเข้า org.apache.http.httpenclosingrequest; นำเข้า org.apache.http.httprequest; นำเข้า org.apache.http.nohttpresponseexception; นำเข้า org.apache.http.client.httprequestretryHandler; นำเข้า org.apache.http.client.protocol.httpClientContext; นำเข้า org.apache.http.conn.connecttimeoutexception; นำเข้า org.apache.http.protocol.httpcontext; นำเข้า org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; / *** คำอธิบาย: กลไกการประมวลผลซ้ำของ httpClient*/ @configuration คลาสสาธารณะ myhttprequestretryhandler {@value ("$ {httpclient.config.rerytime}") // ที่นี่แนะนำให้ใช้ @configurationProperties @Bean สาธารณะ httprequestretryHandler httprequestretryHandler () {// ร้องขอการลอง retry final int retrytime = this.rerytime; ส่งคืน httprequestretryHandler ใหม่ () {public boolean retryRequest (ข้อยกเว้น ioexception, int executionCount, บริบท httpContext) {// อย่าลองอีกครั้งหากมีการนับจำนวนสูงสุดอีกครั้ง } // เซิร์ฟเวอร์จะแยกข้อยกเว้นการเชื่อมต่อของไคลเอ็นต์ถ้า (ข้อยกเว้นของ nohttpresponseException) {return true; } // หมดเวลาหมดเวลาลองใหม่ถ้า (ข้อยกเว้นของ interruptedioException) {return true; } // โฮสต์ที่ไม่รู้จักถ้า (ข้อยกเว้นของ UnknownHostException) {return false; } // การเชื่อมต่อปฏิเสธหาก (ข้อยกเว้นของ ConnectTimeOutException) {return false; } // ssl handshake exception ถ้า (exception instanceof sslexception) {return false; } httpClientContext clientContext = httpClientContext.adapt (บริบท); httpRequest request = clientContext.getRequest (); if (! (ขออินสแตนซ์ของ httpentityenclosingRequest)) {return true; } return false; - - 2. การรวมกลุ่มผู้จัดการการเชื่อมต่อ (การจัดการกลุ่มการเชื่อมต่อ)
PoolinghttpClientConnectionManager ใช้เพื่อจัดการกลุ่มการเชื่อมต่อของลูกค้าและสามารถให้บริการสำหรับคำขอจากหลายเธรด รหัสมีดังนี้:
นำเข้า org.apache.http.config.registry; นำเข้า org.apache.http.config.registryBuilder; นำเข้า org.apache.http.conn.socket.connectionsocketFactory; นำเข้า org.apache.http.conn.socket.layeredConnectionsocketFactory; นำเข้า org.apache.http.conn.socket.plainconnectionsocketFactory; นำเข้า org.apache.http.conn.ssl.sslconnectionsocketFactory; นำเข้า org.apache.http.impl.conn.poolinghttpClientConnectionManager; นำเข้า org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; @Configuration คลาสสาธารณะ MyPoolinghttpClientConnectionManager { / *** จำนวนสูงสุดของการเชื่อมต่อในพูลเชื่อมต่อ* / @Value ("$ {httpClient.config.connmaxtotal}") int connmaxtotal = 20; / ** * */ @Value ("$ {httpClient.config.maxperRoute}") int maxperRoute ส่วนตัว = 20; / ** * เวลาการอยู่รอดการเชื่อมต่อหน่วยคือ S */ @Value ("$ {httpClient.config.timetolive}") timetolive int ส่วนตัว = 60; @Bean สาธารณะ poolinghttpClientConnectionManager poolingClientConnectionManager () {poolinghttpClientConnectionManager poolhttpcconnManager = ใหม่ poolinghttpClientConnectionManager (60, timeUnit.seconds); // จำนวนสูงสุดของการเชื่อมต่อ poolhttpcconnmanager.setmaxtotal (this.connmaxtotal); // เส้นทาง radix poolhttpcconnmanager.setdefaultmaxperroute (this.maxperroute); ส่งคืน poolhttpcconnmanager; - หมายเหตุ: เมื่อไม่จำเป็นต้องใช้อินสแตนซ์ HTTPClient อีกต่อไปและกำลังจะอยู่นอกขอบเขตมันเป็นสิ่งสำคัญที่จะต้องปิดผู้จัดการการเชื่อมต่อเพื่อให้แน่ใจว่าการเชื่อมต่อทั้งหมดที่ผู้จัดการยังคงใช้งานอยู่นั้นปิดและเพิ่มทรัพยากรระบบที่จัดสรรโดยการเชื่อมต่อเหล่านั้น
ตัวสร้างของคลาส PoolinghtttpClientConnectionManager ด้านบนมีดังนี้:
สาธารณะ poolinghttpClientConnectionManager (Timetolive ยาวสุดท้าย, timunit timunit สุดท้าย) {this (getDefaulTregistry (), null, null, null, timetolive, tunit); } รีจิสทรีแบบคงที่ส่วนตัว <ConnectionsocketFactory> getDefaulTregistry () {return registryBuilder. <การเชื่อมต่อกับ Factory> สร้าง (). register ("http", plainconnectionsocketFactory.getSocketFactory (). register ("https" - มีการเชื่อมต่อสูงสุดสองครั้งในการกำหนดค่าการกำหนดค่า poolinghttpClientConnectionManager ซึ่งควบคุมหมายเลขการเชื่อมต่อสูงสุดทั้งหมดและหมายเลขการเชื่อมต่อสูงสุดต่อเส้นทางตามลำดับ หากไม่มีการตั้งค่าที่ชัดเจนโดยค่าเริ่มต้นอนุญาตให้มีการเชื่อมต่อได้สูงสุด 2 ครั้งต่อเส้นทางและจำนวนการเชื่อมต่อทั้งหมดไม่เกิน 20 ค่านี้ไม่เพียงพอสำหรับแอปพลิเคชันจำนวนมากที่มีความพร้อมสูง ค่าที่เหมาะสมจะต้องตั้งค่าตามสถานการณ์จริง ความคิดนั้นคล้ายกับขนาดของพูลเธรด หากคำขอการเชื่อมต่อทั้งหมดเป็น URL เดียวกันค่าของ MaxperRoute สามารถตั้งค่าให้สอดคล้องกับ maxtotal เพื่อให้การเชื่อมต่อสามารถนำกลับมาใช้ใหม่ได้อย่างมีประสิทธิภาพมากขึ้น
หมายเหตุพิเศษ: หากคุณต้องการนำการเชื่อมต่อกลับมาใช้ใหม่คุณต้องสร้างทรัพยากรระบบที่ปล่อยออกมาอย่างถูกต้อง วิธีการวางจำหน่ายมีดังนี้:
หากคุณใช้ OutputStream คุณต้องตรวจสอบให้แน่ใจว่าเอนทิตีทั้งหมดถูกเขียนออกมา หากเป็นอินพุทสตรีมคุณต้องจำไว้ว่าให้เรียกอินพุตสตรีม. close () ในตอนท้าย หรือใช้ entityutils.consume (เอนทิตี) หรือ entityutils.consumequietly (เอนทิตี) เพื่อให้เอนทิตีหมดลงอย่างสมบูรณ์ (หลังไม่ได้โยนข้อยกเว้น) เพื่อทำสิ่งนี้ มีวิธีการ toString ใน EntityUtils ซึ่งสะดวกมาก (อินพุตสตรีมจะปิดโดยอัตโนมัติในตอนท้ายเมื่อเรียกใช้วิธีนี้ แต่ในกระบวนการทดสอบจริงการเชื่อมต่อจะไม่ถูกปล่อยออกมา) แต่สามารถใช้งานได้หากสามารถพิจารณาได้ว่าเอนทิตีที่ได้รับนั้นไม่ใหญ่เป็นพิเศษ หากเอนทิตีทั้งหมดไม่ได้ใช้งานอย่างเต็มที่การเชื่อมต่อจะไม่สามารถนำกลับมาใช้ใหม่ได้และในไม่ช้าการหมดเวลาการเชื่อมต่อที่มีอยู่หรือบล็อกที่นี่จะไม่ได้รับในกลุ่มการเชื่อมต่อ (เนื่องจากสถานะของการเชื่อมต่อจะถูกยกเว้นเสมอนั่นคือสถานะที่ใช้) ดังนั้นหากคุณต้องการนำการเชื่อมต่อกลับมาใช้ใหม่คุณต้องจำไว้ว่าต้องใช้เอนทิตีอย่างเต็มที่ ตราบใดที่ตรวจพบ EOF ของสตรีมวิธีการเชื่อมต่อ releaseconnection ของผู้เชื่อมต่อจะถูกเรียกโดยอัตโนมัติสำหรับการประมวลผล
3. การเชื่อมต่อรักษากลยุทธ์ชีวิต
ข้อกำหนด HTTP ไม่ได้ระบุระยะเวลาที่การเชื่อมต่อแบบถาวรอาจและควรมีชีวิตอยู่ เซิร์ฟเวอร์ HTTP บางตัวใช้ส่วนหัวที่ไม่ได้มาตรฐานเพื่อสื่อสารกับลูกค้าในช่วงเวลาไม่กี่วินาทีเมื่อพวกเขาตั้งใจจะเชื่อมต่อทางฝั่งเซิร์ฟเวอร์ HttpClient สามารถใช้ข้อมูลนี้ได้ หากส่วนหัวที่เก็บรักษาไม่มีอยู่ในการตอบสนอง HTTPClient จะถือว่าการเชื่อมต่อสามารถใช้งานได้อย่างไม่มีกำหนด อย่างไรก็ตามเซิร์ฟเวอร์ HTTP จำนวนมากที่ใช้โดยทั่วไปได้รับการกำหนดค่าเพื่อลบการเชื่อมต่อแบบถาวรหลังจากระยะเวลาของสถานะที่ไม่ได้ใช้งานเพื่อบันทึกทรัพยากรระบบโดยไม่ต้องแจ้งลูกค้า หากนโยบายเริ่มต้นมองโลกในแง่ดีเกินไปคุณอาจต้องจัดทำนโยบายการเก็บรักษาแบบกำหนดเองรหัสมีดังนี้:
นำเข้า org.apache.http.headerelement; นำเข้า org.apache.http.HeadeLelementiterator; นำเข้า org.apache.http.httpresponse; นำเข้า org.apache.http.conn.ConnectionKeepalivestrategy; นำเข้า org.apache.http.message.basicheaderelementiterator นำเข้า org.apache.http.protocol.http; นำเข้า org.apache.http.protocol.httpcontext; นำเข้า org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; / *** คำอธิบาย: นโยบายการเชื่อมต่อการเชื่อมต่อ* @author chhliu*/ @configuration คลาสสาธารณะ MyConnectionKeepaliVestrategy {@Value ("$ {httpClient.config.keepalivetime}") Private Int Keepalivetime = 30; @Bean ("ConnectionKeepalivestrategy") Public ConnectionKeepalIvestrategy ConnectionKeepalIvestrategy () {ส่งคืนการเชื่อมต่อใหม่ใหม่ () {public Long Get ต่อไป (httpresponse Response, HttpContext บริบท) {// Honor Response.headerIterator (http.conn_keep_alive)); ในขณะที่ (it.hasnext ()) {headelement he = it.nextelement (); String param = he.getName (); ค่าสตริง = he.getValue (); if (value! = null && param.equalsignorecase ("หมดเวลา")) {ลอง {return long.parselong (ค่า) * 1000; } catch (numberFormatexception ละเว้น) {}}} return 30 * 1000; - - หมายเหตุ: การเชื่อมต่อที่ยาวนานไม่ได้ใช้ในทุกสถานการณ์โดยเฉพาะอย่างยิ่งทุกวันนี้ระบบส่วนใหญ่จะถูกปรับใช้กับเซิร์ฟเวอร์หลายตัวและมีฟังก์ชั่นการปรับสมดุลโหลด หากเราทำการเชื่อมต่อที่ยาวนานเมื่อเข้าถึงเมื่อเซิร์ฟเวอร์นั้นถูกระงับมันจะส่งผลกระทบต่อไคลเอนต์ ในเวลาเดียวกันเราไม่สามารถใช้คุณสมบัติการปรับสมดุลโหลดของเซิร์ฟเวอร์ได้อย่างเต็มที่ การเชื่อมต่อสั้น ๆ นั้นมีประโยชน์มากกว่า สิ่งเหล่านี้จำเป็นต้องได้รับการพิจารณาตามความต้องการเฉพาะแทนที่จะสรุปในประโยคเดียว
4. การกำหนดค่าพร็อกซี httpClient (การกำหนดค่าพร็อกซี)
ใช้ในการกำหนดค่าพร็อกซีรหัสมีดังนี้:
นำเข้า org.apache.http.httphost; นำเข้า org.apache.http.impl.conn.defaultproxyrouteplanner; นำเข้า org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; / *** คำอธิบาย: httpclient proxy* @author chhliu*/ @configuration คลาสสาธารณะ mydefaultproxyrouteplanner {// ที่อยู่โฮสต์ของพร็อกซี @value ("$ {httpclient.config.proxyhost}" // หมายเลขพอร์ตของพร็อกซี @Value ("$ {httpClient.config.proxyport}") int proxyport ส่วนตัวส่วนตัว = 8080; @Bean สาธารณะ defaultProxyRoutePlanner defaultProxyRoutEplanner () {httphost proxy = new httphost (this.proxyhost, this.proxyport); ส่งคืน defaultproxyrouteplanner ใหม่ (พร็อกซี); - HTTPClient ไม่เพียง แต่รองรับการเชื่อมต่อโดยตรงอย่างง่ายนโยบายการกำหนดเส้นทางที่ซับซ้อนและการจัดส่งพร็อกซ์ HttproutePlanner ขึ้นอยู่กับบริบท HTTP ซึ่งเป็นนโยบายการคำนวณการกำหนดเส้นทางลูกค้าไปยังเซิร์ฟเวอร์ โดยทั่วไปหากไม่มีพร็อกซีคุณไม่จำเป็นต้องตั้งค่าสิ่งนี้ มีแนวคิดที่สำคัญมากที่นี่ - เส้นทาง: ใน httpClient เส้นทางหมายถึงบรรทัดของเครื่องสภาพแวดล้อมที่กำลังวิ่ง -> โฮสต์เครื่องเป้าหมายนั่นคือถ้าโฮสต์ของ URL เป้าหมายเหมือนกันเส้นทางของพวกเขาจะเหมือนกัน
5. RequestConfig
การกำหนดค่าต่างๆที่ใช้ในการตั้งค่าคำขอรหัสมีดังนี้:
นำเข้า org.apache.http.client.config.requestconfig; นำเข้า org.springframework.beans.factory.annotation.value; นำเข้า org.springframework.context.annotation.bean; นำเข้า org.springframework.context.annotation.configuration; @Configuration คลาสสาธารณะ myRequestConfig {@Value ("$ {httpClient.config.connectTimeout}") ส่วนตัว int connectTimeout = 2000; @Value ("$ {httpClient.config.connectrequestTimeOut}") int private int connectrequesttimeout = 2000; @Value ("$ {httpClient.config.sockettimeout}") int sockettimeout ส่วนตัว = 2000; @Bean Public RequestConfig config () {return requestconfig.custom () .setConnectionRequestTimeout (this.connectrequestTimeout) .setConnectTimeOut (this.ConnectTimeOut) .SetSocketTimeOut - RequestConfig คือการกำหนดค่าคำขอ มีเวลาหมดเวลาสามครั้งที่สำคัญกว่า โดยค่าเริ่มต้นเวลาการหมดเวลาทั้งสามครั้งคือ 0 (หากการกำหนดค่าของคำขอไม่ได้ตั้งค่าพารามิเตอร์เริ่มต้นจะถูกตั้งค่าใน httpclientparamconfig ของ getRequestConfig ในระหว่างการดำเนินการ) ซึ่งหมายถึงการรอที่ไม่มีที่สิ้นสุดซึ่งสามารถทำให้คำขอทั้งหมดถูกบล็อกและรออย่างไม่มีกำหนดในสถานที่นี้ การหมดเวลาทั้งสามนี้คือ:
. ConnectionRequestTimeout - เวลาสำหรับการเชื่อมต่อจากกลุ่มการเชื่อมต่อ
เวลานี้กำหนดเวลาหมดเวลาสำหรับการดึงการเชื่อมต่อจากกลุ่มการเชื่อมต่อที่จัดการโดย ConnectionManager หากไม่มีการเชื่อมต่อที่มีอยู่ในพูลการเชื่อมต่อคำขอจะถูกบล็อกและเวลาสูงสุดในการรอการเชื่อมต่อ qurequesttimeout หากยังไม่ได้รับบริการข้อยกเว้นการเชื่อมต่อ PooltimeOutException จะถูกโยนทิ้งและไม่อนุญาตให้รออีกต่อไป
ข. ConnectTimeOut - เวลาหมดเวลาเชื่อมต่อ
เวลานี้กำหนดหมดเวลาสำหรับการสร้างการเชื่อมต่อกับเซิร์ฟเวอร์ผ่านเครือข่ายนั่นคือเวลารอการเชื่อมต่อเพื่อเชื่อมต่อกับ URL เป้าหมายหลังจากได้รับการเชื่อมต่อในพูลการเชื่อมต่อ การหมดเวลาเกิดขึ้นข้อยกเว้นการเชื่อมต่อ imoutexception จะถูกโยนลงไป
ค. Sockettimeout - ขอเวลาหมดเวลา
เวลานี้กำหนดเวลาหมดเวลาสำหรับข้อมูลการอ่านซ็อกเก็ตนั่นคือเวลาที่ใช้ในการรอหลังจากเชื่อมต่อกับเซิร์ฟเวอร์เพื่อรับข้อมูลการตอบกลับจากเซิร์ฟเวอร์หรือเวลาที่ใช้ในการตอบกลับหลังจากเชื่อมต่อกับ URL ก่อนหน้า การหมดเวลาเกิดขึ้นและข้อยกเว้น SocketTimeOutException จะถูกโยนลงไป
6. อินสแตนซ์ httpclient
httpClient ถูกสร้างอินสแตนซ์โดยการใช้งาน FactoryBean รหัสมีดังนี้:
นำเข้า org.apache.http.client.httprequestretryHandler; นำเข้า org.apache.http.client.config.requestconfig; นำเข้า org.apache.http.impl.conn.ConnectionKeepalivestrategy; นำเข้า org.apache.http.impl.client.closeablehttpClient; นำเข้า org.apache.http.impl.client.httpclients; นำเข้า org.apache.http.impl.conn.defaultproxyrouteplanner; นำเข้า org.apache.http.impl.conn.poolinghttpClientConnectionManager; นำเข้า org.springframework.beans.factory.disposablebean; นำเข้า org.springframework.beans.factory.factorybean; นำเข้า org.springframework.beans.factory.initializingbean; นำเข้า org.springframework.beans.factory.annotation.autowired; นำเข้า org.springframework.stereotype.service; / *** คำอธิบาย: httpClient encapsulation*/ @Service ("httpClientManagerFactoryBen") คลาสสาธารณะ httpClientManagerFactoryBen ใช้โรงงาน <ScreonableHttPClient> การเริ่มต้นเบียน @autowired Private ConnectionKeepalivestrategy การเชื่อมต่อ Keepalivestrategy; @autowired ส่วนตัว httprequestretryhandler httprequestretryhandler; @autowired ส่วนตัว defaultproxyrouteplanner proxyrouteplanner; @autowired Private PoolinghttpClientConnectionManager PoolhttpcconnManager; @autowired Private RequestConfig Config; // เมื่อทำลายบริบทการทำลายอินสแตนซ์ httpClient @Override โมฆะสาธารณะทำลาย () โยนข้อยกเว้น { / * * การเรียก httpClient.close () จะปิดตัวจัดการการเชื่อมต่อก่อนแล้วปล่อยทรัพยากรทั้งหมดที่ครอบครองโดย httpClient * ปิดการเชื่อมต่อทั้งหมดที่ใช้งานหรือไม่ได้ใช้งาน เนื่องจากตัวจัดการการเชื่อมต่อที่ใช้นั้นปิดอยู่ที่นี่ * ดังนั้นเมื่อคุณต้องทำการร้องขอ HTTP ในครั้งต่อไปคุณต้องต่ออายุผู้จัดการการเชื่อมต่อเพื่อสร้าง httpClient * นั่นคือเมื่อคุณต้องการปิดและสร้างไคลเอนต์ใหม่ตัวจัดการการเชื่อมต่อไม่สามารถเป็นซิงเกิล */ if (null! = this.client) {this.client.close (); }} @Override // เริ่มต้นอินสแตนซ์โมฆะสาธารณะ AfterPropertIesset () โยนข้อยกเว้น {/ * * ขอแนะนำให้ใช้ httpClients.custom เพื่อสร้าง httpClientBuilder ที่นี่แทนที่จะใช้ httpClientBuilder.create () ไม่ปลอดภัย แต่ httpClients นั้นสามารถดูดซับได้ วัตถุที่ไม่เปลี่ยนรูปไม่เพียง แต่ตรวจสอบให้แน่ใจว่าสถานะของวัตถุไม่เปลี่ยนแปลง * แต่ยังสามารถใช้ร่วมกันโดยเธรดอื่น ๆ โดยไม่ต้องใช้กลไกการล็อค */ this.client = httpClients.custom (). setConnectionManager .SetRoutePlanner (ProxyRoutePlanner) .SetDefaulTrequestConfig (config) .build (); } // ส่งคืนประเภทของอินสแตนซ์ @Override Public PublicalhttpClient getObject () โยนข้อยกเว้น {return this.client; } @Override คลาสสาธารณะ <?> getObjectType () {return (this.client == null? classeablehttpClient.class: this.client.getClass ()); } // อินสแตนซ์ที่สร้างขึ้นคือ Singleton@Override Public Boolean Issingleton () {return true; -7. เพิ่มไฟล์การกำหนดค่า
# โฮสต์ของพร็อกซี httpClient.config.proxyhost = xxx.xx.xx.xx # พอร์ตพร็อกซี httpclient.config.proxyport = 8080 # การเชื่อมต่อหมดเวลา ในพูลการเชื่อมต่อ httpclient.config.connmaxtotal = 20 httpclient.config.maxperroute = 20 # หมดเวลาการเชื่อมต่อหน่วย MS httpclient.config.connecttimeout = 20 # เวลาเชื่อมต่อ httpclient.config.connectrequesttimeout = 2000 # sock timeout httpclient.config.sockettimeout = 2000 # เวลาการอยู่รอดการเชื่อมต่อหน่วย S httpClient.config.timetolive = 60
8. ทดสอบ
รหัสทดสอบมีดังนี้:
นำเข้า java.io.ioException; นำเข้า java.util.concurrent.executorservice; นำเข้า java.util.concurrent.executors; นำเข้า Javax.annotation.Resource; นำเข้า org.apache.http.consts; นำเข้า org.apache.http.parseException; นำเข้า org.apache.http.client.clientprotocolexception; นำเข้า org.apache.http.client.methods.closeablehttpresponse; นำเข้า org.apache.http.client.methods.httpget; นำเข้า org.apache.http.impl.client.closeablehttpClient; นำเข้า org.apache.http.util.entityutils; นำเข้า org.junit.test; นำเข้า org.junit.runner.runwith; นำเข้า org.springframework.boot.test.context.springboottest; นำเข้า org.springframework.test.context.junit4.springrunner; @runwith (SpringRunner.class) @springboottest คลาสสาธารณะ httpClientManagerFactoryBentest {// inject httpClient อินสแตนซ์ @Resource (name = "httpClientManagerFactoryBen" @Test Public Void Test Test () พ่น clientProtocolexception, iOException, interruptedException {ExecutorService Service = Executors.NewFixedThreadPool (2); สำหรับ (int i = 0; i <10; i ++) {service.submit (ใหม่ runnable () {@Override โมฆะสาธารณะเรียกใช้ () {system.out.println ("เธรดปัจจุบันคือ:" thread.currentthread () getName ()); httpentity entity = null; httpget ("https: // localhost: 8080/testjson"); System.out.println ("=============================================================================================== การเชื่อมต่อ} catch (clientprotocolexception e) {e.printstacktrace (); });} thread.sleep (60000); ผ่านขั้นตอนข้างต้นการห่อหุ้มของ HTTPClient จะเสร็จสมบูรณ์โดยทั่วไป หากคุณต้องการรายละเอียดมากขึ้นคุณสามารถปรับปรุง HTTPClient เป็น httpClientTemplate ตามแนวคิดข้างต้นเนื่องจากการปิด HTTTPClient ใช้กลไกการเรียกกลับภายในซึ่งคล้ายกับ JDBCTEMPLATE หรือ REDISTEMPLATE จนกว่าบริการจะได้รับการให้บริการ
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น