머리말
이 기사는 주로 봄에 @scheduled 및 httpclient의 함정을 소개합니다. 우리는 당신의 참조와 학습을 위해 그것들을 공유 할 것입니다. 아래에서 많이 말하지 않겠습니다. 자세한 소개를 함께 살펴 보겠습니다.
나는 한 번 큰 구덩이를 밟았다 :
비즈니스의 특수성으로 인해 많은 시간이 정해진 작업이 정기적으로 실행되고 비즈니스 데이터에 대해 보상됩니다.
스프링 사용 중에 @Scheduled 주석을 사용하여 타이밍 작업을 쉽게 구현할 수 있습니다.
어느 날 아침 나는 갑자기 전날 밤 특정 순간부터 모든 시간이 지남에 따라 모든 시간이 붙어서 달리기를 중단했다는 것을 깨달았습니다.
@scheduledDefault 단일 스레드
조사 후 @Scheduled 주석을 사용하여 기본 구성을 설명하면 모든 작업이 단일 스레드로 실행됩니다. 수면 작업을 작성한 후에는 시간이 오면 다른 모든 작업이 트리거되지 않는다는 것을 쉽게 알 수 있습니다.
멀티 스레딩을 활성화 해야하는 경우 다음 구성을 수행하고 스레드 수를 설정해야합니다.
@ConfigurationPublic Class ScheduleConfig는 SchedulingConfigurer {@override public void configureTasks (scheduledTaskRegistrar taskgregistrar) {taskgreStrar.setScheduler (executors.newscheduledthreadpool (5)); }}이렇게하면 작업이 고정되면 모든 작업이 고정 될 수 있다는 문제가 해결됩니다.
그러나 왜 작업이 고착되어 있습니까?
httpclient 기본 매개 변수 구성
일부 작업은 외부 서비스의 RESTFul 인터페이스를 정기적으로 요청하고 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; 이. RelativeredirectSallowed = true; this.authenticationEnabled = true; 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 매개 변수입니다.
처음 사용했을 때이 매개 변수에주의를 기울이지 않았지만 연결 풀 maxtotal에서 최대 연결 수를 설정했습니다.
DefaultMaxPerroute 매개 변수는 실제로 경로 당 최대 연결 수를 나타냅니다. 예를 들어, 시스템은 Google.com과 Bing.com의 두 가지 다른 서비스에 액세스해야합니다. maxtotal이 100으로 설정되고 DefaultMaxPerroute가 50으로 설정되면 각 서비스에 대한 최대 요청 수는 50이 될 수 있습니다.
따라서 DefaultMaxPerroute가 설정되지 않은 경우 소스 코드를 추적합니다.
public poolinghttpclientConnectionManager (최종 HTTPClientConnectionOperator httpClientConnectionOperator, 최종 HTTPConnectionFactory <httproute, managedHttpclientConnection> 연결, 최종 길이의 시간 시간 단위, 최종 시간대 튜닝) {); this.configdata = new configdata (); // 여기에 사용 된 CPOOL 생성자 메소드, 두 번째 매개 변수는 DefaultMaxPerroute입니다. 기본값은 2입니다. this.pool.setValidatatectterinactivity (2000); this.connectionoperator = args.notnull (httpclientConnectionOperator, "httpclientConnectionOperator"); this.isshutdown = New AtomicBoolean (false);}여기서 기본값은 2에 불과하다는 것이 밝혀졌습니다. 당시 높은 동시성 상황에서 항상 시간 초과가 있었던 것은 놀라운 일이지만, Maxtotal은 분명히 매우 높았습니다.
따라서 서비스가 여러 다른 외부 서비스에 액세스하고 동시성이 큰 경우 두 매개 변수를 maxtotal 및 defaultmaxperroute를 구성해야합니다.
따라서 나중에 새로운 것을 사용하면 어떤 구성이 있는지 잘 살펴볼 것입니다. 궁금한 점이 있으면 먼저 확인해야합니다. 온라인으로 코드를 복사하지 말고 직접 사용하십시오. 그 당시에는 괜찮을지 모르지만 앞으로는 속임수를 낼 것입니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.