このガイドでは、Pivotal GemFire のデータファブリックを使用してアプリケーションを構築するプロセスを順を追って説明します。

構築する

POJO (英語) を保存および取得するには、強力な Spring Data for Pivotal GemFire ライブラリを使用します。

必要なもの

このガイドを完了する方法

ほとんどの Spring 入門ガイドと同様に、最初から始めて各ステップを完了するか、すでに慣れている場合は基本的なセットアップステップをバイパスできます。いずれにしても、最終的に動作するコードになります。

最初から始めるには、Gradle でビルドするに進みます。

基本スキップするには、次の手順を実行します。

完了したときは、gs-accessing-data-gemfire/complete のコードに対して結果を確認できます。

Gradle でビルドする

Gradle でビルドする

最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Gradle (英語) および Maven (英語) を操作するために必要なコードはここに含まれています。どちらにも詳しくない場合は、Gradle で Java プロジェクトの構築または Maven で Java プロジェクトの構築を参照してください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

 └──  src
     └──  main
         └──  java
             └──  hello

Gradle ビルドファイルを作成する

build.gradle

buildscript {
    repositories {
        mavenCentral()
        maven { url "https://repo.spring.io/libs-release" }
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:2.2.1.RELEASE")
    }
}

plugins {
    id "io.spring.dependency-management" version "1.0.5.RELEASE"
}

apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'

sourceCompatibility = 1.8
targetCompatibility = 1.8

bootJar {
    baseName = 'gs-accessing-data-gemfire'
    version = '0.1.0'
}

repositories {
    mavenCentral()
    maven { url "https://repo.spring.io/libs-release" }
}

dependencies {
    compile("org.springframework.boot:spring-boot-starter") {
        exclude group: "org.springframework.boot", module: "spring-boot-starter-logging"
    }
    compile("org.springframework.data:spring-data-gemfire")
    compile("org.projectlombok:lombok")
    runtime("org.springframework.shell:spring-shell:1.2.0.RELEASE")
}

Spring Boot gradle プラグインは多くの便利な機能を提供します。

  • クラスパス上のすべての jar を収集し、単一の実行可能な「ü ber-jar」を構築します。これにより、サービスの実行とトランスポートがより便利になります。

  • public static void main() メソッドを検索して、実行可能なクラスとしてフラグを立てます。

  • Spring Boot の依存関係: GitHub (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトでブートの選択されたバージョンのセットになります。

Maven でビルドする

Maven でビルドする

最初に、基本的なビルドスクリプトを設定します。Spring を使用してアプリをビルドする場合、好きなビルドシステムを使用できますが、Maven (英語) で作業するために必要なコードはここに含まれています。Maven に詳しくない場合は、Maven で Java プロジェクトの構築を参照してください。

ディレクトリ構造を作成する

選択したプロジェクトディレクトリで、次のサブディレクトリ構造を作成します。たとえば、*nix システム上の mkdir -p src/main/java/hello の場合:

 └──  src
     └──  main
         └──  java
             └──  hello

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>

    <groupId>org.springframework</groupId>
    <artifactId>gs-accessing-data-gemfire</artifactId>
    <version>0.1.0</version>

    <properties>
        <spring-shell.version>1.2.0.RELEASE</spring-shell.version>
    </properties>

    <repositories>
        <repository>
            <id>spring-releases</id>
            <url>https://repo.spring.io/libs-release</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-gemfire</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.shell</groupId>
            <artifactId>spring-shell</artifactId>
            <version>${spring-shell.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Spring Boot Maven プラグインは多くの便利な機能を提供します。

  • クラスパス上のすべての jar を収集し、単一の実行可能な「ü ber-jar」を構築します。これにより、サービスの実行とトランスポートがより便利になります。

  • public static void main() メソッドを検索して、実行可能なクラスとしてフラグを立てます。

  • Spring Boot の依存関係: GitHub (英語) と一致するようにバージョン番号を設定する組み込みの依存関係リゾルバーを提供します。任意のバージョンをオーバーライドできますが、デフォルトでブートの選択されたバージョンのセットになります。

IDE でビルドする

IDE でビルドする

単純なエンティティを定義する

Pivotal GemFire は、データをリージョンにマップするインメモリデータグリッド(IMDG)です。クラスター内の複数のノード間でデータを分割および複製する分散リージョンを構成することができます。ただし、このガイドでは、LOCAL リージョンを使用するため、サーバーのクラスター全体など、特別な設定を行う必要はありません。

Pivotal GemFire はキー / 値ストアであり、リージョンは java.util.concurrent.ConcurrentMap インターフェースを実装します。Region を java.util.Map のように扱うことはできますが、データが Region 内で配布、複製、一般的に管理される場合、単純な Java Map よりもかなり洗練されています。

この例では、いくつかのアノテーションのみを使用して、Person オブジェクトを Pivotal GemFire(リージョン)に保存します。

src/main/java/hello/Person.java

package hello;

import java.io.Serializable;

import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.PersistenceConstructor;
import org.springframework.data.gemfire.mapping.annotation.Region;

import lombok.Getter;

@Region(value = "People")
public class Person implements Serializable {

  @Id
  @Getter
  private final String name;

  @Getter
  private final int age;

  @PersistenceConstructor
  public Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @Override
  public String toString() {
    return String.format("%s is %d years old", getName(), getAge());
  }
}

ここには、name と age の 2 つのフィールドを持つ Person クラスがあります。また、新しいインスタンスを作成するときにエンティティを設定するための単一の永続的なコンストラクターがあります。このクラスはプロジェクト Lombok (英語) を使用して実装を簡素化します。

このクラスには @Region("People") アノテーションが付けられていることに注意してください。Pivotal GemFire がこのクラスのインスタンスを保存すると、「People」リージョン内に新しいエントリが作成されます。また、このクラスは name フィールドを @Id でマークします。これは、Pivotal GemFire 内の Person データを識別および追跡するために使用される識別子を示します。基本的に、@Id アノテーション付きフィールド(例: name)はキーであり、Person インスタンスはキー / 値エントリの値です。Pivotal GemFire には自動キー生成がないため、エンティティを Pivotal GemFire に永続化する前に ID(つまり name)を設定する必要があります。

次の重要な部分は、その人の年齢です。このガイドの後半で、これを使用してクエリを作成します。

オーバーライドされた toString() メソッドは、人の名前と年齢を出力します。

簡単なクエリを作成する

Pivotal GemFire の Spring Data は、Spring を使用した Pivotal GemFire でのデータの保存とアクセスに焦点を当てています。また、Spring Data Commons プロジェクトから、クエリを派生する機能などの強力な機能を継承します。基本的に、Pivotal GemFire(OQL)のクエリ言語を学ぶ必要はありません。少数のメソッドを記述するだけで、クエリはフレームワークによって書き込まれます。

これがどのように機能するかを確認するには、Pivotal GemFire に保存されている Person オブジェクトを照会するインターフェースを作成します。

src/main/java/hello/PersonRepository.java

package hello;

import org.springframework.data.gemfire.repository.query.annotation.Trace;
import org.springframework.data.repository.CrudRepository;

public interface PersonRepository extends CrudRepository<Person, String> {

  @Trace
  Person findByName(String name);

  @Trace
  Iterable<Person> findByAgeGreaterThan(int age);

  @Trace
  Iterable<Person> findByAgeLessThan(int age);

  @Trace
  Iterable<Person> findByAgeGreaterThanAndAgeLessThan(int greaterThanAge, int lessThanAge);

}

PersonRepository を有するリポジトリ作品、すなわち、それぞれ Person と String、その Spring Data Commons 値と ID(キー)の両方のためのジェネリック型パラメーターの指定タイプから CrudRepository インターフェースを継承します。すぐに使用できるこのインターフェースには、基本的な CRUD(CREATE、READ UPDATE、DELETE)および単純なクエリ(例: findById(..))データアクセス操作を含む多くの操作が付属しています。

メソッドシグネチャーを宣言するだけで、必要に応じて他のクエリを定義できます。この場合、findByName を追加します。これは、本質的にタイプ Person のオブジェクトを検索し、name で一致するオブジェクトを見つけます。

あなたも持っています:

  • findByAgeGreaterThan は、特定の年齢以上の人を見つける

  • findByAgeLessThan は、特定の年齢未満の人を見つける

  • 特定の年齢層の人々を見つける findByAgeGreaterThanAndAgeLessThan 

これを接続して、どのように見えるか見てみましょう!

アプリケーションクラスを作成する

ここで、すべてのコンポーネントを含む Application クラスを作成します。

src/main/java/hello/Application.java

package hello;

import static java.util.Arrays.asList;
import static java.util.stream.StreamSupport.stream;

import java.io.IOException;

import org.apache.geode.cache.client.ClientRegionShortcut;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.data.gemfire.config.annotation.ClientCacheApplication;
import org.springframework.data.gemfire.config.annotation.EnableEntityDefinedRegions;
import org.springframework.data.gemfire.repository.config.EnableGemfireRepositories;

@SpringBootApplication
@ClientCacheApplication(name = "AccessingDataGemFireApplication", logLevel = "error")
@EnableEntityDefinedRegions(basePackageClasses = Person.class,
  clientRegionShortcut = ClientRegionShortcut.LOCAL)
@EnableGemfireRepositories
public class Application {

  public static void main(String[] args) throws IOException {
    SpringApplication.run(Application.class, args);
  }

  @Bean
  ApplicationRunner run(PersonRepository personRepository) {

    return args -> {

      Person alice = new Person("Adult Alice", 40);
      Person bob = new Person("Baby Bob", 1);
      Person carol = new Person("Teen Carol", 13);

      System.out.println("Before accessing data in Pivotal GemFire...");

      asList(alice, bob, carol).forEach(person -> System.out.println("\t" + person));

      System.out.println("Saving Alice, Bob and Carol to Pivotal GemFire...");

      personRepository.save(alice);
      personRepository.save(bob);
      personRepository.save(carol);

      System.out.println("Lookup each person by name...");

      asList(alice.getName(), bob.getName(), carol.getName())
        .forEach(name -> System.out.println("\t" + personRepository.findByName(name)));

      System.out.println("Query adults (over 18):");

      stream(personRepository.findByAgeGreaterThan(18).spliterator(), false)
        .forEach(person -> System.out.println("\t" + person));

      System.out.println("Query babies (less than 5):");

      stream(personRepository.findByAgeLessThan(5).spliterator(), false)
        .forEach(person -> System.out.println("\t" + person));

      System.out.println("Query teens (between 12 and 20):");

      stream(personRepository.findByAgeGreaterThanAndAgeLessThan(12, 20).spliterator(), false)
        .forEach(person -> System.out.println("\t" + person));
    };
  }
}

構成では、@EnableGemfireRepositories アノテーションを追加する必要があります。

  • デフォルトでは、@EnableGemfireRepositories は現在のパッケージをスキャンして、Spring Data のリポジトリインターフェースのいずれかを継承するインターフェースを探します。basePackageClasses = MyRepository.class を使用して、Pivotal GemFire の Spring Data に、アプリケーション固有のリポジトリ拡張機能のタイプごとに異なるルートパッケージをスキャンするように安全に伝えます

すべてのデータを保存するには、1 つ以上のリージョンを含む Pivotal GemFire キャッシュが必要です。そのために、Pivotal GemFire の便利な構成ベースのアノテーションに Spring Data の 1 つを使用します: @ClientCacheApplication@PeerCacheApplication or `@CacheServerApplication

Pivotal GemFire は、クライアント / サーバー、ピアツーピア(p2p)、WAN 配置などのさまざまなキャッシュトポロジをサポートします。p2p では、ピアキャッシュインスタンスがアプリケーションに埋め込まれ、アプリケーションはピアキャッシュメンバーとしてクラスターに参加できます。ただし、アプリケーションはクラスター内のピアメンバーであるというすべての制約を受けるため、これは、たとえばクライアント / サーバートポロジほど一般的には使用されません。

この例では、@ClientCacheApplication を使用して「クライアント」キャッシュインスタンスを作成します。これは、サーバーのクラスターに接続して通信する機能を備えています。ただし、物事を単純にするために、クライアントはサーバーをセットアップしたり実行したりせずに、LOCAL クライアントリージョンを使用してデータをローカルに保存するだけです。

Spring は、クラスター内の複数のノードに分散キャッシュとリージョンを作成できる Pivotal GemFire である実動エンタープライズ版を推奨しています。あるいは、オープンソースバージョン Apache Geode (英語) を使用して、Apache Geode コミュニティからサポートを受けることもできます。

ここで、SDG マッピングアノテーション @Region("People") を使用して Person を「People」という領域に保存するようにタグ付けした方法を思い出してください。ここでその領域を定義するには、ClientRegionFactoryBean<String, Person> Bean 定義を使用します。定義したばかりのキャッシュのインスタンスを挿入すると同時に、「People」という名前を付ける必要があります。

Pivotal GemFire キャッシュインスタンス(ピアまたはクライアント)は、データを保存するリージョンの単なるコンテナーです。キャッシュは RDBMS のスキーマと見なされ、リージョンはテーブルと見なされます。ただし、キャッシュは他の管理機能も実行して、すべてのリージョンを制御および管理します。
タイプは <String, Person> で、キータイプ(String)と値タイプ(Person)を一致させます。

public static void main メソッドは、Spring Boot の SpringApplication.run() を使用してアプリケーションを起動し、アプリケーションの Spring Data リポジトリを使用して Pivotal GemFire でデータアクセス操作を実行する ApplicationRunner (別の Bean 定義)を呼び出し ます

アプリケーションは、先ほど定義した PersonRepository のインスタンスをオートワイヤーします。Spring Data for Pivotal GemFire は、このインターフェースを実装する具象クラスを動的に作成し、インターフェースの義務を満たすために必要なクエリコードをプラグインします。このリポジトリインスタンスは、run() メソッドが機能を実証するために使用します。

データの保存と取得

このガイドでは、3 つのローカル Person オブジェクト、アリスベビー Bobティーンキャロルを作成しています。最初は、メモリにのみ存在します。作成したら、Pivotal GemFire に保存する必要があります。

ここで、いくつかのクエリを実行します。最初は、全員を名前で検索します。次に、いくつかのクエリを実行して、すべて age 属性を使用して、大人、赤ちゃん、10 代の若者を見つけます。ロギングを有効にすると、Spring Data が Pivotal GemFire に代わって書き込むクエリを確認できます。

@ClientCacheApplication アノテーション logLevel 属性を「config」に変更して、SDG によって生成される Pivotal GemFire OQL クエリを表示します。クエリメソッド(findByName など)には SDG の @Trace アノテーションが付けられているため、これにより Pivotal GemFire の OQL クエリトレース(クエリレベルのログ)がオンになり、生成された OQL、実行時間、Pivotal GemFire インデックスがクエリで使用されたかどうかが表示されます。結果、およびクエリによって返された行数を収集します。

実行可能 JAR を構築する

コマンドラインから Gradle または Maven を使用してアプリケーションを実行できます。必要なすべての依存関係、クラス、リソースを含む単一の実行可能 JAR ファイルを構築して実行することもできます。実行可能な jar を構築すると、開発ライフサイクル全体、さまざまな環境などで、アプリケーションとしてサービスを簡単に提供、バージョン管理、デプロイできます。

Gradle を使用する場合、./gradlew bootRun を使用してアプリケーションを実行できます。または、次のように、./gradlew build を使用して JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar build/libs/gs-accessing-data-gemfire-0.1.0.jar

Maven を使用する場合、./mvnw spring-boot:run を使用してアプリケーションを実行できます。または、次のように、./mvnw clean package で JAR ファイルをビルドしてから、JAR ファイルを実行できます。

java -jar target/gs-accessing-data-gemfire-0.1.0.jar
ここで説明する手順は、実行可能な JAR を作成します。クラシック WAR ファイルを作成することもできます。

次のようなものが表示されるはずです(クエリのようなものもあります):

Before linking up with GemFire...
	Alice is 40 years old.
	Baby Bob is 1 years old.
	Teen Carol is 13 years old.
Lookup each person by name...
	Alice is 40 years old.
	Baby Bob is 1 years old.
	Teen Carol is 13 years old.
Adults (over 18):
	Alice is 40 years old.
Babies (less than 5):
	Baby Bob is 1 years old.
Teens (between 12 and 20):
	Teen Carol is 13 years old.

要約

おめでとう! Pivotal GemFire キャッシュクライアントをセットアップし、単純なエンティティを保存し、クイッククエリを開発しました。

関連事項

次のガイドも役立ちます。

新しいガイドを作成したり、既存のガイドに貢献したいですか? 投稿ガイドラインを参照してください: GitHub (英語)

すべてのガイドは、コード用の ASLv2 ライセンス、およびドキュメント用の Attribution、NoDerivatives クリエイティブコモンズライセンス (英語) でリリースされています。