私は関数型プログラミング(とJava)を初めて使いました。それを使って素敵なものを作りたいと思います。機能インタフェースを使用して1回再試行してください
私はBiConsumer(java.util.function.BiConsumer)を使用してサーバーへの呼び出しを行っています。
既存のデータ(パブリックcreateSomeTask()を呼び出す)を使用してサーバーにリクエストを送信するコードを作成しようとしていますが、失敗した場合のみ、コネクタは再試行を1回しか実行しません。
コードは非同期ですが、privateのcreateSomeTask()もupdateTaskStage()を呼び出します。
問題は、現在の実装では、多くのcreateSomeTask()が で、コードがうまく表示されず、機能的なインターフェイスを使用したり、機能を拡張したりする方法があると確信しています。 BiConsumerまたはJava 8のlile、リフレクション、メソッド呼び出しなどの他の良い方法
以下のコードを参照してください。 誰かが私を助けてくれることを願っています。
//Main
public class Main {
public static void main(String[] args) throws InterruptedException {
Connector connector = new Connector();
connector.createSomeTask("started",(response, error)->{
});
}
}
//Connector Class
import java.util.function.BiConsumer;
public class Connector {
static String taskStage = null;
public void createSomeTask(final String taskName,
final BiConsumer<ServerResponse, ServerError> consumer) {
createSomeTask(taskName, true, consumer);
}
private void createSomeTask(final String taskName,
boolean retry,
final BiConsumer<ServerResponse, ServerError> consumer) {
updateTaskStage((newStage, error)->{
if(error!=null) {
if (retry) {
createSomeTask(taskName, false, consumer); //The 'recursive' retry call
return;
} else {
consumer.accept(null, error);//only after second failure
return;
}
}
consumer.accept(new ServerResponse(),null);
});
}
//re-uses existing task or starting a new one when the current is null/failed
private void updateTaskStage(final BiConsumer<String, ServerError> consumer) {
if(taskStage ==null || taskStage != "failed")
consumer.accept(taskStage,null);
else
{
taskStage = "started";
consumer.accept(taskStage,null);
}
}
class ServerResponse{}
class ServerError{}
}
あなたのコードはすでにBiConsumer(関数インタフェース)、ラムダ式を使用していますので、何をしたいのですか?いくつかの非同期ソリューションを探しているなら、私はCompletableFuture –
はい、しかし、ここでの問題は "再試行"パラメータがtrueまたはfalseに設定された醜い再帰呼び出しです。 BiConsumerを拡張して、おそらく最初のコンシューマを自動的に呼び出されるフィールドとして追加する方法を探しています – Igal