Предисловие
Эта статья в основном представляет подводные камни @Schedulal и HttpClient весной. Мы поделимся ими на вашу ссылку и обучение. Я не скажу многое ниже, давайте посмотрим на подробное введение вместе.
Однажды я наступил на большую яму:
Из -за особенности бизнеса многие задачи по времени будут регулярно выполняться и компенсировать бизнес -данные.
В течение весеннего использования мы можем использовать аннотацию @ScheduLED, чтобы легко реализовать задачи по времени.
Однажды утром я внезапно понял, что с определенного момента накануне вечером все задачи по времени застряли и перестали бежать.
@Schedulededdefault отдельный поток
После расследования было обнаружено, что если мы используем @Scheduled Annotation для объяснения конфигурации по умолчанию, все задачи будут выполняться одним потоком. После написания испытательной задачи для сна легко обнаружить, что все другие задачи не запускаются, когда придет время.
Если вам нужно включить многопоточное, вам нужно выполнить следующую конфигурацию и установить количество потоков:
@ConfigurationPublic Class ScheduleConfig реализует PradulingConfigurer {@Override public void configureTasks (PredulledTaskRegistrar TaskRegistrar) {TaskRegistrar.SetScheduler (resectors.newschedudThreadpool (5)); }}Это решает проблему, что, если задача застряла, это приведет к застрятельному застенчивому.
Но почему застряли задачи?
Httpclient по умолчанию конфигурация параметров по умолчанию
Оказывается, некоторые задачи будут регулярно запрашивать интерфейс RESTFUL внешних служб, а конфигурация 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 () .setDeftRequestConfig (defaultRequestConfig) .SetConnectionManager (connmanager) .build ();
Напомнить о другой проблеме
Фактически, другая проблема конфигурации, возникающая во время использования HTTPClient, которая является параметром DefaultMaxPerroute.
Я не обращал внимания на этот параметр, когда впервые использовал его, но я просто установил максимальное количество соединений в пуле соединений Maxtotal.
Параметр DefaultMaxPerroute фактически представляет максимальное количество соединений на маршрут. Например, вашей системе необходимо получить доступ к двум другим сервисам: Google.com и Bing.com. Если ваш Maxtotal установлен на 100, а DefaultMaxPerroute установлен на 50, то максимальное количество запросов для каждой службы может составлять 50.
Так что, если DefaultMaxPerroute не установлен, отслеживайте исходный код:
Public BoolinghttpclientConnectionManager (Final HttpClientConnectionoperator httpclientConnectionoperator, Final httpConnectionFactory <httproute, ManagedhttpclientConnection> contactfortory, final Long TimeTolive, Final TimeUnit tunit) {Super (); this.configdata = new configdata (); // метод конструктора CPOOL, используемый здесь, второй параметр - defaultmaxPerroute, который по умолчанию составляет 2. this.pool = новый cpool (новый InternalConnectionFactory (this.configdata, contactfactory), 2, 20, timetolive, tunit); this.pool.setValidateableteerInactivity (2000); this.connectionoperator = args.notnull (httpclientconnectionoperator, "httpclientConnectionoperator"); this.isshutdown = new Atomicboolean (false);}Здесь было обнаружено, что значение по умолчанию было только 2. Неудивительно, что в то время всегда был тайм -аут в ситуациях с высоким параллелизмом, Макстотал был явно подставлен очень высоко.
Таким образом, если ваша служба обращается к множеству различных внешних служб и имеет большой параллелизм, необходимо настроить два параметра Maxtotal и Defaultmaxperroute.
Поэтому, когда вы используете какие -либо новые вещи позже, вы будете хорошо взглянуть на то, какие у вас есть конфигурации. Если у вас есть какие -либо вопросы, вы должны сначала проверить это. Не копируйте кусок кода онлайн и используйте его напрямую. В то время это может быть хорошо, но, возможно, в будущем меня обманут.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.