PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggunakan komponen Java PostgreSQL Server Tertanam sebagai layanan terpisah?

Masalah inti di sini, adalah untuk dapat berbagi beberapa status antara dua tujuan yang berbeda dari sebuah plugin:start tujuan yang akan meluncurkan proses, dan kemudian stop tujuan yang akan membunuhnya. Cara yang baik untuk melakukannya adalah dengan menggunakan ContextEnabled antarmuka yang diimplementasikan oleh semua mojo. Ini menyediakan getPluginContext() metode yang mengembalikan peta (mentah), tempat Anda dapat menyimpan objek untuk dibagikan di antara mojo.

Dengan pendekatan ini, Anda dapat menyimpan sesuatu yang Anda buat di start tujuan plugin, dan dapatkan kembali di stop sasaran. Berikut adalah contoh minimalis untuk menunjukkan ini dalam tindakan, di mana nilai String sederhana dibagikan di antara mojo.

Menyiapkan proyek plugin Maven . Ini pada dasarnya bermuara pada memiliki proyek dengan POM berikut, yang merupakan POM standar untuk plugin Maven, menggunakan Java 8 dan anotasi untuk konfigurasi:

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

Perhatikan kemasan jenis maven-plugin yang menyatakan kepada Maven bahwa ini adalah proyek plugin. Dalam proyek baru ini, pertimbangkan StartMojo berikut ini :

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

}

Ini mendeklarasikan start mojo yang terikat secara default ke pre-integration-test fase. Ini mengambil konteks plugin dan menempatkan objek baru di dalamnya. Di atas, ini adalah POJO kustom sederhana yang disebut MyService yang mengambil nilai dalam konstruktornya. Objek ini dipetakan ke kunci "myService" , yang berfungsi sebagai pencarian.

Kemudian, kita dapat memiliki:

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

}

Ini mendeklarasikan stop baru mojo yang terikat secara default ke post-integration-test fase. Ini mengambil konteks plugin, mengekstrak objek di bawah kunci "myService" , dan akhirnya mendapatkan nilainya dan mencatatnya.

Setelah mengemas dan menginstal plugin Maven ini (dengan mvn clean install ) ke dalam repo lokal Anda, Anda dapat menggunakannya dalam proyek sampel dengan

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

Jika Anda menjalankan mvn clean verify pada proyek sampel itu, Anda akan mendapatkan "foo" dicetak di log Anda, di post-integration-test fase. Ini menunjukkan bahwa nilai telah diatur dengan benar oleh start mojo, dan kemudian diambil dengan benar oleh stop mojo.

Tentu saja, Anda dapat menyimpan objek kompleks di peta ini, bukan hanya String (yang mungkin ada solusi yang lebih sederhana). Khususnya, ini bisa menjadi host untuk process Anda contoh yang ingin Anda hentikan. Anda dapat menyingkirkan exec-maven-plugin , buat plugin Maven baru yang berisi kode yang sudah Anda miliki untuk menyiapkan basis data tertanam di start tujuan, simpan instance proses dalam konteks plugin di tujuan ini, dan terakhir hentikan proses ini nanti di stop lain mojo dengan mengambilnya dari konteks plugin.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengatasi kesalahan 'fe_sendauth:tidak ada kata sandi yang disediakan' di Rails menggunakan PostgreSQL?

  2. Kesalahan saat memetakan array postgres di Spring JPA

  3. CTE dan Paradoks Ulang Tahun

  4. PostgreSQL melepaskan string JSON

  5. Barman Cloud – Bagian 1:Arsip WAL