
com.redis.spring.batch.writer.ReplicaWait Maven / Gradle / Ivy
package com.redis.spring.batch.writer;
import java.text.MessageFormat;
import java.time.Duration;
import java.util.List;
import io.lettuce.core.RedisCommandExecutionException;
import io.lettuce.core.RedisFuture;
import io.lettuce.core.api.async.BaseRedisAsyncCommands;
import io.lettuce.core.cluster.PipelinedRedisFuture;
public class ReplicaWait implements WriteOperation {
private final WriteOperation delegate;
private final int replicas;
private final long timeout;
public ReplicaWait(WriteOperation delegate, int replicas, Duration timeout) {
this.delegate = delegate;
this.replicas = replicas;
this.timeout = timeout.toMillis();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void execute(BaseRedisAsyncCommands commands, Iterable extends T> items,
List> outputs) {
delegate.execute(commands, items, outputs);
RedisFuture waitFuture = commands.waitForReplication(replicas, timeout);
outputs.add((RedisFuture) new PipelinedRedisFuture<>(waitFuture.thenAccept(this::checkReplicas)));
}
private void checkReplicas(Long actual) {
if (actual == null || actual < replicas) {
throw new RedisCommandExecutionException(errorMessage(actual));
}
}
private String errorMessage(Long actual) {
return MessageFormat.format("Insufficient replication level ({0}/{1})", actual, replicas);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy