camunda 工作流经验积累

3 篇文章 0 订阅
2 篇文章 0 订阅

1. 删除流程实例:

        1.1. 删除历史流程实例:        

  this.historyService.deleteHistoricProcessInstance( "我是流程实例id" );

         1.2. 删除运行中的流程实例(  删除运行中的流程实例时候,该实例会变成历史流程实例,所以需要两步删除 ):                           

 this.runtimeService.deleteProcessInstance( "我是流程实例id","强制删除流程实例 " + processInstanceId );
 this.historyService.deleteHistoricProcessInstance( "我是流程实例id" );

2.  修改对象类型的流程变量里的属性:

起初开发了一版工作流审批系统,客户已经开始使用了,并且录入了几条真实的数据,后来系统改造了,肯定不能让用户自己重新录入这几条真实的数据,鉴于后台逻辑改动巨大,手动查询数据库修改数据和写程序转换数据都比较麻烦,所以一个最简单且不容易出错的办法就是,把生产环境数据库( product_database ) dump 到一个临时数据库 product_database_temp,然后本地电脑连接 product_database_temp 数据库跑新版本代码,自己充当客户在浏览器手动录入这几条真实数据,但是存在一个问题,就是上传的文件都存储到了本地的  "E://upload" 下,而且流程变量中的文件地址前缀 也是 "E://upload",解决方案就是到时候把本地的  "E://upload" 整个拷贝到 linux 服务器,文件夹名称 改为 "/usr/upload",然后将流程变量中的 文件地址中的 "E://upload" 前缀替换成 "/usr/upload" 前缀,由于复合对象变量在流程实例变量中存储成了二进制,所以下面代码需要使用 java 的对象存取:

import com.alibaba.fastjson.JSONObject;
import com.goldwind.common.CommonConstant;

import java.io.*;
import java.util.*;
import java.sql.*;
 
public class JdbcTest {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/test?" +
                                        "characterEncoding=UTF-8&" +
                                        "useUnicode=true&" +
                                        "user=zhangsan&" +
                                        "password=123455&" +
                                        "useSSL=false&" +
                                        "tinyInt1isBit=false&" +
                                        "allowPublicKeyRetrieval=true&" +
                                        "serverTimezone=Asia/Shanghai&" +
                                        "allowMultiQueries=true";
    private Connection conn = null;
    private PreparedStatement pstmt_read = null;
    private PreparedStatement pstmt_update = null;
    private ResultSet resultSet = null;

    public static void main(String[] args) throws IOException {
        // JdbcTest jdbcTest = new JdbcTest();
        // jdbcTest.doReplace( "E://upload/","/usr/upload/" );
    }
 
    public void doReplace( String replaceTargetStr,String replaceWithStr ){
        InputStream inputStream_businessData =null;
        ByteArrayOutputStream outputStream_businessData=null;
        try{
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
            conn = DriverManager.getConnection(URL);
            pstmt_read = conn.prepareStatement("SELECT * FROM act_ge_bytearray WHERE NAME_='businessData'");
            resultSet = pstmt_read.executeQuery();
            while( resultSet.next() ){
                String id_ = resultSet.getString("ID_");
                inputStream_businessData = resultSet.getBinaryStream("BYTES_");
                outputStream_businessData = new ByteArrayOutputStream();
                this.translateBusinessDataBytesData( inputStream_businessData,outputStream_businessData,replaceTargetStr,replaceWithStr );

                pstmt_update = conn.prepareStatement("UPDATE act_ge_bytearray SET BYTES_=? WHERE ID_=?");
                pstmt_update.setBinaryStream( 1,new ByteArrayInputStream( outputStream_businessData.toByteArray() ) );
                pstmt_update.setString(2,id_ );
                pstmt_update.executeUpdate();
                System.out.println( "替换完毕 id_ =  " + id_ );
            }
        }catch(Exception e){
            e.printStackTrace();
        } finally{
            //关闭用到的资源
            if( inputStream_businessData != null ){
                try {
                    inputStream_businessData.close();
                }catch ( Exception e1 ){
                    e1.printStackTrace();
                }
            }
            if( outputStream_businessData != null ){
                try {
                    outputStream_businessData.close();
                }catch ( Exception e1 ){
                    e1.printStackTrace();
                }
            }
            if( resultSet != null ){
                try {
                    resultSet.close();
                }catch ( Exception e1 ){
                    e1.printStackTrace();
                }
            }
           if( pstmt_read != null ){
               try {
                   pstmt_read.close();
               }catch ( Exception e1 ){
                   e1.printStackTrace();
               }
           }
           if( pstmt_update != null ){
               try {
                   pstmt_update.close();
               }catch ( Exception e1 ){
                   e1.printStackTrace();
               }
           }
            if( conn != null ){
                try {
                    conn.close();
                }catch ( Exception e1 ){
                    e1.printStackTrace();
                }
            }
        }
    }

    private void translateBusinessDataBytesData( InputStream businessDataInputStream,
                                                 OutputStream outputStream_businessData,
                                                 String replaceTargetStr,
                                                 String replaceWithStr ) {
        ObjectInputStream ois = null;
        ObjectOutputStream oos = null;
        try {
            ois = new ObjectInputStream( businessDataInputStream );
            Map<String,Object> businessData = (Map<String, Object>) ois.readObject();
            System.out.println( "替换之前:" );
            System.out.println( JSONObject.toJSONString( businessData ) );
            System.out.println();


            // 替换  businessData.registInfo.usccFilePath
            Map<String,Object> registInfo = (Map<String, Object>) businessData.get(CommonConstant.varname_registInfo);
            if( registInfo != null ){
                String usccFilePath = (String) registInfo.get(CommonConstant.varname_usccFilePath);
                if( usccFilePath != null ){
                    usccFilePath = usccFilePath.replace( replaceTargetStr,replaceWithStr );
                    registInfo.put( CommonConstant.varname_usccFilePath,usccFilePath );
                }
            }

            // 替换 businessData.attachmentFiles[ i ].path
            List<Map<String,Object>> attachmentFiles = (List<Map<String, Object>>) businessData.get(CommonConstant.varname_attachmentFiles);
            if( attachmentFiles != null && attachmentFiles.size() > 0 ){
                for( Map<String,Object> attachmentFile:attachmentFiles ){
                    String path = (String) attachmentFile.get("path");
                    if( path == null ){
                        continue;
                    }
                    path = path.replace( replaceTargetStr,replaceWithStr );
                    attachmentFile.put( "path",path );
                }
            }

            // 替换 businessData.identityInfos[ i ].valueInfo.attachmentFilePath
            List<Map<String,Object>> identityInfos = (List<Map<String, Object>>) businessData.get(CommonConstant.varname_identityInfos);
            if( identityInfos != null && identityInfos.size() > 0 ){
                for( Map<String,Object> identityInfo:identityInfos ){
                    Map<String,Object> valueInfo = (Map<String, Object>) identityInfo.get("valueInfo");
                    if( valueInfo == null || valueInfo.size() == 0 ){
                        continue;
                    }
                    String attachmentFilePath = (String) valueInfo.get(CommonConstant.varname_attachmentFilePath);
                    if( attachmentFilePath == null ){
                        continue;
                    }
                    attachmentFilePath = attachmentFilePath.replace( replaceTargetStr,replaceWithStr );
                    valueInfo.put( CommonConstant.varname_attachmentFilePath,attachmentFilePath );
                }
            }
            System.out.println( "替换之后:" );
            System.out.println( JSONObject.toJSONString( businessData ) );
            oos = new ObjectOutputStream( outputStream_businessData );
            oos.writeObject( businessData );
        }catch ( Exception e ){
            e.printStackTrace();
        }finally {
            if( ois != null ){
                try {
                    ois.close();
                }catch ( Exception e1 ){
                    e1.printStackTrace();
                }
            }
            if( oos != null ){
                try {
                    oos.close();
                }catch ( Exception e2 ){
                    e2.printStackTrace();
                }
            }
        }
    }
}

ps:

1. 因为表 act_ge_bytearray 的字段 BYTES_ 是 blob 类型,所以使用 mybatis 时,实体类应该用 byte[] 类型,不能用 String,使用 String 虽然不会报错,但是会存在编码问题,写入时就乱了,用流时不要保存到文件中,因为保存到文件中涉及到存取,同样存在编码问题,使用 ByteArrayInputSteam 和 ByteArrayOutputSteam 在内存中转换即可

2.  使用之前最好把 camunda 的表 act_ge_bytearray 备份一下,如果转换失败了,可以把表  act_ge_bytearray 删除了,重新导入,删除时会提示外键引用,无法删除,可以先关闭 mysql 的外键约束检查,然后删除,导入完毕之后,再开启外键约束检查,具体命令如下:

# 关闭 外键约束检查
SET FOREIGN_KEY_CHECKS = 0;

删除表 act_ge_bytearray
导入表 act_ge_bytearray

# 开启外键约束检查
SET FOREIGN_KEY_CHECKS = 1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SAP 工作引擎是一种基于角色和任务的工作系统,可以帮助您定义、执行和监视业务程。下面是 SAP 工作引擎的开发步骤: 1. 确定业务需求:在开发 SAP 工作引擎之前,需要明确业务需求和目标。这将有助于您确定哪些程需要自动化,哪些用户需要参与程,以及哪些步骤需要执行特定的任务。 2. 创建工作模板:根据业务需求,您需要创建工作模板。工作模板是定义工作过程的蓝图,包括程模型、任务和事件定义以及规则。您可以使用 SAP 工作建模工具来创建工作模板。 3. 编写工作代码:一旦您创建了工作模板,您需要编写 ABAP 代码来实现它。您可以使用 SAP 工作 API 来访问工作引擎和创建工作实例。 4. 测试和优化:在将工作引擎部署到生产环境之前,需要对其进行测试和优化。您可以使用 SAP 工作仿真器来模拟工作过程并检查其正确性和性能。 5. 部署和监控:一旦您测试通过,并认为 SAP 工作引擎已经满足业务需求,您可以将其部署到生产环境中。在生产环境中,您需要监控工作引擎的性能和可用性,并进行必要的维护和更新。 以上是 SAP 工作引擎的开发步骤。请注意,这是一个复杂的过程,需要深入了解 SAP 技术和编程知识才能实现。 ### 回答2: SAP工作引擎是SAP系统中用于处理业务程的核心组件之一。它可以在SAP系统中自动化和协调不同的业务程,从而提高企业的效率和准确性。 开发SAP工作引擎需要以下几个步骤: 1. 了解业务程:首先,开发人员需要与业务团队合作,详细了解企业的业务程。这将有助于确定需要自动化的程以及工作引擎的设计。 2. 设计工作:在了解业务程的基础上,开发人员可以使用SAP的工作设计器来创建工作。可以定义程的各个步骤、条件、审批者和交互式表单等。 3. 开发工作:通过编写ABAP代码,开发人员可以在SAP系统中实现工作。这包括创建任务、定义事件触发器、编写程序逻辑以及处理各种异常情况等。 4. 测试和调试:在开发完成后,需要对工作进行测试和调试,以确保其正确运行。可以使用SAP的测试工具来验证每个步骤是否按照预期的方式执行。 5. 部署和维护:当工作经过测试并且没有问题后,可以将其部署到生产环境中。同时,开发人员还需要监控工作的运行情况,定期进行维护和优化。 总之,开发SAP工作引擎需要深入了解业务程,设计和实现工作,并对其进行测试和维护。这样可以帮助企业提高工作效率和准确性,同时优化业务程。 ### 回答3: SAP工作引擎是一种用于自动化和管理业务程的工具。要开发SAP工作引擎,可以按照以下步骤进行: 1. 分析业务需求:首先,了解所需的业务程,并确定哪些活动需要自动化和管理。了解程的开始和结束点以及涉及的各个步骤。 2. 设计工作图:使用SAP工作设计器,可以创建工作图。在此过程中,将所有活动、决策和条件都绘制为程图。这将有助于理解和可视化整个程。 3. 配置工作步骤:使用SAP工作引擎配置工作步骤。这可能涉及设置触发条件,定义活动和决策,并确定每个步骤应采取的操作。 4. 编写ABAP代码:根据工作图和配置的步骤,编写ABAP代码来实现相应的功能。这可以包括定义和处理工作事件、触发器等。 5. 测试和调试:在实施工作之前,进行严格的测试和调试,以确保工作在各种情况下的正确运行。这包括验证各个步骤的触发条件、活动和决策的准确性。 6. 实施工作:将开发和测试完成的工作部署到SAP系统中,以便用户可以使用。确保工作与其他系统组件和用户界面进行良好的集成。 7. 监控和维护工作:一旦工作部署,就需要定期监控和维护它。这涉及到解决任何运行时问题、更新工作配置和处理用户的反馈。 通过以上步骤,可以开发和部署一个功能完善的SAP工作引擎,以实现业务程的自动化和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值