Apache GeodeのJavaクライアント

### はじめに
Apache Geodeを使ったJavaのクライアントを実装例を記載します。
実行環境はJava8、Geode１．６を使用します。
### 簡単なサンプル
dependency

```
        <dependency>
            <groupId>org.apache.geode</groupId>
            <artifactId>geode-core</artifactId>
            <version>1.6.0</version>
        </dependency>
```

Javaコード

```
import org.apache.geode.cache.Region;
import org.apache.geode.cache.client.ClientCache;
import org.apache.geode.cache.client.ClientCacheFactory;
import org.apache.geode.cache.client.ClientRegionShortcut;

public class GeodeTest {

  public static void main(String[] args) {

    ClientCache cache = null;
    try {
      cache = new ClientCacheFactory()
          .addPoolLocator("xxx01.yahoo.co.jp", 10334)
          .create();

      Region<String,String> region = cache
          .<String,String>createClientRegionFactory(ClientRegionShortcut.PROXY)
          .create("pregion");
      
      region.put("key1", "value1");
      
      String value = region.get("key1");

      System.out.println("value:" + value);
      
    } finally {
      if ( cache != null ) {
        cache.close();  
      }
    }
  }
}
```
実行結果

```
value:value1
```
正直、解説の必要性がないほどシンプルな実装に思います。
locatorが複数ある場合は、addPoolLocatorは複数呼んでください。

```
      cache = new ClientCacheFactory()
          .addPoolLocator("xxx01.yahoo.co.jp", 10334)          
          .addPoolLocator("xxx02.yahoo.co.jp", 10334)
          .create();
```
`Region<String,String>`という記述でお気づきの方もいらっしゃるかもしれませんが、Geodeに保存できるのはStringだけではありません、例えば、MapやList、独自に作成したクラスも可能です。
Redisで複雑なデータ構造を保存しようとするとHashを利用したり、Jsonで登録したと思いますが、この点はGeodeの使いやすい点だと思います。
### 独自クラスを登録する
簡単なエンティティを作ってみます。

```
import java.io.Serializable;

public class TestEntity implements Serializable {

  private String value1;
  private String value2;

// setter/getter割愛
```
Geodeで利用する場合は、Serializableが必要なことに注意してください。

下記のように実装します。

```
      Region<String,TestEntity> region = cache
          .<String,TestEntity>createClientRegionFactory(ClientRegionShortcut.PROXY)
          .create("pregion");

      TestEntity putEntity = new TestEntity();
      putEntity.setValue1("v1");
      putEntity.setValue2("v2");
      
      region.put("key1", putEntity);

      TestEntity getEntity = region.get("key1");

      System.out.println("value1:" + getEntity.getValue1());
      System.out.println("value2:" + getEntity.getValue2());
```
実行結果

```
value1:v1
value2:v2
```

### JarのDeploy
独自のクラスを登録できましたが、実は、そのままでは、この値をgfsh上で確認することができません。
先に作成したクラスを含んだJarをGeodeへデプロイすることで、値を確認する事ができます。
まずは、作成したJarをデプロイします。

```
gfsh>deploy --jars=/<Jarを配置したディレクトリ>/geode-sanple-1.0.jar

Deploying files: geode-sanple-1.0.jar
Total file size is: 0.01MB

Continue?  (Y/n): y
Member  |     Deployed JAR     | Deployed JAR Location
------- | -------------------- | ----------------------------------------------------
server1 | geode-sanple-1.0.jar | /xxxx/geode/server1/geode-sanple-1.0.v1.jar
server2 | geode-sanple-1.0.jar | /xxxx/geode/server2/geode-sanple-1.0.v1.jar
server3 | geode-sanple-1.0.jar | /xxxx/geode/server3/geode-sanple-1.0.v1.jar
```
getしてみます

```
gfsh>get --region=pregion --key=key1
Result      : true
Key Class   : java.lang.String
Key         : key1
Value Class : TestEntity

value1 | value2
------ | ------
v1     | v2
```
内容をgfshで確認することができました。
また、[PDX Serialization](http://geode.apache.org/docs/guide/10/developing/data_serialization/gemfire_pdx_serialization.html)を使用することで、デプロイなしでも利用できるようですが、試していません。
### まとめ
簡単なJavaクライアントを作成してみました。
Springを利用しているユーザには、[Spring Data Geode](https://docs.spring.io/spring-data/geode/docs/current/reference/html/)も提供されています。Geodeへ接続するBeanを作成して、ClientCacheをDIする位しか解説する事がないため、割愛します。
次回は、expireについて書いていきます。