2012-04-05 9 views
1

Ich habe ein Szenario, wo ich eine CacheRefresh.do-URL von einem HTTP-Client traf. Es erreicht App Server A, A aktualisiert seinen eigenen Cache und sendet dann eine Anforderung (ich verwende URLConnection) an App Server B, um seinen Cache zu aktualisieren. (Ich weiß, es ist ein schlechtes Design, aber wir sind aus Option)HTTP 400-Fehler, wenn Server eine lange http-Anfrage an einen anderen Server auslöst

Nun, wenn meine Anfrage kleinen Cache (kleine Reaktionszeit) ist aufzufrischen, alles sieht gut aus, ich bekomme einen 200

Aber wenn meine Anfrage ist, um großen Cache zu aktualisieren, bekomme ich eine 400.

Server A und B werden auch in diesem Fall aktualisiert, aber warum bekomme ich eine 400 zurück als Antwort? Irgendeine Idee ?

Unten ist der Controller-Code:

@SuppressWarnings("unused") 
public ModelAndView handleRequest(final HttpServletRequest request, final HttpServletResponse response) 
     throws Exception { 

    final long cacheRefreshStartTime = System.currentTimeMillis(); 

    final String action = request.getParameter("action"); 
    // Init to 74 since this is the static length that will be appended. 
    final StringBuffer result = new StringBuffer(74); 
    final String[] cacheKeys = request.getParameterValues("cacheKeys"); 
    String[] cacheElement = request.getParameterValues("cacheElement"); 
    final String refreshByKeyRegion = request.getParameter("refreshByKeyRegion"); 
    final String refreshByKeyRegionKeys = request.getParameter("refreshByKeyRegionKeys"); 
    final String refreshPartnerInstanceCache = request.getParameter("refreshPartnerInstanceCache"); 
    LOG.debug(" cacheKeys for refresh " + Arrays.toString(cacheKeys)); 

    try { 
     if (action.equalsIgnoreCase("ALL")) { 
      performancLogger.info("Cache Refresh requested action=" + action); 
      this.refreshAllCache(); 
     } else if (action.equalsIgnoreCase("SPECIFIC")) { 
      performancLogger.info("Cache Refresh requested action=" + action + " keys=" 
        + Arrays.toString(cacheKeys)); 
      this.refreshSpecificCache(cacheKeys); 
     } else if (action.equalsIgnoreCase("cacheElement")) { 
      if (refreshByKeyRegion != null && refreshByKeyRegion.length() > 0 && refreshByKeyRegionKeys != null 
        && refreshByKeyRegionKeys.length() > 0) { 
       cacheElement = new String[] { refreshByKeyRegion + "," + refreshByKeyRegionKeys }; 
      } 
      performancLogger.info("Cache Refresh requested action=" + action + " element=" 
        + Arrays.toString(cacheElement)); 
      this.refreshCacheElements(cacheElement); 
     } 
     if (!request.getServerName().contains("localhost") && refreshPartnerInstanceCache != null 
       && refreshPartnerInstanceCache.equals("true")) { 
      refreshPartnerInstanceCache(request); 
     } 
     result.append("Cache refresh completed successfully."); 

     if (cacheKeys != null) { 
      result.append(" Keys - "); 
      result.append(this.formatArrayAsString(cacheKeys)); 
     } 
    } catch (final Exception e) { 
     result.append("Cache refresh failed."); 
     if (cacheKeys != null) { 
      result.append(" Keys - "); 
      result.append(this.formatArrayAsString(cacheKeys)); 
     } 
    } 

    if (action != null) { 
     performancLogger.info("Cache Refresh competed total refresh time = " 
       + formatElapsedTime(System.currentTimeMillis() - cacheRefreshStartTime)); 
    } 

    return new ModelAndView(IVRControllerNames.CACHE_REFRESH_STANDARD_VIEW, "displayInfo", this 
      .getDisplayInfo(result)); 
} 

Request-Header:

POST xxxxx.do HTTP/1.1 
Host: xxxxx 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-us,en;q=0.5 
Accept-Encoding: gzip,deflate 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive: 115 
Connection: keep-alive 
Referer: http://xxx/yyy/zzz/cacheView.do 
Cookie: JSESSIONID=xxxxx.x.x 

Anfrage Körper:

Content-Type: application/x-www-form-urlencoded 
Content-Length: 134 
action=SPECIFIC&refreshPartnerInstanceCache=true&cacheKeys=xxxx&cacheKeys=xxx&Refresh=yyyy 

Dank!

+0

könnten Sie einen Code Ihrer Anfrage posten und was AppServer damit tun? –

+0

@ PlínioPantaleão: Code-Snippets oben in der Frage hinzugefügt. Bedenken Sie, wenn ich eine Anfrage nur 2 oder 3 Caches zu aktualisieren, es funktioniert gut. aber wenn ich eine lange Verarbeitung anfordere (zB 7-8 oder mehr Caches). Da bin ich mit diesem Problem konfrontiert. Ich glaube, es hat etwas damit zu tun, dass meine erste Anfrage Timedout oder etwas, nicht sicher? – user620339

Antwort

0

In Ihrer Aktion scheinen Sie mehrere Schlüssel mit dem gleichen Namen zu haben.

action=SPECIFIC&refreshPartnerInstanceCache=true&**cacheKeys**=xxxx&**cacheKeys**=xxx&Refresh=yyyy 

Reinigen Sie es und geben Sie ihnen eindeutige IDs.

Auch scheinen sie nicht urlencodiert werden, was zu Problemen führen kann, wenn Ihre Schlüssel lustige Zeichen enthalten. Siehe How to escape URL-encoded data in POST with HttpWebRequest