sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur använder man Embedded PostgreSQL Server Java-komponenten som en separat tjänst?

Kärnproblemet här är att kunna dela något tillstånd mellan två olika mål för ett plugin:en start mål som skulle starta en process och sedan ett stop mål som skulle döda den. Ett bra sätt att göra det är att använda ContextEnabled gränssnitt som alla mojos implementerar. Den tillhandahåller en getPluginContext() metod som returnerar en (rå) karta, där du kan lagra objekt som ska delas mellan mojos.

Med detta tillvägagångssätt kan du lagra något du skapat i start målet för ett plugin, och få tillbaka det i stop mål. Här är ett minimalistiskt exempel för att visa detta i praktiken, där ett enkelt strängvärde delas mellan mojos.

Konfigurera ett Maven-pluginprojekt . Detta handlar i princip om att ha ett projekt med följande POM, som är standard-POM för en Maven-plugin, med Java 8 och anteckningar för konfiguration:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>sample.plugin</groupId>
  <artifactId>test-maven-plugin</artifactId>
  <version>1.0.0</version>
  <packaging>maven-plugin</packaging>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-plugin-plugin</artifactId>
        <version>3.5</version>
      </plugin>
    </plugins>
  </build>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.3.9</version>
    </dependency>

    <!-- dependencies to annotations -->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

Notera förpackningen av typen maven-plugin som förklarar för Maven att detta är ett plugin-projekt. I det här nya projektet, överväg följande StartMojo :

@Mojo(name = "start", defaultPhase = LifecyclePhase.PRE_INTEGRATION_TEST)
public class StartMojo extends AbstractMojo {

    @SuppressWarnings("unchecked")
    @Override
    public void execute() throws MojoExecutionException {
        getPluginContext().put("myService", new MyService("foo"));
    }

}

Detta deklarerar en ny start mojo som som standard är bunden till pre-integration-test fas. Den hämtar pluginkontexten och lägger in ett nytt objekt i det. I ovanstående är det en enkel anpassad POJO som heter MyService som tar ett värde i sin konstruktor. Detta objekt är mappat till nyckeln "myService" , som fungerar som uppslag.

Då kan vi ha:

@Mojo(name = "stop", defaultPhase = LifecyclePhase.POST_INTEGRATION_TEST)
public class StopMojo extends AbstractMojo {

    @Override
    public void execute() throws MojoExecutionException {
        MyService service = (MyService) getPluginContext().get("myService");
        getLog().info(service.getValue());
    }

}

Detta deklarerar ett nytt stop mojo som som standard är bunden till post-integration-test fas. Den hämtar pluginkontexten, extraherar objektet under nyckeln "myService" , och slutligen få dess värde och logga det.

Efter att ha packat och installerat detta Maven-plugin (med mvn clean install ) i din lokala repo kan du använda den i ett exempelprojekt med

<plugin>
  <groupId>sample.plugin</groupId>
  <artifactId>test-maven-plugin</artifactId>
  <executions>
    <execution>
      <id>sample</id>
      <goals>
        <goal>start</goal>
        <goal>stop</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Om du kör mvn clean verify på det exempelprojektet kommer du att ha "foo" skrivs ut i dina loggar, i post-integration-test fas. Detta visar att värdet var korrekt inställt av start mojo, och sedan korrekt hämtad av stop mojo.

Naturligtvis kan du lagra komplexa objekt i den här kartan, inte bara en String (som det skulle kunna finnas enklare lösningar för). Särskilt kan det vara en värd för din process exempel som du vill stoppa. Du kan bli av med exec-maven-plugin , skapa ett nytt Maven-plugin som innehåller koden du redan har för att ställa in den inbäddade databasen i en start mål, lagra processinstansen i plugin-sammanhanget i detta mål, och slutligen stoppa denna process senare i ett annat stop mojo genom att hämta den från plugin-kontexten.



  1. GROUP BY för kontinuerliga rader i SQL

  2. URL och länktext från databasen

  3. Jämför två arrayer med olika nyckelnamn

  4. MySQL:Ställ in på standardvärde vid uppdatering