第3章 リモートキャッシュのクエリー
Data Grid Server のリモートキャッシュにインデックスを付けてクエリーを実行できます。
3.1. Hot Rod クライアントからのキャッシュの作成
Data Grid を使用すると、HotRod エンドポイントを介して Java クライアントからリモートキャッシュをプログラムでクエリーできます。この手順では、Book
インスタンスを保存するリモートキャッシュをインデックス化する方法を説明します。
前提条件
-
ProtoStream プロセッサーを
pom.xml
に追加します。
Data Grid は、@ProtoField
アノテーションにこのプロセッサーを提供するため、Protobuf スキーマを生成してクエリーを実行できます。
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>...</version> <configuration> <annotationProcessorPaths> <annotationProcessorPath> <groupId>org.infinispan.protostream</groupId> <artifactId>protostream-processor</artifactId> <version>...</version> </annotationProcessorPath> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
手順
次の例のように、インデックスアノテーションをクラスに追加します。
Book.java
import org.infinispan.api.annotations.indexing.Basic; import org.infinispan.api.annotations.indexing.Indexed; import org.infinispan.api.annotations.indexing.Text; import org.infinispan.protostream.annotations.ProtoFactory; import org.infinispan.protostream.annotations.ProtoField; @Indexed public class Book { @Text @ProtoField(number = 1) final String title; @Text @ProtoField(number = 2) final String description; @Basic @ProtoField(number = 3, defaultValue = "0") final int publicationYear; @ProtoFactory Book(String title, String description, int publicationYear) { this.title = title; this.description = description; this.publicationYear = publicationYear; } // public Getter methods omitted for brevity }
新しいクラスに
SerializationContextInitializer
インターフェイスを実装してから、@ AutoProtoSchemaBuilder
アノテーションを追加します。-
includeClasses
パラメーターで@ProtoField
アノテーションを含んだクラスを参照。 -
生成する Protobuf スキーマの名前と、
schemaFileName
およびschemaFilePath
パラメーターを使用したファイルシステムパスを定義します。 schemaPackageName
パラメーターで Protobuf スキーマのパッケージ名を指定します。RemoteQueryInitializer.java
import org.infinispan.protostream.SerializationContextInitializer; import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder; @AutoProtoSchemaBuilder( includeClasses = { Book.class }, schemaFileName = "book.proto", schemaFilePath = "proto/", schemaPackageName = "book_sample") public interface RemoteQueryInitializer extends SerializationContextInitializer { }
-
プロジェクトをコンパイルします。
このプロシージャのコード例は、
proto /book.proto
スキーマとアノテーションされたBook
クラスのRemoteQueryInitializerImpl.java
実装を生成します。
次のステップ
エンティティーにインデックスを付けるように Data Grid を設定するリモートキャッシュを作成します。たとえば、以下のリモートキャッシュは、前のステップで生成した book.proto
スキーマの Book
エンティティーをインデックス化します。
<replicated-cache name="books"> <indexing> <indexed-entities> <indexed-entity>book_sample.Book</indexed-entity> </indexed-entities> </indexing> </replicated-cache>
以下の RemoteQuery
クラスは以下を行います。
-
RemoteQueryInitializerImpl
シリアル化コンテキストを Hot Rod Java クライアントに登録します。 -
Protobuf スキーマ
book.proto
を Data Grid Server に登録します。 -
2 つの
Book
インスタンスをリモートキャッシュに追加します。 - タイトルのキーワードで本を照合する全文クエリーを実行します。
RemoteQuery.java
package org.infinispan; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.client.hotrod.Search; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.query.dsl.Query; import org.infinispan.query.dsl.QueryFactory; import org.infinispan.query.remote.client.ProtobufMetadataManagerConstants; public class RemoteQuery { public static void main(String[] args) throws Exception { ConfigurationBuilder clientBuilder = new ConfigurationBuilder(); // RemoteQueryInitializerImpl is generated clientBuilder.addServer().host("127.0.0.1").port(11222) .security().authentication().username("user").password("user") .addContextInitializers(new RemoteQueryInitializerImpl()); RemoteCacheManager remoteCacheManager = new RemoteCacheManager(clientBuilder.build()); // Grab the generated protobuf schema and registers in the server. Path proto = Paths.get(RemoteQuery.class.getClassLoader() .getResource("proto/book.proto").toURI()); String protoBufCacheName = ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME; remoteCacheManager.getCache(protoBufCacheName).put("book.proto", Files.readString(proto)); // Obtain the 'books' remote cache RemoteCache<Object, Object> remoteCache = remoteCacheManager.getCache("books"); // Add some Books Book book1 = new Book("Infinispan in Action", "Learn Infinispan with using it", 2015); Book book2 = new Book("Cloud-Native Applications with Java and Quarkus", "Build robust and reliable cloud applications", 2019); remoteCache.put(1, book1); remoteCache.put(2, book2); // Execute a full-text query QueryFactory queryFactory = Search.getQueryFactory(remoteCache); Query<Book> query = queryFactory.create("FROM book_sample.Book WHERE title:'java'"); List<Book> list = query.execute().list(); // Voila! We have our book back from the cache! } }