2012-04-05 15 views
1

HTTPクライアントからcacheRefresh.do URLを取得するシナリオがあります。 これは、App Server Aに到達し、Aは独自のキャッシュをリフレッシュしてから、キャッシュをリフレッシュするためにリクエストを(私はURLConnectionを使用して)App Server Bに送信します。私の要求は、リフレッシュ小さなキャッシュ(小さな応答時間)であるときサーバーが長いHTTPリクエストを別のサーバーに送信するとHTTP 400エラーが発生する

は今、すべては私が200

しかし、ときに私の要求を取得し、正常に見える(私はその悪いデザインを知っているが、我々は選択肢から外れています)大容量のキャッシュをリフレッシュする場合は、400が返されます。

この場合もサーバAとBはリフレッシュされますが、なぜ400が返されますか?何か案が ?以下は

コントローラのコードです:

@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)); 
} 

要求ヘッダー:

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 

リクエストボディ:

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

ありがとう!

+0

あなたのリクエストのコードをいくつか投稿してください。また、AppServersはそれをどうしたらいいですか? –

+0

@PlínioPantaleão:質問の上に追加されたコードスニペットを書き留めておきます.2または3のキャッシュをリフレッシュするようにリクエストすると、うまく動作します。私は長い処理(リフレッシュ7-8以上のキャッシュのような)を要求する場合。それが私がこの問題に直面しているときです。私はそれがタイムアウトや何かを得る私の最初の要求と関係があると信じていますか? – user620339

答えて

0

あなたのアクションでは、同じ名前の複数のキーがあるようです。

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

クリーンアップして一意のIDを付けます。

また、あなたのキーに面白い文字が含まれていると問題を引き起こす可能性のあるURLエンコードされていないようです。 How to escape URL-encoded data in POST with HttpWebRequest

関連する問題