java中的状态流

时间:2016-03-07 12:12:50

标签: java state state-machine

我有一个州历史表,其中包含活动的状态。这些状态可能是重复的。样本表:

id    activity_name   state     sub_state
1      firstTask       Check     INPROGRESS
2      firstTask       Check     FAIL
3      secondTask      Check     INPROGRESS
4      secondTask      Check     SUCCESS
5      seccondTask    Initiated  INPROGRESS
6      secondTask     Initiated  SUCCESS

任何具有新状态的新活动都可以随时在系统中引入。

表中的这些状态用于调试目的。现在,我需要公开一个读取此表的API,并将这些状态转换为有意义的状态,忽略重复。

例如,上表应公开为

First TASK: 
CHECKED --> FAILED

Second Task:
CHECKED --> INITIATED

我应该采用哪种方法/设计模式来处理新引入的​​状态,压缩和转换为有意义的状态。

提前致谢。

1 个答案:

答案 0 :(得分:0)

Unusal Approach

如果你没有这样的查询:给我所有任务哪个状态检查并且子状态失败尝试这种方法。将状态和子状态保存在数据库中的json字符串中。

id    activity_name   state
1      firstTask      {'Check' : ['INPROGRESS', 'FAIL']}
2      secondTask     {'Check' : ['INPROGRESS', 'SUCCESS'], {'Initiate' : ['INPROGRESS', 'SUCCESS']}

关系方法

如果你喜欢这种理性的方式,那就试着像那样保存它,或者上面的标准不合适。

id    activity_name   state     sub_state
1      firstTask       Check     01-INPROGRESS
2      firstTask       Check     02-FAIL
3      secondTask      Check     01-INPROGRESS
4      secondTask      Check     02-SUCCESS
5      seccondTask    Initiate   01-INPROGRESS
6      secondTask     Initiate   02-SUCCESS

所以你可以拥有像

这样的SQL查询
SELECT MAX(SUB_STATE) FROM STATES WHERE activity_name = 'firstTask' and state = 'Check';

Max在这里是一个字符串比较,所以如果你有一个状态超过99个sub_states,那么使用003-SUCCESS等。你也可以使用普通的int数字,但是如果没有进一步的知识,你可以使用普通的int数字。 sql控制台。因此,如果数据大小无关紧要,我宁愿附加有意义的字符串。

在这两种方法中,您都可以轻松引入新状态。