有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java长时间运行操作的状态应该存储在哪里?

我们在系统中构建了一个操作(在此命名为check())。启动此过程后,我们希望将此资源的状态从Not Started更改为In Process,完成后更改为FailedSuccessful

当前实现是将所述资源的相应状态写入数据库。因此,流程如下(如果运行成功):

User clicked check -> check() started -> set status of the resource to In Process in DB-> check() finished -> set the status of the resource to Successful in DB

check()期间,如果用户单击前端上的刷新,将触发对相应资源的GET请求,从而检索要显示给用户的当前状态(In Process)。如果另一个用户试图在当前为In Process的资源上运行check(),则在检查数据库中资源的状态时,请求应该失败

这是向DB注册临时状态的正确解决方案吗?我觉得DB应该用来保存记录,而不是用作闩锁


共 (1) 个答案

  1. # 1 楼答案

    您可以使用event sourcing技术解决此问题。您可以将一系列状态转换存储为事件,而不是存储流程的最新状态
    对于每个传入命令(如您提到的检查或刷新),您可以:

    1. 聚合已发生在具有特定 id,重新创建进程的状态
    2. 根据您的业务逻辑,根据当前状态和传入命令(这是某种状态机)决定下一个状态转换
    3. 为状态转换创建新事件,并将其保存在事件存储中

    要正确实现此类系统,请不要忘记对事件进行版本控制。以下是版本控制指南:Versioning in an Event Sourced System