Skip to content

Commit 4e4d502

Browse files
Added property registerShutdownHook to EmbeddedPostgres. Default the shutdownHook is registered. When this property is set to false no shutdown hook is registered. This makes it possible to create a spring bean of EmbeddedPostgres and let spring handle the shutdown of the EmbeddedPostgres instance in the right order and let the application shutdown gracefully
1 parent 2e36550 commit 4e4d502

1 file changed

Lines changed: 18 additions & 7 deletions

File tree

src/main/java/io/zonky/test/db/postgres/embedded/EmbeddedPostgres.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -106,26 +106,28 @@ public class EmbeddedPostgres implements Closeable
106106
private volatile FileOutputStream lockStream;
107107
private volatile FileLock lock;
108108
private final boolean cleanDataDirectory;
109+
private final boolean registerShutdownHook;
109110

110111
private final ProcessBuilder.Redirect errorRedirector;
111112
private final ProcessBuilder.Redirect outputRedirector;
112113
private final Process process;
113114

114-
EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory,
115+
EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory, boolean registerShutdownHook,
115116
Map<String, String> postgresConfig, Map<String, String> localeConfig, int port, Map<String, String> connectConfig,
116117
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector, ProcessBuilder.Redirect outputRedirector) throws IOException
117118
{
118-
this(parentDirectory, dataDirectory, cleanDataDirectory, postgresConfig, localeConfig, port, connectConfig,
119+
this(parentDirectory, dataDirectory, cleanDataDirectory, registerShutdownHook, postgresConfig, localeConfig, port, connectConfig,
119120
pgBinaryResolver, errorRedirector, outputRedirector, DEFAULT_PG_STARTUP_WAIT, null, null);
120121
}
121122

122-
EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory,
123+
EmbeddedPostgres(File parentDirectory, File dataDirectory, boolean cleanDataDirectory, boolean registerShutdownHook,
123124
Map<String, String> postgresConfig, Map<String, String> localeConfig, int port, Map<String, String> connectConfig,
124125
PgBinaryResolver pgBinaryResolver, ProcessBuilder.Redirect errorRedirector,
125126
ProcessBuilder.Redirect outputRedirector, Duration pgStartupWait,
126127
File overrideWorkingDirectory, Consumer<File> dataDirectoryCustomizer) throws IOException
127128
{
128129
this.cleanDataDirectory = cleanDataDirectory;
130+
this.registerShutdownHook = registerShutdownHook;
129131
this.postgresConfig = new HashMap<>(postgresConfig);
130132
this.localeConfig = new HashMap<>(localeConfig);
131133
this.connectConfig = new HashMap<>(connectConfig);
@@ -291,7 +293,9 @@ private Process startPostmaster() throws IOException
291293

292294
LOG.info("{} postmaster started as {} on port {}. Waiting up to {} for server startup to finish.", instanceId, postmaster.toString(), port, pgStartupWait);
293295

294-
Runtime.getRuntime().addShutdownHook(newCloserThread());
296+
if (registerShutdownHook) {
297+
Runtime.getRuntime().addShutdownHook(newCloserThread());
298+
}
295299

296300
waitForServerStartup(watch);
297301
return postmaster;
@@ -503,6 +507,7 @@ public static class Builder
503507
private final Map<String, String> config = new HashMap<>();
504508
private final Map<String, String> localeConfig = new HashMap<>();
505509
private boolean builderCleanDataDirectory = true;
510+
private boolean builderRegisterShutdownHook = true;
506511
private int builderPort = 0;
507512
private final Map<String, String> connectConfig = new HashMap<>();
508513
private PgBinaryResolver pgBinaryResolver = DefaultPostgresBinaryResolver.INSTANCE;
@@ -532,6 +537,11 @@ public Builder setCleanDataDirectory(boolean cleanDataDirectory) {
532537
return this;
533538
}
534539

540+
public Builder setRegisterShutdownHook(boolean registerShutdownHook) {
541+
builderRegisterShutdownHook = registerShutdownHook;
542+
return this;
543+
}
544+
535545
public Builder setDataDirectory(Path path) {
536546
return setDataDirectory(path.toFile());
537547
}
@@ -599,8 +609,8 @@ public EmbeddedPostgres start() throws IOException {
599609
if (builderDataDirectory == null) {
600610
builderDataDirectory = Files.createTempDirectory("epg").toFile();
601611
}
602-
return new EmbeddedPostgres(parentDirectory, builderDataDirectory, builderCleanDataDirectory, config,
603-
localeConfig, builderPort, connectConfig, pgBinaryResolver, errRedirector, outRedirector,
612+
return new EmbeddedPostgres(parentDirectory, builderDataDirectory, builderCleanDataDirectory, builderRegisterShutdownHook,
613+
config, localeConfig, builderPort, connectConfig, pgBinaryResolver, errRedirector, outRedirector,
604614
pgStartupWait, overrideWorkingDirectory, dataDirectoryCustomizer);
605615
}
606616

@@ -614,6 +624,7 @@ public boolean equals(Object o) {
614624
}
615625
Builder builder = (Builder) o;
616626
return builderCleanDataDirectory == builder.builderCleanDataDirectory &&
627+
builderRegisterShutdownHook == builder.builderRegisterShutdownHook &&
617628
builderPort == builder.builderPort &&
618629
Objects.equals(parentDirectory, builder.parentDirectory) &&
619630
Objects.equals(builderDataDirectory, builder.builderDataDirectory) &&
@@ -630,7 +641,7 @@ public boolean equals(Object o) {
630641

631642
@Override
632643
public int hashCode() {
633-
return Objects.hash(parentDirectory, builderDataDirectory, config, localeConfig, builderCleanDataDirectory, builderPort, connectConfig, pgBinaryResolver, pgStartupWait, errRedirector, outRedirector);
644+
return Objects.hash(parentDirectory, builderDataDirectory, config, localeConfig, builderCleanDataDirectory, builderRegisterShutdownHook, builderPort, connectConfig, pgBinaryResolver, pgStartupWait, errRedirector, outRedirector);
634645
}
635646
}
636647

0 commit comments

Comments
 (0)