2017-04-12 110 views
0

我完全新的lagom框架,因此,我今天閱讀文檔,並開始修改自己的Hello World示例。如何獲取所有堅持實體

但是,我無法找到一個方法來獲取所有堅持實體(即所有堅持問候在這個例子中)。

這是默認的例子,如何獲取一個人的問候:

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

現在,而不是使用一個給定的ID查找一個實體,我想獲取所有實體,例如像persistentEntityRegistry.getIds(),然後我可以通過ID一個接一個地獲取它們。但是,這種方法似乎不存在於實體註冊表中?

回答

2

有可能通過直接使用底層阿卡持久化框架做的就是所有的實體ID的allPersistenceIds or currentPersistenceIds query

你可以看到在Lagom在線拍賣示例應用程序使用的一個例子,在UserServiceImpl.java

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

儘管可能,但這種方法很少是一個好主意。您可能已經注意到示例代碼中的評論:「這不應該使生產」。無法使用此方法執行聚合命令:您僅限於將命令逐個發送到每個實體。這可能會導致服務集羣中節點之間的內存消耗和流量激增。也不可能按照實體狀態的任何標準來過濾這個ID列表,正如您可能從面向行的SQL數據模型中習慣的那樣。

幾乎總是更適合定義爲您的數據read-side model。它採用單獨的「讀取方」數據存儲的形式,專門爲您的應用程序需要的查詢類型而構建,並且當您的實體發出事件時會自動調用事件處理器,這會更新讀取端數據存儲以反映這些變化。

的Lagom框架有助於通過管理你的讀端的事件處理器,跟蹤在事件日誌中自己的位置,並自動重新啓動它們在重新啓動或發生故障,以確保您的應用程序最終一致性。對於總體操作來說,實施這種類型的彈性很困難。

(這個答案改編自related discussion in the Lagom Framework Google Group。)

+0

非常感謝!這是一個很好的說明,因爲文檔起初可能有點誇張,特別是對於剛接觸框架的人來說。 – HyperZ

+0

謝謝...請讓我們知道是否有任何方法可以改進文檔以使其更有用。 –