مقدمة
تقدم هذه المقالة بشكل أساسي عيوب scheduled و httpclient في الربيع. سنشاركهم للرجوع إليه وتعلمك. لن أقول الكثير أدناه ، دعنا نلقي نظرة على المقدمة التفصيلية معًا.
صعدت مرة واحدة على حفرة كبيرة:
نظرًا لخصوصية الأعمال ، سيتم تشغيل العديد من المهام المحددة بانتظام وتعويض بيانات الأعمال.
خلال استخدام الربيع ، يمكننا استخدام التعليق التوضيحي scheduled لتنفيذ مهام التوقيت بسهولة.
في صباح أحد الأيام ، أدركت فجأة أنه منذ لحظة معينة في الليلة السابقة ، كانت جميع المهام الموقوتة عالقة وتوقفت عن الجري.
scheduledDefault مؤشر ترابط واحد
بعد التحقيق ، تبين أنه إذا استخدمنا التعليق التوضيحي @scheduled لشرح التكوين الافتراضي ، فسيتم تشغيل جميع المهام بواسطة مؤشر ترابط واحد. بعد كتابة مهمة اختبار للنوم ، من السهل العثور على أن جميع المهام الأخرى لا يتم تشغيلها عندما يحين الوقت.
إذا كنت بحاجة إلى تمكين متعدد الخيوط ، فأنت بحاجة إلى تنفيذ التكوين التالي وتعيين عدد مؤشرات الترابط:
ConfigurationPublic Class ScheduleConfig تنفذ SchedulingConfigurer {Override public void configureTasks (ScheduledTaskregistrar taskregistrar) {taskregistrar.setscheduler (evectors.newscheduledthreadpool (5)) ؛ }}هذا يحل المشكلة أنه إذا كانت المهمة عالقة ، فسوف تتسبب في عالق جميع المهام.
ولكن لماذا توجد مهام عالقة؟
تكوين المعلمة الافتراضية httpclient
اتضح أن بعض المهام ستطلب الواجهة المريحة للخدمات الخارجية بانتظام ، وأن تكوين httpclient هو كما يلي:
poolinghttpclientConnectionManager connmanager = new 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. this.connectionRequestTimeout = -1 ؛ this.connectTimeout = -1 ؛ this.sockettimeout = -1 ؛ this.contentcompressionEnabled = true ؛}لذلك يجب علينا تحديد وقت المهلة في هذا الوقت يدويًا ، ويتم حل المشكلة. على سبيل المثال:
poolinghttpclientConnectionManager connmanager = new 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.
لم أهتم بهذه المعلمة عندما استخدمتها لأول مرة ، لكنني فقط قمت بتعيين الحد الأقصى لعدد الاتصالات في Moxtotal تجمع الاتصال.
تمثل معلمة DefaultMaxPerRoute بالفعل الحد الأقصى لعدد الاتصالات لكل مسار. على سبيل المثال ، يحتاج نظامك إلى الوصول إلى خدمتين أخريين: Google.com و Bing.com. إذا تم تعيين muxtotal الخاص بك على 100 وتم تعيين DefaultMaxperRoute على 50 ، فيمكن أن يكون الحد الأقصى لعدد الطلبات لكل خدمة 50.
لذلك إذا لم يتم تعيين DefaultMaxperRoute ، تتبع رمز المصدر:
poolinghttpclientConnectionManager (httpclientConnectionOprator httpclientconnection ، httpconnectionfactory النهائي <httproute ، managedHttpClientConnection> connerfactory ، التوصيل الطويلة النهائية ، توطن الوقت النهائي) {sup () ؛ this.configData = جديد configdata () ؛ . this.pool.setValidateafterInactivity (2000) ؛ this.connectionOperator = args.notnull (httpclientConnectionOperator ، "httpclientConnectionOperator") ؛ this.isshutdown = new AtomicBoolean (false) ؛}وقد وجد هنا أن القيمة الافتراضية كانت فقط 2. لا عجب أن تكون هناك دائمًا مهلة في مواقف التزامن عالية في ذلك الوقت ، كان من الواضح أن Muxtotal تم ضبطه بشكل كبير.
لذا ، إذا وصلت الخدمة الخاصة بك إلى العديد من الخدمات الخارجية المختلفة ولديها تزامن كبير ، فيجب عليك تكوين المعلمتين maxtotal و defaultMaxperRoute.
لذلك عندما تستخدم أي أشياء جديدة لاحقًا ، سيكون لديك نظرة جيدة على التكوينات التي لديك. إذا كان لديك أي أسئلة ، فيجب عليك التحقق من ذلك أولاً. لا تنسخ قطعة من الرمز عبر الإنترنت واستخدمها مباشرة. قد يكون الأمر جيدًا في ذلك الوقت ، لكن ربما يتم غشها في المستقبل.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.