redis.embedded.AbstractRedisInstance Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of embedded-redis Show documentation
Show all versions of embedded-redis Show documentation
Redis embedded server for Java integration testing.
Project forked from https://github.com/kstyrc/embedded-redis
The newest version!
package redis.embedded;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import redis.embedded.exceptions.EmbeddedRedisException;
import java.io.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
abstract class AbstractRedisInstance implements Redis {
private static Log log = LogFactory.getLog(AbstractRedisInstance.class);
protected List args = Collections.emptyList();
private volatile boolean active = false;
private Process redisProcess;
private final int port;
private ExecutorService executor;
protected AbstractRedisInstance(int port) {
this.port = port;
}
public boolean isActive() {
return active;
}
public synchronized void start() throws EmbeddedRedisException {
if (active) {
throw new EmbeddedRedisException("This redis server instance is already running...");
}
try {
redisProcess = createRedisProcessBuilder().start();
installExitHook();
logErrors();
awaitRedisServerReady();
active = true;
} catch (IOException e) {
throw new EmbeddedRedisException("Failed to start Redis instance", e);
}
}
private void installExitHook() {
Runtime.getRuntime().addShutdownHook(new Thread(this::stop, "RedisInstanceCleaner"));
}
private void logErrors() {
final InputStream errorStream = redisProcess.getErrorStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(errorStream));
Runnable printReaderTask = new PrintReaderRunnable(reader);
executor = Executors.newSingleThreadExecutor();
executor.submit(printReaderTask);
}
private void awaitRedisServerReady() throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(redisProcess.getInputStream()));
try {
StringBuffer outputStringBuffer = new StringBuffer();
String outputLine;
do {
outputLine = reader.readLine();
if (outputLine == null) {
//Something goes wrong. Stream is ended before server was activated.
throw new RuntimeException("Can't start redis server. Check logs for details. Redis process log: " + outputStringBuffer.toString());
} else {
outputStringBuffer.append("\n");
outputStringBuffer.append(outputLine);
}
} while (!outputLine.matches(redisReadyPattern()));
} finally {
IOUtils.closeQuietly(reader);
}
}
protected abstract String redisReadyPattern();
private ProcessBuilder createRedisProcessBuilder() {
File executable = new File(args.get(0));
ProcessBuilder pb = new ProcessBuilder(args);
pb.directory(executable.getParentFile());
return pb;
}
public synchronized void stop() throws EmbeddedRedisException {
if (active) {
log.info("Stopping redis server...");
if (executor != null && !executor.isShutdown()) {
executor.shutdown();
}
redisProcess.destroy();
tryWaitFor();
log.info("Redis exited");
active = false;
}
}
private void tryWaitFor() {
try {
redisProcess.waitFor();
} catch (InterruptedException e) {
throw new EmbeddedRedisException("Failed to stop redis instance", e);
}
}
public List ports() {
return Arrays.asList(port);
}
private static class PrintReaderRunnable implements Runnable {
private final BufferedReader reader;
private PrintReaderRunnable(BufferedReader reader) {
this.reader = reader;
}
public void run() {
try {
readLines();
} finally {
IOUtils.closeQuietly(reader);
}
}
public void readLines() {
try {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy