Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间运行的操作的状态应存储在哪里?_Java_Spring - Fatal编程技术网

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

Java 长时间运行的操作的状态应存储在哪里?,java,spring,Java,Spring,我们在系统中内置了一个操作(特此命名为check())。启动此过程后,我们希望将此资源的状态从未启动更改为正在进行,并在完成后更改为失败或成功 当前实现是将所述资源的相应状态写入数据库。因此,流程如下(如果运行成功): 用户单击检查->check()started->在数据库中将资源的状态设置为In Processcheck()finished->在数据库中将资源的状态设置为Successful 在check()期间,如果用户单击前端上的刷新,将触发对相应资源的获取请求,从而检索要向用户显示的当

我们在系统中内置了一个操作(特此命名为
check()
)。启动此过程后,我们希望将此资源的状态从
未启动
更改为
正在进行
,并在完成后更改为
失败
成功

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

用户单击检查->
check()
started->在数据库中将资源的状态设置为
In Process
check()
finished->在数据库中将资源的状态设置为
Successful

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

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

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

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

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

    数据库中的行表示流程,流程具有随时间变化的状态。我没有看到任何错误。如果操作结果是数据,那么我会将操作结果存储在DB中,而不是状态。另一个解决方案-您可以创建一个web服务来处理该操作。它将在过程完成后在主系统中注册结果。你的解决方案也可以。