我有一个关于如何处理存储复杂工作流状态以便在数据库中处理任务的最佳实践的问题.我一直在网上看无济于事,所以我想我会问社区他们认为最好的.
这个问题出自我在先前问题中给出的相同"BoxItem"示例.在我的系统中跟踪这个"BoxItem",因为它上面执行了各种任务.任务可能会持续几天并且与人工交互,因此BoxItem的状态必须保持不变.谁完成了任务(如果适用),并且还必须跟踪任务完成的时间.
首先,我通过在"BoxItems"表中为每个需要完成的人工交互任务添加三个字段来解决这个问题:
TaskName是否完整
日期任务名称完成
用户任务名称完成
这在工作流程很简单时起作用......但现在它已经发展成一个复杂的过程(流程中> 10个可能的人类交互...其中大约一半是可选的,可能或可能不会为BoxItem完成,这导致我开始添加"Do TaskName "字段以及那些可选任务),我发现应该是一个简单的表现在有40个左右的字段专门用于保留这个状态信息.
我发现自己在问是否有更好的方法来做到这一点......但我不知所措.
我的第一个想法是制作一个通用的"BoxItemTasks"表,它定义了可以在给定的盒子上完成的任务,但我仍然需要单独保存日期和用户信息,所以它没有真正帮助.
我的第二个想法是,也许这无关紧要,我不应该担心这张桌子有40个或更多的字段用于保留国家......而且我可能只是偏执狂.但感觉这就是要保留的大量信息.
无论如何,我不知道第三种选择可能是什么,或者上述两种选择中的一种是否合理.我可以看到这个工作流程在将来可能变得更加复杂,而且对于每个新任务,我需要添加3-4个字段以支持跟踪它...感觉它正在失控.
在这个情况下,你会怎么做?
我应该注意到这是现有系统的维护,一个没有ORM的系统,所以我不能把它留给ORM来处理它.
编辑:
凯夫,你在谈论做这样的事情:
(PK)BoxItemID
(其他不相关的东西)
(PK)BoxItemID
(PK)BoxItemTaskID
完成了
DateCompleted
UserCompleted
(PK)TaskType
描述(如果有必要的话)
嗯...那会起作用......它代表需要改变我目前处理SQL查询的方式,看看哪些项目处于什么状态,但从长远来看,这样的事情看起来会更好(没有做一个基本的设计改变,比如序列化的想法代表......虽然如果我有时间,我想按照我的想法这样做.).
这就是你提到Kin的原因,还是我对它的关注?
编辑:啊,我看到你的想法与"最后的行动",以确定当前的状态...我喜欢它!我认为这可能对我有用......我可能需要稍微改变它(因为在某些时候任务同时发生),但这个想法似乎是一个好主意!
EDIT FINAL:所以总结一下,如果其他人在将来用同样的问题来看这个......如果你的系统将信息预先加载到某个可查询的界面中,那么序列化方法会很有用(即不是直接调用数据库本身,就像我正在研究的ad-hoc系统那样,但是如果你没有这个,那么附加表的想法似乎应该运行良好!谢谢大家的回复!
Spring Workflow现已发布.
Windows Workflow Foundation有哪些Java替代品?我正在寻找能够提供至少与WWF相同功能的东西,并且具有相同的灵活性和相对易用性.我非常喜欢免费的解决方案.
某个遥控器的Fetch URL和Push URL何时不相同?
例如,当我运行git remote show central远程命名为central时,输出如下:
* remote central
Fetch URL: aoberoi@example.com:/home/aoberoi/Repositories/example.git
Push URL: aoberoi@example.com:/home/aoberoi/Repositories/example.git
HEAD branch: master
Remote branch:
master tracked
Run Code Online (Sandbox Code Playgroud)
我只是不明白为什么我会从两个不同的URL中获取和推送,这是什么类型的工作流程?
是否应该更改代码并在一次提交中对测试套件进行相应的更改,或者将其拆分为两个?考虑一个错误修复的情况,它会导致预期输出发生微小变化,从而迫使测试套件发生微小变化.在同一次提交中同时进行更改非常方便,因为它使审阅者明确了解输出中的更改.另一方面,有时您可能只想查看源的差异,或者想要输出到预期输出的差异,如果提交是分开的,则更容易做到这一点.此外,这两个东西在逻辑上是不同的,因此进行不同的提交是有意义的.
我希望能够做出两个不同的提交,但不知何故有两个提交以某种方式链接在一起(这样我可以挑选,恢复,等两个提交作为一个原子单位).此外,如果进行了两次不同的提交,那么测试套件将在第一次提交时失败(除非引入第三次提交以放松测试套件),使未来的二等分变得痛苦.未来bisects失败的问题通常鼓励我进行单个提交,但是提交应该是逻辑上不同的单元,并且对代码的提交在逻辑上不同于对测试套件中的预期输出的提交.
有没有办法做两个不同的提交,而不必向后弯曲,以防止bisect失败其中一个?(例如,必须明确提及要跳过的提交)
我最近开始使用MQ,因为我喜欢处理孤立补丁和提交而不影响回购的想法,直到变更集足够精确.在此之前,我曾经使用Mercurial的货架扩展,但发现它有点不稳定.我在MQ中仍然想要弄清楚的是如何使补丁彼此分离并且不按特定顺序应用它们,以及跨越不同的分支.这是我的正常流程 -
1.开始处理新补丁:
hg qnew fix-bug-1234 -m "fix bug 1234"
# do some work
hg qrefresh
Run Code Online (Sandbox Code Playgroud)
2.获取要处理的新功能/错误:
hg qpop fix-bug-1234
hg qnew some-feature -m "implement feature X"
# some work on feature X (perhaps in a different branch)
hg qrefresh
Run Code Online (Sandbox Code Playgroud)
3.此时,我想重新开始修复bugfix,并将功能放在一边.我觉得它很简单:
hg qpop some-feature
hg qpush fix-bug-1234
# wrap up bug fix
hg qfinish fix-bug-1234
# get back to work on feature
Run Code Online (Sandbox Code Playgroud)
但是,MQ似乎总是使用系列中创建的最新补丁,并且无论我使用的qpop/qpush命令如何都应用它.我应该注意,我工作的文件也是完全独立的(虽然它们有时可以是相同的).
我在这里错过了什么吗?我应该用hg qqueue它吗?谢谢.
我可以在哪里找到Activiti Alfresco Workflow的简单教程(尤其是自定义工作流程)?
我是Alfresco Activiti Worfklow的新人.谢谢.
将Vagrantfile包含在项目仓库中是一种好的做法吗?
这样,我猜任何开发人员只需克隆repo并根据该Vagrantfile引发一个新的vm机器,这样他就可以准备好整个开发环境,但我不知道这是否是一种正确的管理方式它.
先谢谢,西蒙.
介绍:
我在一家承包商公司工作.我们为不同的企业客户制作SW,每个客户都有自己的规则,SW标准等.
问题:
结果是,我们正在使用几个错误跟踪系统.门票流量相对较大,SLA有时是致命的.主要问题是,我们在自己的BT(目前是Mantis)中跟踪这些门票,但我们也在与他们的BT客户沟通.但事实上,两个通信渠道正在制造太多的信息噪音.
解决方案,进展:
实际解决方案是负责同步流并跟踪SLA和许多其他事情的员工.它消耗了相当大一部分时间(cca 70%)可以花在更有价值的东西上.另一件事是,他不够快,有时同步并没有真正同步.注释的某些部分仅留在一个系统上,有些部分完全丢失.(不要在假期或疾病时开始我,这就是乐趣开始的地方)
题:
如何自动化这个过程:聚合任务,观看SLA,部分或全部通知合适的人等?
谢谢您的回答.
我正在尝试在我的Workflow脚本中包含外部代码,但我遗漏了一些东西.第一步似乎有效.如果路径无效,则会失败:
evaluate( new File('/home/larry.fast/Wkflo.groovy'))
Run Code Online (Sandbox Code Playgroud)
但是我在下面尝试了一些语法变体,并没有找到有效的咒语.所有尝试都产生了"无法解析类mycode.Wkflo"的变体.
def z = mycode.Wkflo()
Run Code Online (Sandbox Code Playgroud)
Wkflo.groovy包含:
package mycode;
def hello() {
echo "Hello from workflow"
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过像run(File())或删除包声明这样的变体.