PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment utiliser le composant Java Embedded PostgreSQL Server en tant que service distinct ?

Le problème central ici est de pouvoir partager un état entre deux objectifs différents d'un plugin :un start goal qui lancerait un processus, puis un stop but qui le tuerait. Une bonne façon de le faire est d'utiliser le ContextEnabled interface que tous les mojos implémentent. Il fournit un getPluginContext() méthode qui renvoie une carte (brute), dans laquelle vous pouvez stocker des objets à partager entre mojos.

Avec cette approche, vous pouvez stocker quelque chose que vous avez créé dans le start objectif d'un plugin, et le récupérer dans le stop objectif. Voici un exemple minimaliste pour montrer cela en action, où une simple valeur String est partagée entre les mojos.

Configurer un projet de plugin Maven . Cela revient essentiellement à avoir un projet avec le POM suivant, qui est le POM standard pour un plugin Maven, utilisant Java 8 et des annotations pour la configuration :

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

Notez le packaging de type maven-plugin qui déclare à Maven qu'il s'agit d'un projet de plugin. Dans ce nouveau projet, considérez le suivant 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"));
    }

}

Ceci déclare un nouveau start mojo qui est lié par défaut au pre-integration-test phase. Il récupère le contexte du plugin et y place un nouvel objet. Dans ce qui précède, il s'agit d'un simple POJO personnalisé appelé MyService qui prend une valeur dans son constructeur. Cet objet est mappé à une clé de "myService" , qui sert de recherche.

Alors, on peut avoir :

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

}

Ceci déclare un nouveau stop mojo qui est lié par défaut au post-integration-test phase. Il récupère le contexte du plugin, extrait l'objet sous la clé "myService" , et enfin obtenir sa valeur et l'enregistrer.

Après avoir empaqueté et installé ce plugin Maven (avec mvn clean install ) dans votre référentiel local, vous pouvez l'utiliser dans un exemple de projet avec

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

Si vous exécutez mvn clean verify sur cet exemple de projet, vous finirez par avoir "foo" imprimé dans vos logs, dans le post-integration-test phase. Cela montre que la valeur a été correctement configurée par le start mojo, puis récupéré correctement par le stop mojo.

Bien sûr, vous pouvez stocker des objets complexes dans cette carte, pas seulement une String (pour lesquels il pourrait y avoir des solutions plus simples). Notamment, il pourrait être un hôte pour votre process instance que vous souhaitez arrêter. Vous pouvez vous débarrasser du exec-maven-plugin , créez un nouveau plugin Maven contenant le code que vous avez déjà pour configurer la base de données embarquée dans un start goal, stocker l'instance de processus dans le contexte du plugin dans ce goal, et enfin arrêter ce processus plus tard dans un autre stop mojo en le récupérant depuis le contexte du plugin.