2016-06-28 18 views
3

を中断していない私は、次のように定義されたApacheのHTTPクライアントを持っている:Hystrix:ApacheのHTTPクライアント要求が

private static HttpClient httpClient = null; 
HttpParams httpParams = new BasicHttpParams(); 
httpParams.setParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, Boolean.TRUE); 
httpParams.setParameter(CoreProtocolPNames.USER_AGENT, "ABC"); 

HttpConnectionParams.setStaleCheckingEnabled(httpParams, Boolean.TRUE); 

SSLSocketFactory sf = SSLSocketFactory.getSocketFactory(); 

SchemeRegistry schemeRegistry = new SchemeRegistry(); 
schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); 
schemeRegistry.register(new Scheme("https", 443, sf)); 

//Initialize the http connection pooling 
PoolingClientConnectionManager connectionManager = new PoolingClientConnectionManager(schemeRegistry); 

// Initialize the connection parameters for performance tuning 
connectionManager.setMaxTotal(12); 
connectionManager.setDefaultMaxPerRoute(10); 

httpClient = new DefaultHttpClient(connectionManager, httpParams); 

私はhystrixコマンドplayを持っているし、有効に、次のプロパティがあります。

hystrix.command.play.execution.isolation.thread.timeoutInMilliseconds=1 
hystrix.command.play.execution.isolation.thread.interruptOnTimeout=true 

コマンド自体は次のように定義されています:

@HystrixCommand(groupKey="play_group",commandKey="play") 
    public String process(String request) throws UnsupportedOperationException, IOException, InterruptedException { 
     System.out.println("Before - process method : " + request); 
     callHttpClient(request); 
     System.out.println("After - process method" + request); 
     return ""; 
    } 

    private void callHttpClient(String request) throws ClientProtocolException, IOException, InterruptedException { 
     HttpGet get = new HttpGet("http://www.google.co.in"); 
     HttpResponse response = httpClient.execute(get); 
     System.out.println("Response:" + response); 
    } 

これでコマンドを実行しようとしましたループで5回:プロセス方法はHystrixRunTimeExceptionをスローよう

public static void main(String[] args) throws UnsupportedOperationException, IOException, InterruptedException { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContextTest.xml"); 
     HystrixPlayground obj = ctx.getBean(HystrixPlayground.class); 

     long t1 = System.currentTimeMillis(); 
     for (int i = 0; i < 5; i++) { 
      try{ 
       System.out.println(obj.process("test" + i)); 
      } catch(Exception ex) { 
       System.out.println(ex); 
      } 
      long t2 = System.currentTimeMillis(); 
      System.out.println("Time(ms) : ---->" + (t2 - t1)); 

タイムアウトは、1ミリ秒に設定されています。ただし、http要求は実行され続け、 "後処理メソッド"文字列を出力します。

この動作は、httpクライアントの要求に対してのみ一貫して見られました。 http要求がスレッドスリープや非常に大きなforループのようなものに置き換えられた場合、hystrixスレッドは期待どおりに中断されます。

これはなぜ起こっているのか、誰にも分かりませんか?

+0

https://stackoverflow.com/questions/20693335/how-can-i-catch-interruptedexception-when-making-http-request-with-apacheを参照してください。 –

答えて

2

なぜなら、Javaでスレッドを中断しても強制停止しないからです。代わりに、Thread.interrupt()を呼び出すだけで、実行可能なスレッドによって解釈される必要があるが、解釈する必要はないフラグを設定します。詳細はこちら:What does java.lang.Thread.interrupt() do?

Apache HTTPクライアントはこのフラグを解釈しません。したがって、HTTP要求は取り消されず、完了します。

関連する問題