Lagom persistentEntityRegistry.register不起作用

时间:2017-12-08 10:47:49

标签: java cassandra lagom

我正在尝试使用Cassandra和Lagom配置我的第一个实体。

我在询问Lagom如何在Cassandra中保存实体?

例如,这是我的UserServiceImpl类:

public class UserServiceImpl implements UserService {

    private final PersistentEntityRegistry persistentEntityRegistry;

    @Inject
    public UserServiceImpl(PersistentEntityRegistry persistentEntityRegistry) {
        this.persistentEntityRegistry = persistentEntityRegistry;
        persistentEntityRegistry.register(UserEntity.class);
    }

    @Override
    public ServiceCall<NotUsed, String> getUserInfo(String id) {
        return (request) -> {
            // Look up the user entity for the given ID.
            PersistentEntityRef<UserCommand> ref = persistentEntityRegistry.refFor(UserEntity.class, id);
            // Ask the entity the Hello command.
            return ref.ask(new UserCommand.Hello(id, Optional.empty()));
        };
    }
}

所以执行:

  

persistentEntityRegistry.register(UserEntity.class);

我应该有一张Cassandra用户表吗?因为我只有:

enter image description here

我无法理解我应该在启动Lagom项目之前创建表用户还是仅保存事件?

请帮助

1 个答案:

答案 0 :(得分:2)

Lagom不需要实体表,因为它不是基于对象关系映射或任何类似的。其持久层基于事件采购原则。

消息表将包含实体发出的事件,并且每次将其恢复到内存时都会恢复其状态。

基本上,事件在消息表中以json格式保存。

我们也有快照的概念。实体状态可以保存为快照(也使用json)。这发生在每100个事件之后,这是一个小的优化,以避免每次从头开始重放事件。

我会尽快解释整个机制。

命令被发送到实体并且事件被持久化(在命令处理程序中发生)。在持久化事件之后,将它们应用于实体以使其变异(在事件处理程序上发生)。

重新启动服务并向同一实体发送新命令。此时实体不在内存中,因此Lagom会将其带入内存,但在处理该新命令之前,它将重放该实体的事件历史记录,以使其恢复到系统停机时的状态。

之后,将应用该命令并保留新事件。

在100个事件之后,将保存实体的快照,下次,当需要重播同一个实体时,我们首先加载快照,然后我们应用快照之后发生的事件。因此,在这种情况下,我们不需要重播整个事件历史记录。