0

@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 にエラーを修正するように依頼すると、requestStringObject がコンストラクター パラメーターに追加されます。AsyncResult<Object>(requestString)

また、メソッド@Overrideからを削除するように求められます。invoke()

その言う

タイプ new AsyncResult(){} のメソッド invoke() は、スーパータイプ メソッドをオーバーライドまたは実装する必要があります。

しかし、Eclipseにエラーを修正するように依頼すると、@Override

私の質問は、これらの問題なしで @Async メソッドを非同期 @HystrixCommand メソッドにするにはどうすればよいですか?

また、応答ステータス コードが 200 でない場合にユーザーにデフォルト メッセージを表示する、このメソッドの非同期フォールバックを実装したいと思います。

どうすればこれを行うことができますか?

ありがとうございました。

4

1 に答える 1