2014-11-05 12 views
5

kabul ettiğimizde yük artar:Bahar DİNLENME şablon biz Spring'in DİNLENME şablonu için günlükleri bu tür görmeye başlamak, bizim DİNLENME hizmetlerden biri bazı yük testi sırasında başlıklarını

eşzamanlı yük altında

ve 3-4 saat sonra, http isteğinin kabul başlık RestTemplate DİNLENME hizmeti çağrıldığını

aşağıdaki giriş olarak bir string kabul eder ve sahip 400 Hata (Bad Request) başarısız başlatın kullanarak bu hizmete

DEBUG: org.springframework.web.client.RestTemplate - Setting request Accept header to [text/plain, application/json, application/*+json, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain, text/plain,<and so on>, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, */*, <and so on>] 

Sonunda tüm çağrıları olur imza

@RequestMapping(value = "/findRecordById", method = {RequestMethod.POST, RequestMethod.GET }) 
@ResponseBody 
public String findRecordById(@RequestBody String id) {//method body} 

Biz Ör "SomeID" formunun istek içeriği ile bu servise taleplerin POST türünü gönderiyor "123"

Hafif yük altında, servisi aramada sorun yoktur.

Kafa karıştırıcı, REST şablonunun kabul başlıklarının listesine eklenmeye devam eden text/plain, */*. Bu neden oluyor?

DİNLENME şablon fasulye beyanı şu şekildedir:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate"> 
     <constructor-arg> 
      <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory"> 
       <property name="readTimeout"> 
        <value>90000</value> 
       </property> 
       <property name="httpClient" ref="restHttpClient" /> 
      </bean> 
     </constructor-arg> 
    </bean> 

    <bean id="restHttpClient" class="org.apache.http.impl.client.DefaultHttpClient"> 
      <constructor-arg> 
      <bean class="org.apache.http.impl.conn.PoolingClientConnectionManager"> 
       <property name="defaultMaxPerRoute"> 
        <value>100000</value> 
       </property> 
       <property name="maxTotal"> 
        <value>100000</value> 
       </property>     

      </bean> 
      </constructor-arg> 
    </bean> 

istek oluşturulurken nasıl

String postParams = "\"" + id + "\""; 

String postResp = restTemplate.postForObject("findRecordById",postParams, String.class); 
+1

bize 'RestTemplate' ile yapmak bir isteğin bir örnek gösterin lütfen .. –

+0

nasıl bir göstermek için soru Düzenlendi istek yapıldı –

+0

Yani 'restTemplate' doğrudan 'ApplicationContext' üzerinden ekstra bir değişiklik yapmadan? Ve yukarıdaki gibi tonlarca talep gönderir misin? –

cevap

0

Bunu deneyin misiniz:

restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 

String postParams = "\"" + id + "\""; 

String postResp = restTemplate.postForObject("findRecordById",postParams, String.class); 
+0

çalışmasını hizmetlerini durduran, eklenen. Böyle görünmüyor, bu soruna neden olabilir. –

0

metin/düz String ve RestTemplate okumaya çalıştığınız için eklenir, r için dönüştürücü olarak StringHttpMessageConverter bulundu Equest ve StringHttpMessageConverter için desteklenen ortam türü metin/düz.

Bu RestTemplate yönteminde de gördüğünüz gibi. Biz dinlenme şablonunda için her zamanki fasulye tanımı vardı : Herkes nedeniyle tekrarlanan metnin buraya gelen durumunda

public void doWithRequest(ClientHttpRequest request) throws IOException { 
      if (responseType != null) { 
       List<MediaType> allSupportedMediaTypes = new ArrayList<MediaType>(); 
       for (HttpMessageConverter<?> messageConverter : getMessageConverters()) { 
        if (messageConverter.canRead(responseType, null)) { 
         List<MediaType> supportedMediaTypes = messageConverter.getSupportedMediaTypes(); 
         for (MediaType supportedMediaType : supportedMediaTypes) { 
          if (supportedMediaType.getCharSet() != null) { 
           supportedMediaType = 
             new MediaType(supportedMediaType.getType(), supportedMediaType.getSubtype()); 
          } 
          allSupportedMediaTypes.add(supportedMediaType); 
         } 
        } 
       } 
       if (!allSupportedMediaTypes.isEmpty()) { 
        MediaType.sortBySpecificity(allSupportedMediaTypes); 
        if (logger.isDebugEnabled()) { 
         logger.debug("Setting request Accept header to " + allSupportedMediaTypes); 
        } 
        request.getHeaders().setAccept(allSupportedMediaTypes); 
       } 
      } 
     } 
    } 
1

/düz afiş vardı başlık sorunu kabul edin ben ne olduğunu var burada aynı şeyi yaşadı ve

<beans:bean id="myRestTemplate" class="com.mypackage.MyClass"> 
     <beans:property name="requestFactoryNonSSL" ref="restTemplateNonSSLRequestFactory"/> 
     <beans:property name="requestFactorySSL" ref="restTemplateNonSSLRequestFactory"/> 
     <beans:property name="messageConverters"> 
      <beans:list> 
       <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"> 
        <beans:property name="supportedMediaTypes"> 
         <beans:list> 
          <beans:value>application/json;charset=UTF-8</beans:value> 
         </beans:list> 
        </beans:property> 
       </beans:bean>   
      </beans:list> 
     </beans:property> 
    </beans:bean> 

Ancak kaynak kodunda da açıkça kullanarak StringHttpMessageConverter ekleyerek edildi içinde:

biz (bu bahar-fasulye 4,0 içindir) şöyle uygulama/json için bir mesaj dönüştürücü belirtilen servlet-context.xml
restTemplate.getMessageConverters().add(new StringHttpMessageConverter()); 

Ancak bu iletiConverter listesi, her istekte kendisine yeni bir StringHttpMessageConverter örneği ekliyordu. Her bir istek için Bahar bu mesaj dönüştürücü listesinden geçer ve ilgili Kabul başlığını ekler (metin/düz). Bu kadar çok talep sonrasında, başlık uzunluğunun büyümesi o kadar büyük olur ki, aradığınız sunucu konteyneri tarafından reddedilir. Bunu düzeltmenin en basit yolu, yalnızca textlet-context.xml dosyasındaki text/plain öğesini supportedMediaTypes olarak belirtmek ve yukarıdaki satırı kodda kaldırmaktı. Bunu yapamazsanız, StringHttpMessageConverter'ın restTemplate örneğine art arda eklenmediğinden emin olmak için kodda bir onay koymanız gerekir.İşte

metinle servlet-context.xml var/düz supportedMediaType ekledi:

<beans:bean id="myRestTemplate" class="com.mypackage.MyClass"> 
     <beans:property name="requestFactoryNonSSL" ref="restTemplateNonSSLRequestFactory"/> 
     <beans:property name="requestFactorySSL" ref="restTemplateNonSSLRequestFactory"/> 
     <beans:property name="messageConverters"> 
      <beans:list> 
       <beans:bean class="org.springframework.http.converter.StringHttpMessageConverter"> 
        <beans:property name="supportedMediaTypes"> 
         <beans:list> 
          <beans:value>application/json;charset=UTF-8</beans:value> 
          <beans:value>text/plain</beans:value> 
         </beans:list> 
        </beans:property> 
       </beans:bean>   
      </beans:list> 
     </beans:property> 
    </beans:bean> 
İlgili konular