PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak używać komponentu Java Embedded PostgreSQL Server jako oddzielnej usługi?

Podstawowym problemem jest tutaj możliwość współdzielenia pewnego stanu między dwa różne cele wtyczki:start cel, który uruchomi proces, a następnie stop cel, który by go zabił. Dobrym sposobem na to jest skorzystanie z ContextEnabled interfejs, który implementują wszystkie mojo. Zapewnia getPluginContext() metoda, która zwraca (surową) mapę, w której możesz przechowywać obiekty, które mają być udostępniane między mojos.

Dzięki takiemu podejściu możesz przechowywać coś, co stworzyłeś w start celu wtyczki i odzyskaj go w stop bramka. Oto minimalistyczny przykład pokazujący to w działaniu, w którym prosta wartość ciągu jest dzielona między mojos.

Skonfiguruj projekt wtyczki Maven . Zasadniczo sprowadza się to do posiadania projektu z następującym POM, który jest standardowym POM dla wtyczki Maven, przy użyciu Javy 8 i adnotacji do konfiguracji:

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

Zwróć uwagę na opakowanie typu maven-plugin który deklaruje Mavenowi, że jest to projekt wtyczki. W tym nowym projekcie rozważ następujące 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"));
    }

}

Jest to deklaracja nowego start mojo który jest domyślnie powiązany z pre-integration-test faza. Pobiera kontekst wtyczki i umieszcza w nim nowy obiekt. W powyższym przykładzie jest to proste niestandardowe POJO o nazwie MyService który przyjmuje wartość w swoim konstruktorze. Ten obiekt jest mapowany na klucz "myService" , który służy jako odnośnik.

Wtedy możemy mieć:

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

}

To jest deklaracja nowego stop mojo, który jest domyślnie powiązany z post-integration-test faza. Pobiera kontekst wtyczki, wyodrębnia obiekt pod kluczem "myService" , a na koniec pobierz jej wartość i zarejestruj ją.

Po spakowaniu i zainstalowaniu tej wtyczki Maven (z mvn clean install ) do lokalnego repozytorium, możesz go użyć w przykładowym projekcie za pomocą

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

Jeśli uruchomisz mvn clean verify w tym przykładowym projekcie będziesz miał "foo" wydrukowane w Twoich logach, w post-integration-test faza. To pokazuje, że wartość została poprawnie ustawiona przez start mojo, a następnie poprawnie pobierane przez stop mojo.

Oczywiście na tej mapie możesz przechowywać złożone obiekty, a nie tylko String (dla których mogłyby istnieć prostsze rozwiązania). Warto zauważyć, że może to być host dla twojego process wystąpienie, które chcesz zatrzymać. Możesz pozbyć się wtyczki exec-maven-plugin , utwórz nową wtyczkę Maven zawierającą kod, który już musisz skonfigurować, aby skonfigurować osadzoną bazę danych w start celu, przechowuj instancję procesu w kontekście wtyczki w tym celu, a na koniec zatrzymaj ten proces później w innym stop mojo, pobierając go z kontekstu wtyczki.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SqlAlchemy:zapytanie o długość pola json posiadającego tablicę

  2. Wiele niechcianych rekordów w Grupuj według klauzuli w Postgress

  3. utworzyć milion tabeli w bazie danych?

  4. Jak deserializować wartość BigDecimal otrzymaną od brokera kafka poprzez mechanizm debezium CDC?

  5. Opcje wielodostępności dla PostgreSQL