springbootr如何调用dolphinshceduler

在 Spring Boot 中调用 DolphinScheduler 的接口主要分为两种方式:

  1. 直接调用其 RESTful API(推荐,最常用)
  2. 使用官方提供的 Java API Client(本质是对 REST API 的封装)

下面我将详细讲解这两种方式,并提供代码示例。

方式一:直接调用 RESTful API(推荐)

这是最通用、最灵活的方式。DolphinScheduler 的所有前端操作最终都指向其后端 API,我们只需要在 Spring Boot 中使用 RestTemplateWebClient 来模拟 HTTP 请求即可。

步骤 1:添加依赖

确保pom.xml 中包含 Web 依赖。

复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
步骤 2:编写调用代码

这里以使用 RestTemplate 为例。

a. 配置 RestTemplate 和 API 基础信息

可以在 application.yml 中配置 Dolphinscheduler 服务器的地址和凭证。

复制代码
dolphinscheduler:
  api:
    base-url: http://your-dolphinscheduler-server:12345/dolphinscheduler
    username: admin
    password: admin

b. 编写一个工具类(DolphinSchedulerService)来处理登录和请求

复制代码
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Service
public class DolphinSchedulerService {

    private final String baseUrl;
    private final String username;
    private final String password;
    private final RestTemplate restTemplate;
    private String sessionId; // 存储登录后的 session

    public DolphinSchedulerService(@Value("${dolphinscheduler.api.base-url}") String baseUrl,
                                   @Value("${dolphinscheduler.api.username}") String username,
                                   @Value("${dolphinscheduler.api.password}") String password,
                                   RestTemplate restTemplate) {
        this.baseUrl = baseUrl;
        this.username = username;
        this.password = password;
        this.restTemplate = restTemplate;
    }

    /**
     * 项目启动后自动登录,获取 Session
     */
    @PostConstruct
    public void login() {
        String url = baseUrl + "/login";

        // 设置请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);

        // 设置请求体
        Map<String, String> loginRequest = new HashMap<>();
        loginRequest.put("userName", username);
        loginRequest.put("userPassword", password);

        HttpEntity<Map<String, String>> request = new HttpEntity<>(loginRequest, headers);

        try {
            ResponseEntity<Map> response = restTemplate.postForEntity(url, request, Map.class);
            if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {
                Map<String, Object> data = (Map<String, Object>) response.getBody().get("data");
                this.sessionId = (String) data.get("sessionId");
                System.out.println("Login successful! Session ID: " + sessionId);
            } else {
                throw new RuntimeException("Login failed: " + response.getBody());
            }
        } catch (Exception e) {
            throw new RuntimeException("Failed to login to DolphinScheduler", e);
        }
    }

    /**
     * 创建一个通用的 GET 请求方法,自动携带 Session
     */
    public <T> T get(String apiPath, Class<T> responseType) {
        HttpHeaders headers = new HttpHeaders();
        headers.add("sessionId", sessionId); // DolphinScheduler API 通过 sessionId 鉴权
        HttpEntity<String> entity = new HttpEntity<>(headers);

        String url = baseUrl + apiPath;
        ResponseEntity<T> response = restTemplate.exchange(url, HttpMethod.GET, entity, responseType);
        return response.getBody();
    }

    /**
     * 创建一个通用的 POST 请求方法,自动携带 Session
     */
    public <T> T post(String apiPath, Object requestBody, Class<T> responseType) {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.add("sessionId", sessionId);
        HttpEntity<Object> entity = new HttpEntity<>(requestBody, headers);

        String url = baseUrl + apiPath;
        return restTemplate.postForObject(url, entity, responseType);
    }

    // 可以类似地实现 PUT、DELETE 等方法
}

c. 在 Controller 或 Business Service 中调用具体 API

现在你可以在任何需要的地方注入 DolphinSchedulerService,并调用 Dolphinscheduler 的功能。

示例 1:查询项目列表

复制代码
@RestController
@RequestMapping("/api/ds")
public class TestController {

    @Autowired
    private DolphinSchedulerService dsService;

    @GetMapping("/projects")
    public Object getProjects() {
        // API 路径可以从官方文档找到:/projects/list
        return dsService.get("/projects/list", Object.class);
    }
}

示例 2:启动一个工作流实例

复制代码
@Service
public class MyBusinessService {

    @Autowired
    private DolphinSchedulerService dsService;

    public void runWorkflow(Long projectCode, Long workflowCode) {
        String apiPath = "/projects/" + projectCode + "/executors/start-process-instance";
        
        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("processDefinitionCode", workflowCode);
        // 其他可选参数,如失败策略、优先级、告警组等...
        // requestBody.put("failureStrategy", "CONTINUE");
        // requestBody.put("startNodeList", "node1,node2");
        
        Object response = dsService.post(apiPath, requestBody, Object.class);
        // 处理响应...
        System.out.println("Workflow started: " + response);
    }
}

方式二:使用官方 Java API Client

DolphinScheduler 提供了一个 dolphinscheduler-java-client 模块,它对 REST API 进行了封装。

步骤 1:添加客户端依赖

需要手动找到对应版本的客户端 JAR 包,或者从源码编译。注意:这个客户端可能不是官方主力维护的,使用时需要注意版本兼容性。

如果找不到,方式一更为稳妥。

步骤 2:使用客户端
复制代码
import org.apache.dolphinscheduler.api.DolphinSchedulerClient;
import org.apache.dolphinscheduler.api.DolphinSchedulerClientFactory;
import org.apache.dolphinscheduler.api.request.ProcessStartRequest;
import org.apache.dolphinscheduler.api.response.ProcessStartResponse;

// ... 

public void runWorkflowWithClient() {
    // 1. 创建客户端
    DolphinSchedulerClient client = DolphinSchedulerClientFactory.createClient(
        "http://your-dolphinscheduler-server:12345",
        "admin",
        "admin"
    );

    // 2. 构建请求
    ProcessStartRequest request = new ProcessStartRequest();
    request.setProjectName("my-project"); // 通常用名称或Code标识
    request.setProcessDefinitionName("my-workflow");
    // ... 设置其他参数

    try {
        // 3. 执行调用
        ProcessStartResponse response = client.startProcess(request);
        System.out.println("Process instance ID: " + response.getProcessInstanceId());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

重要注意事项

  1. API 文档 :所有可调用的接口及其参数,请务必查阅对应版本的 DolphinScheduler 官方 REST API 文档 。通常部署好后,访问 http://your-dolphinscheduler-server:12345/dolphinscheduler/doc.html 即可看到 Swagger 文档界面。这是最准确的参考。
  2. 认证(Authentication) :上述示例使用的是 Session 认证(登录后获取 sessionId 并放在 Header 中)。新版本的 DolphinScheduler 也支持 Token 认证,更适用于无状态交互。可以在安全中心生成 Token,然后直接在请求头中添加 "token: YOUR_TOKEN",无需登录步骤。
  3. 错误处理 :在实际生产中,务必为每个远程调用添加完善的错误处理(try-catch)、日志记录和重试机制。
  4. 异步操作:启动工作流等操作是异步的,API 调用成功只代表提交成功,不代表工作流执行成功。需要通过查询执行实例的接口来跟踪最终状态。
  5. 参数传递 :在启动工作流时,可以通过 execTypestartParams 等参数向下游任务传递自定义参数,这在动态控制流程行为时非常有用。

总结

对于大多数 Spring Boot 项目,首选方式一(直接调用 REST API) 。它简单、直接、不受特定客户端库版本和维护状态的限制,并且对整个过程有完全的控制力。只需要一个 HTTP 客户端(如 RestTemplateWebClient)和官方 API 文档即可开始集成。

相关推荐
biyezuopinvip3 小时前
基于Spring Boot的企业网盘的设计与实现(毕业论文)
java·spring boot·vue·毕业设计·论文·毕业论文·企业网盘的设计与实现
szhf783 小时前
SpringBoot Test详解
spring boot·后端·log4j
无尽的沉默3 小时前
SpringBoot整合Redis
spring boot·redis·后端
Coder_Boy_5 小时前
技术发展的核心规律是「加法打底,减法优化,重构平衡」
人工智能·spring boot·spring·重构
猫头虎13 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
MZ_ZXD00115 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
invicinble15 小时前
springboot的核心实现机制原理
java·spring boot·后端
space621232716 小时前
在SpringBoot项目中集成MongoDB
spring boot·后端·mongodb
金牌归来发现妻女流落街头17 小时前
【从SpringBoot到SpringCloud】
java·spring boot·spring cloud