2017-04-12 116 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

谢谢...请让我们知道是否有任何方法可以改进文档以使其更有用。 –