我正在研究文档管理系统.示例工作流程将是这样的:
>文档通过电子邮件发送到系统
>系统对文档执行了许多准备操作
>将文档呈现给用户以进行进一步处理
>之后,文件被发送到质量保证
>之后,系统对文档执行一些或后处理操作
>文档被视为已完全处理和传播(例如,通过电子邮件发回给通过电子邮件发送文档到系统的人等)
由于我输入的音量会有所不同(但通常会很高),我对可伸缩性非常抱歉.
例如,假设系统已下载电子邮件附件.如果附件是PDF文档,系统需要将PDF拆分为单独的页面,然后将每个页面转换为多个大小的缩略图等.我计划进行cron作业检查(例如,每分钟)以查看是否存在PDF需要处理的文件.使用标记系统(例如“PDF文档准备处理”),我可以检查数据库中标记为要处理的所有PDF文档.完成PDF处理后,可以更新标志以说“PDF Processing Done”.
但是,由于每个PDF文档的处理非常耗时,我担心当执行下一个cron作业时,该cron作业还将尝试处理前一个cron作业仍在处理的PDF.
一种可能的解决方案是立即使用“当前正在处理的PDF文档”标记PDF文档.这样,当执行下一个cron作业时,它将排除已经处理的那些作业.
因此,工作流程中的每个步骤可能都有3个标志:
> PDF文档准备处理
>目前正在处理的PDF文档
> PDF处理完成
QA也是如此:
>文件准备好QA
>文档目前正在进行QAd
>文件QA完成
这是一个好方法吗?有更好的方法吗?我会将这些标志作为数据库中“PDF文档”表的单个列吗?或者标志应该是它自己的表(例如,特别是如果文档可以设置多个标志).
我想征求关于如何实施这样一个系统的建议.
最佳答案 要解决您对同一文档的并发处理问题,可以使用许多调度程序包来帮助您管理此方面.
http://www.quartz-scheduler.org/是我用过的非常成功的一个.
为了解决你的问题,我有3个状态,收到,排队,处理(类似于你的建议).
我有一个计划的重复工作,它轮询数据库,寻找收到的pdf,并为每个工作排队一个要处理的作业,并将pdf标记为已排队.如果您确保在同一事务中发生这种情况并利用乐观锁定,则不会有其他工作可能出现的风险并按原样重新读取.
Quartz使用一个带有may配置选项的线程池,非常适合延迟的资源密集型处理(我将它用于服务器设置中的图像缩略图).
要退后一步,Java世界中有一些很棒的工作流程包可以处理你想要做的大部分工作,包括延迟的pdf处理.看看jbpm或drools flow,这两个很棒,如果很复杂的话.
更新:Drools Flow已合并到JBPM中.对于这个特殊的问题,它可能有点“用火箭筒杀死蚊子”的情况,但它是一个很好的工作流程包.