2017-04-12 7 views
0

私はlagomフレームワークを完全に新しくしているので、私は今日ドキュメントを読んでいて、hello worldの例を修正し始めました。永続化されたすべてのエンティティを取得する方法

しかし、すべての永続エンティティ(この例ではすべての永続的な挨拶)を取得する方法を見つけることができません。

これはデフォルトの例では、人の挨拶取り出す方法です:指定されたIDを使用してエンティティを検索するのではなく、今

@Override 
public ServiceCall<GreetingMessage, Done> useGreeting(String id) { 
    return request -> { 
    // Look up the hello world entity for the given ID. 
    PersistentEntityRef<HelloCommand> ref = persistentEntityRegistry.refFor(HelloWorld.class, id); 
    // Tell the entity to use the greeting message specified. 
    return ref.ask(new UseGreetingMessage(request.message)); 
    }; 
} 

を、iは、すべてのエンティティ、例えばを取得したいですpersistentEntityRegistry.getIds()のようなものであれば、idで1つずつ取り出すことができます。しかし、このような方法はエンティティレジストリには存在しないようです。

答えて

2

あなたがUserServiceImpl.javaで、Lagomオンラインオークションのサンプルアプリケーションで使用中の本の例を見ることができますallPersistenceIds or currentPersistenceIds query

を行うには、直接基礎となるアッカ永続化フレームワークを使用して、エンティティIDの全てを取得することが可能です。

public class UserServiceImpl implements UserService { 
    //... 
    private final CurrentPersistenceIdsQuery currentIdsQuery; 
    private final Materializer mat; 

    @Inject 
    public UserServiceImpl(PersistentEntityRegistry registry, ActorSystem system, Materializer mat) { 
     //... 
     this.mat = mat; 
     this.currentIdsQuery = 
       PersistenceQuery.get(system) 
        .getReadJournalFor(
         CassandraReadJournal.class, 
         CassandraReadJournal.Identifier() 
        ); 
     //... 
    } 

    //... 
    @Override 
    public ServiceCall<NotUsed, PSequence<User>> getUsers() { 
     // Note this should never make production.... 
     return req -> currentIdsQuery.currentPersistenceIds() 
       .filter(id -> id.startsWith("UserEntity")) 
       .mapAsync(4, id -> 
        entityRef(id.substring(10)) 
         .ask(UserCommand.GetUser.INSTANCE)) 
       .filter(Optional::isPresent) 
       .map(Optional::get) 
       .runWith(Sink.seq(), mat) 
       .thenApply(TreePVector::from); 
    } 
    //... 
} 

このアプローチは、可能ではありますが、めったに良い考えではありません。サンプルコードのコメントに気づいたかもしれません: "これは決して生産をするべきではありません"。このアプローチを使用して集約コマンドを実行する方法はありません。各エンティティにコマンドを1つずつ送信することに限定されています。これにより、サービス消費量が増加し、サービスクラスタ内のノード間のトラフィックが増加する可能性があります。また、行指向のSQLデータ・モデルから慣れているように、このIDリストをエンティティー状態の任意の基準でフィルター処理することもできません。

ほとんどの場合、データにはread-side modelを定義することがより適切です。これは、アプリケーションが必要とする種類のクエリの目的に合わせて作成された別の「読み取り側」データストアと、エンティティがイベントを発行するときに自動的に呼び出されるイベントプロセッサの形式を取り、読み取り側のデータストアそれらの変化を反映させる。

Lagomフレームワークは、読み取り側のイベントプロセッサを管理し、イベントログ内の位置を追跡し、再起動または失敗時に自動的に再起動することにより、アプリケーションの最終的な一貫性を保証します。このタイプの復元力は、集約操作のために実装するのが難しい場合があります。

(この回答はrelated discussion in the Lagom Framework Google Groupから変更されています)

+0

ありがとうございます!ドキュメントは、最初はやや爆発的で、特にフレームワークを初めて使った人にとっては、あまりにも爆発的なものかもしれないので、これは良い説明です。 – HyperZ

+0

ありがとうございます...もっと便利になるようにドキュメントを改善する方法があれば教えてください。 –

関連する問題