18、Camunda Script Task Groovy 发送POST请求

这篇博客介绍了如何在Groovy中发送POST请求到REST接口,包括引入相关依赖,编写Groovy脚本,以及在Camunda流程中执行脚本。通过示例展示了如何设置请求参数、访问流程变量,并在脚本中处理响应。此外,还提到了脚本中访问流程引擎服务的方法。
摘要由CSDN通过智能技术生成

引入依赖

<!--Spring boot 集成camunda-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter</artifactId>
            <version>7.15.0</version>
        </dependency>
        <!--camunda Rest 接口-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-rest</artifactId>
            <version>7.15.0</version>
        </dependency>
        <!--camunda webapp 页面操作流程-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-webapp</artifactId>
            <version>7.15.0</version>
        </dependency>

        <!--外部任务客户端-->
        <dependency>
            <groupId>org.camunda.bpm.springboot</groupId>
            <artifactId>camunda-bpm-spring-boot-starter-external-task-client</artifactId>
            <version>7.15.0</version>
        </dependency>

        <!--连接器-->
        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine-plugin-connect</artifactId>
            <version>7.15.0</version>
        </dependency>

        <!--Spin和Json  Rest Http中解析; parse http response variable with camunda-spin-->
        <dependency>
            <groupId>org.camunda.bpm</groupId>
            <artifactId>camunda-engine-plugin-spin</artifactId>
            <version>7.15.0</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.spin</groupId>
            <artifactId>camunda-spin-dataformat-json-jackson</artifactId>
            <version>1.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.spin</groupId>
            <artifactId>camunda-spin-core</artifactId>
            <version>1.10.1</version>
        </dependency>
        <dependency>
            <groupId>org.camunda.spin</groupId>
            <artifactId>camunda-spin-dataformat-all</artifactId>
            <version>1.10.1</version>
        </dependency>

        <!--执行groovy脚本-->
        <!--org.camunda.bpm.engine.exception.NullValueException: Can't find scripting engine for 'groovy': scriptEngine is null-->
        <dependency>
            <groupId>org.codehaus.groovy</groupId>
            <artifactId>groovy-all</artifactId>
            <version>2.4.21</version>
        </dependency>
        <!--groovy发送Http请求,底层是对HTTPClient封装 HttpBuilder-->
        <dependency>
            <groupId>org.codehaus.groovy.modules.http-builder</groupId>
            <artifactId>http-builder</artifactId>
            <version>0.7.1</version>
        </dependency>

1、脚本发送POST请求

在这里插入图片描述

Groovy脚本 发送POST请求

import groovyx.net.http.HTTPBuilder
import groovyx.net.http.ContentType
import groovyx.net.http.Method
import groovyx.net.http.RESTClient
import groovyx.net.http.HttpResponseDecorator


def http = new HTTPBuilder('http://localhost:8010')
http.request(Method.POST ,ContentType.TEXT) { 
    //请求URL路径信息
    uri.path='/conn/two' 
	//请求参数信息 [id:'666',name:'jake']
    uri.query=[id:'1'] 
    //设置请求头信息 
    headers.'User-Agent' = 'Mozill/5.0' 
    //设置成功响应的处理闭包 
	//resp 数据类型:groovyx.net.http.HttpResponseDecorator;reader 数据类型:java.io.InputStreamReader
    response.success= {resp,reader-> 
        println resp.status 
        println resp.statusLine.statusCode 
        println resp.headers.'content-length' 
		println resp
		println reader
        System.out << reader 
    } 
    //根据响应状态码分别指定处理闭包 
    response.'404' = { println 'not found' }
    //未根据响应码指定的失败处理闭包 
    response.failure = { println "Unexpected failure: ${resp.statusLine}" }
}

开启流程

/**
     * 发送Post请求
     */
    @Test
    public void httpPost(){
        String processKey="GroovyHttp1";
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey);
        log.info("流程开启:{}",processInstance.getId());
    }

案例Rest接口

@RestController
@RequestMapping("/conn")
@Slf4j
public class ConnectionController {
    @PostMapping("/two")
    public String connTest2(String id){
        log.info("{流程实例ID:{}}",id);
        return "post-two";
    }

groovy 脚本一些笔记

1、嵌套的Groovy 脚本不需要 <![CDATA[ ]]>  包裹;
2、脚本中打印 println "Sum: " + sum  用于调试脚本;
3、脚本中设置流程变量:execution.setVariable("sum", sum);  或者 脚本返回值作为变量,脚本最后1行默认是脚本返回值;
4、脚本中可以直接使用流程中的变量 inputArray;
5、Groovy 脚本可调用远程Http请求地址;
6、Groovy脚本中 def 定义的变量,自动写入到流程变量中;def pid=execution.getProcessInstanceId()

2、groovy 案例2

2.1、流程和groovy脚本

在这里插入图片描述

def pid=execution.getProcessInstanceId()
sum = 0
        for ( i in inputArray ) {
          sum += i
        }
        println "Sum: " + sum
        execution.setVariable("sum", sum);
        sum

2.2、流程开启设置变量

/**
     * 简单执行Groovy脚本
     */
    @Test
    public void simpleTest(){
        String processKey="groovy1";
        Map<String,Object> variables=new HashMap<>();
        variables.put("inputArray",new Integer[]{2,3,5});
        //流程启动时,向连接器传递变量
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey,variables);
        log.info("流程开启:{}",processInstance.getId());
    }

在脚本的执行过程中,所有在当前范围内可见的流程变量都是可用的。

可以通过变量的名称直接访问(例如,sum)。

但JRuby不同,你必须把变量当做ruby全局变量来访问(在前面加一个美元符号,即$sum)

还有一些特殊的变量,在脚本中可以直接使用

执行监听器(脚本任务):execution DelegateExecution 类型
任务监听器:task DelegateTask 类型
脚本在连接器的变量范围内执行:connector ConnectorVariableScope 类型

流程信号事件上可以获取流程信息:
Signal_EndReport-${execution.processBusinessKey}
在这里插入图片描述

脚本中访问流程引擎服务

// 获取流程变量
sum = execution.getVariable('x')

// 设置流程变量
execution.setVariable('y', x + 15)

// 获取 task service 查询 task
task = execution.getProcessEngineServices().getTaskService()
  .createTaskQuery()
  .taskDefinitionKey("task")
  .singleResult()

// 脚本中访问流程引擎服务
execution.getProcessEngineServices().getRuntimeService().createMessageCorrelation("work").correlateWithResult();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值