sql >> Database >  >> RDS >> PostgreSQL

Hoe gebruik ik de Embedded PostgreSQL Server Java-component als een aparte service?

Het kernprobleem hier is om een ​​staat te kunnen delen tussen twee verschillende doelen van een plug-in:een start doel dat een proces zou starten, en dan een stop doel dat het zou doden. Een goede manier om dat te doen is door gebruik te maken van de ContextEnabled interface die alle mojo's implementeren. Het biedt een getPluginContext() methode die een (onbewerkte) kaart retourneert, waarin je objecten kunt opslaan om te delen tussen mojo's.

Met deze aanpak kun je iets dat je hebt gemaakt opslaan in de start doel van een plug-in, en krijg het terug in de stop doel. Hier is een minimalistisch voorbeeld om dit in actie te laten zien, waarbij een eenvoudige String-waarde wordt gedeeld tussen mojo's.

Een Maven-plug-inproject opzetten . Dit komt in feite neer op het hebben van een project met de volgende POM, de standaard POM voor een Maven-plug-in, met Java 8 en annotaties voor configuratie:

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

Let op de verpakking van het type maven-plugin die aan Maven verklaart dat dit een plug-inproject is. Overweeg in dit nieuwe project de volgende 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"));
    }

}

Dit verklaart een nieuwe start mojo die standaard is gebonden aan de pre-integration-test fase. Het haalt de plug-in-context op en plaatst er een nieuw object in. In het bovenstaande is het een eenvoudige aangepaste POJO genaamd MyService die een waarde in zijn constructor neemt. Dit object is toegewezen aan een sleutel van "myService" , die als opzoekfunctie dient.

Dan kunnen we hebben:

@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());
    }

}

Dit is het declareren van een nieuwe stop mojo die standaard is gebonden aan de post-integration-test fase. Het haalt de plug-in-context op, extraheert het object onder de sleutel "myService" , en krijg uiteindelijk de waarde en logt deze.

Na het inpakken en installeren van deze Maven-plug-in (met mvn clean install ) in uw lokale opslagplaats, kunt u het gebruiken in een voorbeeldproject met

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

Als u mvn clean verify . uitvoert op dat voorbeeldproject krijg je uiteindelijk "foo" afgedrukt in uw logboeken, in de post-integration-test fase. Dit geeft aan dat de waarde correct is ingesteld door de start mojo, en vervolgens correct opgehaald door de stop mojo.

Natuurlijk kun je complexe objecten op deze kaart opslaan, niet alleen een String (waarvoor er meer eenvoudige oplossingen zouden kunnen zijn). Het kan met name een host zijn voor uw process voorbeeld dat u wilt stoppen. U kunt de exec-maven-plugin . verwijderen , maak een nieuwe Maven-plug-in met de code die u al hebt om de ingesloten database in een start in te stellen doel, sla de procesinstantie op in de plug-incontext in dit doel en stop dit proces later in een andere stop mojo door het op te halen uit de plug-in-context.



  1. SQL JOIN twee tabellen met AVG

  2. Hoe json-array te converteren naar postgres int-array in postgres 9.3

  3. Hoe retourneer ik een set resultaten uit een queryvenster in Oracle SQL Developer?

  4. Klasse 'mysqli_connect' niet gevonden