java - Lagom persistentEntityRegistry.register 不起作用

标签 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 项目之前创建表用户还是我们只保存事件?

请帮忙

最佳答案

Lagom 不需要实体表,因为它不是基于对象关系映射或类似的东西。它的持久层基于事件溯源的原则。

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

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

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

我将尝试简短地解释整个机制。

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

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

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

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

关于java - Lagom persistentEntityRegistry.register 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47712769/

相关文章:

java - Apache poi 在读取 excel 文件时的奇怪行为

java - 有没有一种有效的方法可以将两个大型数据集与(更深的)嵌套数组字段连接起来?

java - 从服务启动第三方应用程序

Java Web 字体字符无法识别

cassandra - 具有辅助索引的 CQL - 请求未在 rpc_timeout 内完成

java - Lagom lagomServiceLocatorStart 不工作 - 连接被拒绝

scala - 在 Spark 中读取文件时出错

database - Cassandra如何查询获取最新消息

unit-testing - Lagom服务测试

scala - build.sbt 中的 Lagom 属性