All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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 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