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

Sql server Camunda服务任务-运行时同步/异步决策,sql-server,spring-boot,asynchronous,camunda,Sql Server,Spring Boot,Asynchronous,Camunda,我们将Camunda BPM与Spring Boot和MS SqlServer一起使用,我们希望实现通用服务任务,该任务在运行时决定是运行同步还是异步(基于所调用服务的元数据)。若服务以同步/异步方式工作,那个么它将允许我们轻松地建模特定的流程,而无需“硬编码”信息 它使用以下代码工作得非常好: class CustomServiceTask : AbstractBpmnActivityBehavior() { @Throws(Exception::class) overrid

我们将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()

但不确定它是否正确。

我认为您误解了
asyncBefore
asyncAfter
标志的用法和含义

这些标志指示引擎应该在任务之前或之后异步。它们标记了交易边界。例如,在执行任务后,通过
asyncAfter
到达任务意味着将提交事务,并创建新作业以继续异步工作流处理。有关更多信息,请参阅

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


作为替代方案,您可以使用我在评论中提到的,或者简单地发送和接收任务。

为什么需要它?用例是什么?您考虑过外部任务吗?目标是对同步和异步任务使用相同的服务任务impl,并使模型独立于事实(如果服务是同步或异步工作的);实际上,我们希望在运行时更改它,并且仍然使用相同的进程。外部任务-虽然我喜欢这个概念,但由于轮询等开销,我们希望避免它。