gpt4 book ai didi

serialization - 在 Activiti BPMN 中使用非序列化对象

转载 作者:行者123 更新时间:2023-12-04 00:11:08 25 4
gpt4 key购买 nike

我想使用 Activiti BPMN 流程来完成一些数据库更新任务。我的流程如下。

开始事件->服务任务1->服务任务2->服务任务3->结束事件

在服务任务 1 的服务实现类中:我为 MySQL 数据库创建了一个 java.sql.Connection。我需要将同一个 Connection 对象传递给服务任务 2 和服务任务 3。基本上,这两个类将使用同一个 Connection 对象对数据库进行一些插入操作。

我尝试如下(dbConn 是包含 java.sql.Connection 类型 dbConnection 的类)

execution.setVariable("DBConn",dbConn); 

但是它给出了一个异常,因为连接对象是不可序列化的。

"org.activiti.engine.ActivitiException: Couldn't serialize value" 

那么在流程的服务任务之间传递此类不可序列化变量的最佳方式是什么?或者有什么方法可以在一个地方为多个服务任务定义这样的公共(public)对象,并在服务任务中使用它们(类似于流程的全局变量)

最佳答案

您可以使用 Java 中的 Thradlocal 将连接对象传递给不同的服务任务。

例如,使用如下所示的基类并从中扩展每个服务任务。然后您可以设置 dbConnection 并在需要时使用 get 方法使用。

public class BaseServiceTask
{
public static final ThreadLocal<Connection> localConnectionContext = new ThreadLocal<Connection>();

public static void initDBConnector(Connection dbConn)
{
localConnectionContext.set(dbConn);
}

public static Connection getDBConnector()
{
return localConnectionContext.get();
}
}

注意事项:
这种方法假定所有服务任务都在同一个线程中执行,这个特定问题就是这种情况,但是一旦包含一些用户任务/计时器(或任何异步逻辑),这就不再是可行的解决方案了!

关于serialization - 在 Activiti BPMN 中使用非序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35112614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com