我正在学习使用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是否有办法仅使用持久性事件重建产品状态?如何才能满足我的需求?
答案 0 :(得分:2)
道歉,我觉得你的例子非常令人困惑。所以你有多个产品的库存。每个产品都有一个计数(表示可用的项目数)。随着产品的购买,订单流程会减少计数,仓库交货流程会增加库存(因此计数)。
您可以使用命令中的state()
功能获取状态。
有关类似用例的更多详细信息,请参阅https://github.com/orefalo/lagom-sample-bank。
希望这有帮助,