Flowable用了mybatis组件,又实现了自己的command和interceptor机制。具体是怎么实现的呢?
我们以Deployment操作为例,来看看它的调用链
调用端是Service接口, 它委托自己的commandExecutor去执行具体的Command. Command最终会调用到EntityManager,然后委托给ibatis的sqlsession来完成操作。
其中CommandExcutor调用command的地方有些复杂,我们展开看:
CommandExecutor会维护一系列的interceptor, 这些interceptor会包含着最终的command对象,在其前后做一些操作:比如日志,事务,flush等。command对象会调用DbSqlSession将insert,update,delete操作保存到列表里,最终的入库时点是在CommandContextInterceptor执行完毕时,会去flush。
EntityManager也是db模块中比较复杂的部分,其类图如下:
其中MybatisDeploymentDataManager是最终实现类,它将具体操作委托给了ibatis的SqlSession类执行。
public class MybatisDeploymentDataManager extends AbstractProcessDataManager<DeploymentEntity> implements DeploymentDataManager {
public MybatisDeploymentDataManager(ProcessEngineConfigurationImpl processEngineConfiguration) {
super(processEngineConfiguration);
}
@Override
public Class<? extends DeploymentEntity> getManagedEntityClass() {
return DeploymentEntityImpl.class;
}
@Override
public DeploymentEntity create() {
return new DeploymentEntityImpl();
}
@Override
public long findDeploymentCountByQueryCriteria(DeploymentQueryImpl deploymentQuery) {
return (Long) getDbSqlSession().selectOne("selectDeploymentCountByQueryCriteria", deploymentQuery);
}
@Override
@SuppressWarnings("unchecked")
public List<Deployment> findDeploymentsByQueryCriteria(DeploymentQueryImpl deploymentQuery) {
final String query = "selectDeploymentsByQueryCriteria";
return getDbSqlSession().selectList(query, deploymentQuery);
}
@Override
public List<String> getDeploymentResourceNames(String deploymentId) {
return getDbSqlSession().getSqlSession().selectList("selectResourceNamesByDeploymentId", deploymentId);
}
@Override
@SuppressWarnings("unchecked")
public List<Deployment> findDeploymentsByNativeQuery(Map<String, Object> parameterMap) {
return getDbSqlSession().selectListWithRawParameter("selectDeploymentByNativeQuery", parameterMap);
}
@Override
public long findDeploymentCountByNativeQuery(Map<String, Object> parameterMap) {
return (Long) getDbSqlSession().selectOne("selectDeploymentCountByNativeQuery", parameterMap);
}
}