Camunda服务任务-在运行时同步/异步决策

时间:2018-08-29 09:08:10

标签: sql-server spring-boot asynchronous camunda

我们将Camunda BPM与Spring Boot和MS SqlServer一起使用,并且我们想实现通用服务任务,该任务在运行时决定运行同步还是异步(基于被调用的服务的元数据)。如果服务以同步/异步方式工作,这将使我们能够轻松地对特定过程建模,而无需“硬编码”信息。

使用以下代码,效果很好:

class CustomServiceTask : AbstractBpmnActivityBehavior() {

    @Throws(Exception::class)
    override fun execute(execution: ActivityExecution) {

        val isSync: Boolean = ... // get service info
        if (isSync) {

            // do your stuff in sync mode  
            // invoke service, for example via REST 

            leave(execution)

        } else {

            // do your async stuff here - do something like:
            //  - submit jms/kafka/... message
            //  - start another process
            //  - ... 

            // TODO: enforce persisting process to db here?
        }

    }

    @Throws(Exception::class)
    override fun signal(execution: ActivityExecution, signalName: String?, signalData: Any?) {

        logger.info("${execution.activity.id}: Received signal for execution [${execution.id}] now, leaving execution now.")
        // leave the service task activity:
        leave(execution)
    }

    companion object {
        private val logger = LoggerFactory.getLogger(CustomServiceTask::class.java)!!
    }

}

无论如何,还有一个问题-有时会发生,异步服务太快,它会在状态保持在camunda数据库之前通知进程,如果我正确理解,可以通过标记服务任务来解决asyncBefore / asyncAfter,它强制执行服务任务代码后提交事务。 (正确吗?)

是否可以通过服务任务本身的代码来实现相同目的?

我正在尝试

Context.getCommandContext().transactionContext.commit()

但不确定是否正确。

1 个答案:

答案 0 :(得分:0)

我认为您误解了asyncBeforeasyncAfter标志的用法和含义。

这些标志指示引擎应该在任务之前或之后进入异步状态。它们标记了交易边界。例如,使用asyncAfter到达任务意味着在执行任务之后,将提交事务并创建一个新作业,以继续异步进行工作流处理。有关更多信息,请参见Transactions in processes documentation

这并不意味着您的任务实现是异步的。要实现这一点,要复杂得多。您可以看看这个blogpost。但是请注意,此解决方案使用内部API。

作为替代方案,您可以使用我在评论中提到的external task pattern或直接发送和接收任务。