sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo usar el componente Java del servidor PostgreSQL incorporado como un servicio separado?

El problema central aquí es poder compartir algún estado entre dos objetivos diferentes de un complemento:un start objetivo que lanzaría un proceso, y luego un stop gol que lo mataría. Una buena forma de hacerlo es utilizar el ContextEnabled interfaz que todos los mojos implementan. Proporciona un getPluginContext() método que devuelve un mapa (en bruto), en el que puede almacenar objetos para compartir entre mojos.

Con este enfoque, puede almacenar algo que creó en el start objetivo de un complemento y recuperarlo en el stop meta. Aquí hay un ejemplo minimalista para mostrar esto en acción, donde un valor de cadena simple se comparte entre mojos.

Configure un proyecto de complemento de Maven . Básicamente, esto se reduce a tener un proyecto con el siguiente POM, que es el POM estándar para un complemento de Maven, usando Java 8 y anotaciones para la configuración:

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

Tenga en cuenta el paquete de tipo maven-plugin que declara a Maven que este es un proyecto de complemento. En este nuevo proyecto, considere lo siguiente 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"));
    }

}

Esto declara un nuevo start mojo que está vinculado de forma predeterminada a pre-integration-test fase. Recupera el contexto del complemento y coloca un nuevo objeto en él. En lo anterior, es un POJO personalizado simple llamado MyService que toma un valor en su constructor. Este objeto está asignado a una clave de "myService" , que sirve como búsqueda.

Entonces, podemos tener:

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

}

Esto es declarar un nuevo stop mojo que está vinculado por defecto a post-integration-test fase. Recupera el contexto del complemento, extrae el objeto bajo la clave "myService" , y finalmente obtiene su valor y lo registra.

Después de empaquetar e instalar este complemento de Maven (con mvn clean install ) en su repositorio local, puede usarlo en un proyecto de muestra con

<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 ejecuta mvn clean verify en ese proyecto de muestra, terminará teniendo "foo" impreso en sus registros, en el post-integration-test fase. Esto muestra que el valor fue configurado correctamente por start mojo, y luego recuperado correctamente por el stop Mojo.

Por supuesto, puede almacenar objetos complejos en este mapa, no solo una String (para lo cual podría haber soluciones más sencillas). En particular, podría ser un host para su process instancia que desea detener. Puedes deshacerte del exec-maven-plugin , cree un nuevo complemento de Maven que contenga el código que ya tiene para configurar la base de datos incrustada en un start objetivo, almacene la instancia del proceso en el contexto del complemento en este objetivo y finalmente detenga este proceso más tarde en otro stop mojo recuperándolo del contexto del complemento.