> For the complete documentation index, see [llms.txt](https://cxz.gitbook.io/spring-cloud-date-flow/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cxz.gitbook.io/spring-cloud-date-flow/tasks/untitled-6.md).

# Composed Tasks DSL

Composed Task 可以通过三种方式运行：

* [Conditional Execution](https://docs.spring.io/spring-cloud-dataflow/docs/2.1.0.RELEASE/reference/htmlsingle/#spring-cloud-data-flow-conditional-execution)
* [Transitional Execution](https://docs.spring.io/spring-cloud-dataflow/docs/2.1.0.RELEASE/reference/htmlsingle/#spring-cloud-data-flow-transitional-execution)
* [Split Execution](https://docs.spring.io/spring-cloud-dataflow/docs/2.1.0.RELEASE/reference/htmlsingle/#spring-cloud-data-flow-split-execution)

## 1. Conditional Execution (条件执行)

使用（`&&`）表示条件执行。这使得序列中的每个任务只有在前一个任务成功完成时才会启动，如以下示例所示：

`task create my-composed-task --definition "task1 && task2"`

当`my-composed-task` Composed Task 启动时，它会先启动 `task1`，如果成功完成，则`task2`开始启动。如果`task1`失败，`task2`则不启动。

您还可以使用 Spring Cloud Data Flow Dashboard 创建条件执行，直接在拖放关联即可，如下图所示：

![组合任务条件执行](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-conditional-execution.png)

上图是使用 Spring Cloud Data Flow Dashboard 创建的 directed graph(有向图)。您可以看到图中包含条件执行的四个组件：

* Start icon：所有directed graph(有向图)都从此符号开始。只有一个。
* Task icon：表示directed graph(有向图)中的每个任务。
* Solid line arrow（实线箭头）：表示以下各项之间的流条件执行流程连接导向：
  * 两个应用程序
  * 启动控制节点和应用程序。
  * 应用程序和结束控制节点。
* End icon：所有directed graph(有向图)都以此符号结束。

## 2. Transitional Execution(转换执行)

DSL支持对 directed graph(有向图) 执行期间的 transitions(转换) 进行细粒度控制。通过提供基于前一个 Task 的退出状态的相同条件进行转换。Task 转换由`->`符号表示。

### **2.1. Basic Transition**

Basic Transition 如下所示：

```bash
task create my-transition-composed-task \
--definition "foo 'FAILED' -> bar 'COMPLETED' -> baz"
```

在上面的示例中，将启动`foo`，如果它的退出状态为 `FAILED`，则`bar`任务将启动。如果退出状态为`COMPLETED`，则`baz`会启动。其他状态则会终止执行。

使用 Spring Cloud Data Flow Dashboard 创建一个相同的 `basic transition` 将如下所示：

![组合任务基本过渡](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-transition-basic.png)

上图是在 Spring Cloud Data Flow Dashboard 中创建的有向图的屏幕截图。请注意，有两种不同类型的连接器：

* 虚线：表示从 Applications 到可能的目标应用程序之一的转换。
* 实线：Applications 之间或与控制节点之间（开始和结束）的连接。

要创建连接器：

1. When creating a transition, link the application to each possible destination by using the connector.
2. Once complete, go to each connection and select it by clicking it.
3. A bolt icon appears.
4. Click that icon.
5. Enter the exit status required for that connector.
6. The solid line for that connector turns to a dashed line.

### **2.2.  Transition  通配符使用**

DSL 支持通配符，如下所示：

```bash
task create my-transition-composed-task \
--definition "foo 'FAILED' -> bar '*' -> baz"
```

在上面的示例中，将启动`foo`，如果它的退出状态为 `FAILED`，则`bar`任务将启动。如果退出状态为`COMPLETED`，则`baz`会启动。其他状态则会终止执行。

使用 Spring Cloud Data Flow Dashboard  创建"带通配符的Transition"将类似于以下图像：

![使用通配符组合任务基本过渡](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-transition-basic-wildcard.png)

### **2.3. Transition  使用条件执行**

Transition 只要不使用通配符，就可以使用条件执行，如以下示例所示：

```bash
task create my-transition-conditional-execution-task 
--definition "foo 'FAILED' -> bar 'UNKNOWN' -> baz && qux && quux"
```

在前面的示例中，`foo`将启动，如果它的退出状态为`FAILED`，则`bar`任务将启动。如果`foo`的退出状态为`UNKNOWN`，`baz`则会启动。除`FAILED`和`UNKNOWN` 之外的任何退出状态，将启动`qux`，并在完成后启动`quux`。

使用 Spring Cloud Data Flow Dashboard 创建将类似于以下图像：

![具有条件执行的组合任务转换](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-transition-conditional-execution.png)

## 3. 拆分执行

拆分允许 Composed Task 中的多个任务并行运行。它通过使用尖括号（`<>`）来表示要并行运行的Task和Stream。由`||`符号分隔，如以下示例所示：

`task create my-split-task --definition "<foo || bar || baz>"`

上述前面的例子中启动并行任务`foo`，`bar`和`baz`。

使用 Spring Cloud Data Flow Dashboard 创建类似于以下图像：

![组合任务拆分](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-split.png)

使用 Task DSL 配置，用户也可以连续执行多个拆分，如以下示例所示：

`task create my-split-task --definition "<foo || bar || baz> && <qux || quux>"`

在前面的例子，任务`foo`，`bar`以及`baz`被并行启动。一旦他们都完成，则任务`qux`和`quux`继续并行开始执行。完成后，组合任务结束。但是，如果`foo`，`bar`或`baz`其中失败，则`qux`和`quux`不会启动。

使用 Spring Cloud Data Flow Dashboard  创建将类似于以下图像：

![组合任务拆分](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-multiple-splits.png)

请注意，在连接两个连续的拆分时，会插入一个`SYNC`控制节点。

{% hint style="info" %}
拆分中使用的 Task 不应设置它们`ExitMessage`。设置`ExitMessage`仅用于  [Basci Transitions](https://docs.spring.io/spring-cloud-dataflow/docs/2.1.0.RELEASE/reference/htmlsingle/#spring-cloud-data-flow-transitional-execution)。
{% endhint %}

### **3.1. 包含条件执行的拆分**

拆分也可以在尖括号内进行条件执行，如以下示例所示：

`task create my-split-task --definition "<foo && bar || baz>"`

在前面的示例中，我们看到`foo`和`baz`是并行启动的。但是，`bar`直到`foo`成功完成后才会启动。

使用Spring Cloud Data Flow Dashboard创建类似于以下图像：

![组合任务与条件执行分离](https://raw.githubusercontent.com/spring-cloud/spring-cloud-dataflow/master/spring-cloud-dataflow-docs/src/main/asciidoc/images/dataflow-ctr-split-contains-conditional.png)

### **3.2. 为拆分建立正确的线程数**

拆分中包含的每个子 Task 都需要一个线程才能执行。要正确设置的话，您需要根据图形计算出最大并行数量，这将是您需要使用的线程数。要设置线程计数，请使用`split-thread-core-pool-size`属性（默认为1）。因此，例如，定义如下：`<AAA || BBB || CCC> && <DDD || EEE>`将需要`split-thread-core-pool-size`为3.这是因为最大的split包含3个子任务。计数如果为2，将意味着`AAA`和`BBB`将并行运行但`CCC`将等到其中一个完成以后才能运行。然后，`DDD`和`EEE`将继续并行运行。
