を中断していない私は、次のように定義された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スレッドは期待どおりに中断されます。
これはなぜ起こっているのか、誰にも分かりませんか?
https://stackoverflow.com/questions/20693335/how-can-i-catch-interruptedexception-when-making-http-request-with-apacheを参照してください。 –