2017-04-12 4 views
0

Ich bin völlig neu in der Lagom-Framework, daher habe ich heute die Dokumentation gelesen und fing an, ihre Hallo Welt Beispiel zu ändern.So holen Sie alle persistenten Entitäten

Ich bin jedoch nicht in der Lage, eine Methode zum Abrufen aller persistenten Entitäten zu finden (d. H. Alle persistierten Grüße in diesem Beispiel).

Dies ist, wie das Standard Beispiel eine Person, die Begrüßung holt:

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

nun statt der Suche eine Einheit mit einer bestimmten ID auf, ich will alle Objekte holen, z.B. etwas wie persistentEntityRegistry.getIds(), dann könnte ich sie eins nach dem anderen per ID holen. Eine solche Methode scheint jedoch für die Entitätsregistrierung nicht zu existieren.

Antwort

2

Es ist möglich, alle des Einheit-IDs zu erhalten, indem den zugrunde liegenden Akka Persistenz-Framework direkt ein allPersistenceIds or currentPersistenceIds query

Sie können sehen, ein Beispiel hierfür im Einsatz in der Lagom Online-Auktion Beispiel Anwendung in UserServiceImpl.java zu tun mit:

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); 
    } 
    //... 
} 

Dieser Ansatz ist zwar möglich, ist selten eine gute Idee. Sie haben vielleicht den Kommentar im Beispielcode bemerkt: "Dies sollte niemals zur Produktion führen". Es gibt keine Möglichkeit, Aggregatbefehle mithilfe dieses Ansatzes auszuführen: Sie können nur Befehle an jede Entität einzeln senden. Dies kann zu Spitzen im Speicherverbrauch und Datenverkehr zwischen Knoten in Ihrem Dienstcluster führen. Es ist auch nicht möglich, diese Liste von IDs nach beliebigen Kriterien des Entitätsstatus zu filtern, wie Sie es von zeilenorientierten SQL-Datenmodellen gewohnt sind.

Es ist fast immer sinnvoller, einen read-side model für Ihre Daten zu definieren. Dies hat die Form eines separaten "Lese-Side" -Datenspeichers, der für den Typ der von Ihrer Anwendung benötigten Abfragen erstellt wird, und eines Ereignisprozessors, der automatisch aufgerufen wird, wenn Ihre Entitäten Ereignisse ausgeben, wodurch der Read-Side-Datenspeicher aktualisiert wird um diese Änderungen widerzuspiegeln.

Das Lagom-Framework hilft bei der Sicherstellung der Konsistenz Ihrer Anwendung, indem es Ihre ereignisgesteuerten Ereignisprozessoren verwaltet, deren Position im Ereignisprotokoll verfolgt und sie automatisch bei Neustart oder Fehlschlag neu startet. Diese Art von Resilienz ist ansonsten für aggregierte Operationen schwierig zu implementieren.

(Diese Antwort wurde von einem related discussion in the Lagom Framework Google Group angepasst.)

+0

Vielen Dank! Dies ist eine nette Klarstellung, da die Dokumentation zunächst etwas bombastisch sein kann, besonders für jemanden, der neu im Framework ist. – HyperZ

+0

Danke ... bitte teilen Sie uns mit, ob wir die Dokumentation verbessern können, um sie nützlicher zu machen. –

Verwandte Themen