通过前面的章节介绍,我们任务已经正常产生,并且加入到队列中,等待被执行了
但是,我们需要注意的一个问题,如果直接通过多线程获取队列中待执行的任务异步并行执行,此时每个任务的执行先后顺序是无法保证的,从而可能给业务带来问题
如下图
有的业务场景下 并不需要保证任务执行的先后顺序
例如流程结束后触发产生消息,第一条流程结束之后,紧接着第二条流程结束,此时并不会要求一定需要等到第一条流程消息送达之后,第二条流程产生的消息才能送达,所以这种类型的触发,是允许并行执行的
而有的场景下,是需要严格保证触发任务执行的先后顺序的
例如流程结束触发修改底表金额,第一条流程结束之后,需要先修改底表金额,当第二条流程结束时,如果底表可用金额不够,那么第二条流程的触发任务应该是不允许执行的 (该业务场景不严谨,仅供举例),所以这种类型的触发需要严格保证触发顺序,需要等待之前的任务执行完毕之后,自己才能执行
所以,触发任务在产生之后,其实并不是直接放入到待执行队列中,然后简单的由多线程取出任务执行,而是会放到待分析任务队列,等待分析是否能够并行执行和触发执行顺序
代码如下
流程图如下
所以最终,允许并行的的任务,被放到parallelTaskQueue 中,线程池中的线程可以直接从该队列中取出任务开始执行
而需要控制执行顺序的任务,则在needAnalysisTaskQueue中等待被进一步的解析
综上 触发队列引入了触发任务环,用于控制触发任务的执行顺序