Wie verwende ich die eingebettete PostgreSQL Server-Java-Komponente als separaten Dienst?

Ich versuche, eine umfassende Integrationstestsuite für eine RESTful (Services) -Java-basierte Anwendung zu erstellen, die in Tomcat (7.x) ausgeführt wird und von einer Postgresql (9.x) -Instanz abhängt. Des Weiteren möchte ich in der Lage sein, diese Suite als eigenständigen Prozess, nach Möglichkeit ausschließlich von Maven 3.x aus, unter Verwendung des ausfallsicheren Maven-Plugins auszuführen. Auf diese Weise können die Tests auf den drei wichtigsten Plattformen (Mac OSX, Linux und Windows) ausgeführt werden.

ach dem, was ich gelernt habe, glaube ich, dass der Schlüssel dazu in den folgenden Schritten (in dieser Reihenfolge) lieg

Starten Sie eine "eingebettete" Version der postgresql-Datenbank (und richten Sie das Schema ein) in der Pre-Integration-Test-Phase vonmaven Lebenszyklus, dieser postgres-db-Prozess läuft im HintergrundStarte meinen Java Container, der meine Services App lädt: Ich benutze das Jetty 9.1.5 Pluginühren Sie meine (JUnit-basierten) Tests über das Failsafe-Plugin während der Integrations-Testphase auSchalte meinen Jetty-Container in der Post-Integration-Test-Phase von Maven aus. Schließlich haben einige MechanismusHerunterfahre der zuvor gestartete (Hintergrund-) Postgres-DB-Prozess in der Post-Integration-Test-Phase des Lebenszyklus (kill / clean-up this process)

In meiner aktuellen Implementierung werden die Schritte 1 - 3 erfolgreich ausgeführt. In Schritt 2 wird das exec-maven-Plugin verwendet, das eine Java-Klasse aufruft, die das @ verwende in postgresql eingebettete Java-Komponente. Ein Auszug aus der POM.xml:

<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>exec-maven-plugin</artifactId>
  <version>1.2.1</version>
  <executions>
    <execution>
          <id>Run Postgres DB start/schema setup</id>
          <phase>pre-integration-test</phase>
            <goals>
              <goal>java</goal>
            </goals>
      </execution>
    </executions>
    <configuration>
      <mainClass>com.some.package.test.utils.DbSetup</mainClass>
      <arguments>
        <argument>setup</argument>
      </arguments>
    </configuration>
</plugin>

Und hier ist ein Auszug aus der DBSetup-Klasse, die postgresql-embedded verwendet, um eine postgresql-Instanz zu starten:

try {
        DownloadConfigBuilder downloadConfigBuilder = new DownloadConfigBuilder();
        downloadConfigBuilder.defaultsForCommand(Command.Postgres);
        downloadConfigBuilder.proxyFactory(new HttpProxyFactory(PROXY_ADDRESS, DEFAULT_PROXY_PORT));
        IRuntimeConfig runtimeConfig = new RuntimeConfigBuilder()
                .defaults(Command.Postgres)
                .artifactStore(new ArtifactStoreBuilder()
                        .defaults(Command.Postgres)
                        .download(downloadConfigBuilder)).build();  

        PostgresStarter<PostgresExecutable, PostgresProcess> runtime = PostgresStarter.getInstance(runtimeConfig);        
        final PostgresConfig config = new PostgresConfig(Version.V9_2_4, new AbstractPostgresConfig.Net(
                    "localhost", 5432
            ), new AbstractPostgresConfig.Storage(dbName), new AbstractPostgresConfig.Timeout(),
                    new AbstractPostgresConfig.Credentials(username, password));        
        config.getAdditionalInitDbParams().addAll(Arrays.asList(
                "-E", "UTF-8",
                "--locale=en_US.UTF-8",
                "--lc-collate=en_US.UTF-8",
                "--lc-ctype=en_US.UTF-8"
            ));     

        exec = runtime.prepare(config);
        process = exec.start();
        System.out.println("embedded Postgres started");
        Thread.sleep(1200L);

    } catch (IOException e) {
        System.out.println("Something Went Wrong initializing embedded Postgres: " + e);
        e.printStackTrace();
    } 
    catch (InterruptedException e) {
        System.out.println("Something Went Wrong Pausing this thread " + e);
        e.printStackTrace();
    }

Bitte beachten Sie, dass ich nicht anrufeprocess.stop(); innerhalb der Methode, die die Postgres-Instanz startet. Also, ich habe derzeit keine Möglichkeit,Herunterfahre der DB-Prozess. Sobald ich diese Klasse verlassen habeDbSetup, alle Verweise auf diesen vorhandenen Prozess gehen verloren. Und der Postgres-Prozess wird nie beendet. Tatsächlich scheint es so, als würde der Stegcontainer auch nicht heruntergefahren und der gesamte Maven-Job hängt, so dass ich ihn manuell beenden muss (Auszüge aus der Ausgabe meiner Maven-Konsole):

[INFO] --- exec-maven-plugin:1.2.1:java (Run Postgres DB start/schema setup) @ BLAHBLAH ---
***START of Postgres DB Setup Process ***
Extract /Users/myUserName/.embedpostgresql/postgresql-9.2.4-1-osx-binaries.zip START
...................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................Extract /Users/myUserName/.embedpostgresql/postgresql-9.2.4-1-osx-binaries.zip DONE
INFO:20161021 12:58:00: de.flapdoodle.embed.process.runtime.Executable de.flapdoodle.embed.process.runtime.Executable start AbstractPostgresConfig{storage=Storage{dbDir=/var/folders/8g/69wh31fn7nx3q81phwfdpld00000gn/T/postgresql-embed-66cfc41f-0e16-439f-a24b-6e5b6dbc683d/db-content-3bc4b9cc-dd21-43a7-9058-285767f5c53d, dbName='BLAH', isTmpDir=true}, network=Net{host='localhost', port=5432}, timeout=Timeout{startupTimeout=15000}, credentials=Credentials{BLAH, BLAH}, args=[], additionalInitDbParams=[-E, UTF-8, --locale=en_US.UTF-8, --lc-collate=en_US.UTF-8, --lc-ctype=en_US.UTF-8]}
INFO:20161021 12:58:01: de.flapdoodle.embed.process.runtime.Executable de.flapdoodle.embed.process.runtime.Executable start AbstractPostgresConfig{storage=Storage{dbDir=/var/folders/8g/69wh31fn7nx3q81phwfdpld00000gn/T/postgresql-embed-66cfc41f-0e16-439f-a24b-6e5b6dbc683d/db-content-3bc4b9cc-dd21-43a7-9058-285767f5c53d, dbName='BLAH', isTmpDir=true}, network=Net{host='localhost', port=5432}, timeout=Timeout{startupTimeout=15000}, credentials=Credentials{BLAH, BLAH}, args=[BLAH], additionalInitDbParams=[]}
INFO:20161021 12:58:04: de.flapdoodle.embed.process.runtime.Executable de.flapdoodle.embed.process.runtime.Executable start AbstractPostgresConfig{storage=Storage{dbDir=/var/folders/8g/69wh31fn7nx3q81phwfdpld00000gn/T/postgresql-embed-66cfc41f-0e16-439f-a24b-6e5b6dbc683d/db-content-3bc4b9cc-dd21-43a7-9058-285767f5c53d, dbName='BLAH', isTmpDir=true}, network=Net{host='localhost', port=5432}, timeout=Timeout{startupTimeout=15000}, credentials=Credentials{BLAH, BLAH}, args=[], additionalInitDbParams=[-E, UTF-8, --locale=en_US.UTF-8, --lc-collate=en_US.UTF-8, --lc-ctype=en_US.UTF-8]}
embedded Postgres started
***END of Postgres DB Setup Process ***

...

[INFO] --- jetty-maven-plugin:9.1.2.v20140210:run-war (start-jetty) @ BLAH ---
[INFO] Configuring Jetty for project: BlahProject
[INFO] Context path = /
[INFO] Tmp directory = some/path/to/my/webapp/target/tmp
[INFO] Web defaults = org/eclipse/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
[INFO] jetty-9.1.2.v20140210
[INFO] Scanned 1 container path jars, 133 WEB-INF/lib jars, 1 WEB-INF/classes dirs in 1887ms for context o.e.j.m.p.JettyWebAppContext@444942b0{/,file:/some/path/to/my/webapp/,STARTING}{/some/path/to/my/Application-2.3.33+46be96b464dc5b57b2e2e04ce31718a01360e5fb.war}
[INFO] Initializing Spring root WebApplicationContext
INFO:20161021 12:58:27: org.springframework.web.context.ContextLoader org.springframework.web.context.ContextLoader Root WebApplicationContext: initialization started
INFO:20161021 12:58:27: org.springframework.web.context.support.XmlWebApplicationContext org.springframework.context.support.AbstractApplicationContext Refreshing Root WebApplicationContext: startup date [Fri Oct 21 12:58:27 EDT 2016]; root of context hierarchy
INFO:20161021 12:58:27: org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader Loading XML bean definitions from class path resource [spring/app-config.xml]
INFO:20161021 12:58:27: org.springframework.beans.factory.xml.XmlBeanDefinitionReader org.springframework.beans.factory.xml.XmlBeanDefinitionReader Loading XML bean definitions from class path resource [spring/db-config.xml]
INFO:20161021 12:58:28: org.springframework.beans.factory.support.DefaultListableBeanFactory org.springframework.beans.factory.support.DefaultListableBeanFactory Overriding bean definition for bean 'endpointLTERepository': replacing [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]

[INFO] Started ServerConnector@3a8f9130{HTTP/1.1}{0.0.0.0:8080}
[INFO] Started Jetty Server

/ Ende der Maven-Konsolenausgabe

Ich erkenne, dass die in postgresql eingebettete Komponente zum Starten und Herunterfahren einer Postgres-DB-Instanz innerhalb desselben Unit-Tests entwickelt wurde. Ich versuche einen Weg zu finden, es zu benutzen, der weiter geht als der ursprünglich beabsichtigte Anwendungsfall. Grundsätzlich hätte ich gerne ein postgresql-embedded service irgendeine Art, die von einem Maven-Plugin gestartet werden kann und anschließend zum Herunterfahren dieses Postgres-Prozesses verwendet werden kann.

Haben Sie Vorschläge, wie Sie einen solchen Service und / oder ein solches Plugin erstellen oder erstellen können?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage