@Service クラスで @Async としてマークされたメソッドがあります。これは Future 型を返します。
このメソッドは基本的に、別の URL (ここでは URL としてマークされています) でサービスを呼び出すクライアントとして機能します。
@Async
public Future<Object> performOperation(String requestString) throws InterruptedException {
Client client = null;
WebResource webResource = null;
ClientResponse response = null;
String results = null;
try {
client=Client.create();
webResource = client.resource(URL);
client.setConnectTimeout(10000);
client.setReadTimeout(10000);
response = webResource.type("application/xml").post(ClientResponse.class,requestString);
if(response.getStatus()!=200) {
webResource=null;
logger.error("request failed with HTTP Status: " + response.getStatus());
throw new RuntimeException("request failed with HTTP Status: " + response.getStatus());
}
results=response.getEntity(String.class);
} finally {
client.destroy();
webResource=null;
}
return new AsyncResult<>(results);
}
この @Async メソッドを次の形式の非同期 @HystrixCommand メソッドに変換したいと考えています。
@HystrixCommand
public Future<Object> performOperation(String requestString) throws InterruptedException {
return new AsyncResult<Object>() {
@Override
public Product invoke() {
...
return results;
}
};
}
しかし、これを行うと、コードに次のエラーがスローされます。
return new AsyncResult<Object>() {...}
それが言う行のために
コンストラクタ AsyncResult() は未定義です。
Eclipse にエラーを修正するように依頼すると、requestString
Object がコンストラクター パラメーターに追加されます。AsyncResult<Object>(requestString)
また、メソッド@Override
からを削除するように求められます。invoke()
その言う
タイプ new AsyncResult(){} のメソッド invoke() は、スーパータイプ メソッドをオーバーライドまたは実装する必要があります。
しかし、Eclipseにエラーを修正するように依頼すると、@Override
私の質問は、これらの問題なしで @Async メソッドを非同期 @HystrixCommand メソッドにするにはどうすればよいですか?
また、応答ステータス コードが 200 でない場合にユーザーにデフォルト メッセージを表示する、このメソッドの非同期フォールバックを実装したいと思います。
どうすればこれを行うことができますか?
ありがとうございました。