如何在不使用Lagom Framework的情况下检索状态

时间:2016-05-22 08:55:38

标签: cqrs event-sourcing lagom

我正在学习使用Lagom Framework,但我无法理解持久性方面是如何工作的。

我的例子很简单:我有一个产品库存和几个创建,购买和订购产品的服务,使股票波动。目前,我坚持使用库存数量的产品以及添加/移除数量的每个库存移动。我想要实现的只是坚持所有库存变动并从中创造产品。

我对Lagom框架的理解是,我不应该坚持产品,而应该是库存变动的事件。这样,如果我想知道产品的库存,就会以某种方式处理事件以检索当前状态。

在我的服务实现中,以下是我现在获取产品状态的方法:

@Override
public ServiceCall<String, NotUsed, Source<Product, ?>> getProduct() {
    return (id, req) -> {
        Source<Product, ?> result = session.select("SELECT * FROM products WHERE id = ?", id)
                .map(row -> new Product(row.getString("id"), row.getString("ean"), row.getLong("quantity")));
        return CompletableFuture.completedFuture(result);
    };
}

以下是我添加股票的方式:

@Override
public ServiceCall<String, Stock, NotUsed> add() {
    return (id, request) -> {
        log.info("EAN: {}. Supply order received.", id);
        PersistentEntityRef<StockCommand> ref = persistentEntityRegistry.refFor(StockEntity.class, id);
        return ref.ask(new StockCommand.AddStock(request.amount)).thenApply(r -> NotUsed.getInstance());
    };
}

Lagom是否有办法仅使用持久性事件重建产品状态?如何才能满足我的需求?

1 个答案:

答案 0 :(得分:2)

道歉,我觉得你的例子非常令人困惑。所以你有多个产品的库存。每个产品都有一个计数(表示可用的项目数)。随着产品的购买,订单流程会减少计数,仓库交货流程会增加库存(因此计数)。

您可以使用命令中的state()功能获取状态。

有关类似用例的更多详细信息,请参阅https://github.com/orefalo/lagom-sample-bank

希望这有帮助,