sql-server - 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()
但不确定它是否正确。
解决方案
asyncBefore
我认为您误解了andasyncAfter
标志的用法和含义。
这些标志表明引擎应该在任务之前或之后异步。它们标记了事务边界。例如,以某种asyncAfter
方式完成任务,在执行任务后将提交事务并创建新作业以继续异步处理工作流。有关更多信息,请参阅流程文档中的事务。
这并不意味着您的任务实现是异步的。实现这一点要复杂得多。你可以看看这篇博文。但请注意,此解决方案使用内部 API。
作为替代方案,您可以使用我在评论中提到的外部任务模式,或者只是发送和接收任务。
推荐阅读
- android - 深度链接在测试时工作但不在生产中,Android Cordova Webview
- c# - 构造函数的依赖注入
- reactjs - 将“组件”作为“通用”类型的道具传递
- python - How to split the csv file with line numbers which pass as parameter and save into different files
- javascript - 如何使用函数发出 api 获取请求?
- javascript - 当父应用程序选项卡关闭时触发 iframe 应用程序中的卸载事件
- xml - 是否有任何可以将 XML 内容读入 KAFKA 的 Kafka 连接器?
- linux - 如何使用 sed 替换文件中的值
- java - 上传多部分文件列表时springboot出错
- dialogflow-es - 如何通过 Dialogflow Fulfillment 向 Facebook 发送快速回复