Usar bibliotecas de cliente para executar um fluxo de trabalho

Usa bibliotecas de cliente para executar um fluxo de trabalho. Pesquisa a execução do fluxo de trabalho usando a espera exponencial até o fim da execução e exibe os resultados.

Páginas de documentação que incluem esta amostra de código

Para visualizar o exemplo de código usado em contexto, consulte a seguinte documentação:

Amostra de código

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do Workflows: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Workflows para Java.


// Imports the Google Cloud client library

import com.google.cloud.workflows.executions.v1.CreateExecutionRequest;
import com.google.cloud.workflows.executions.v1.Execution;
import com.google.cloud.workflows.executions.v1.ExecutionsClient;
import com.google.cloud.workflows.executions.v1.WorkflowName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

public class WorkflowsQuickstart {

  private static final String PROJECT = System.getenv("GOOGLE_CLOUD_PROJECT");
  private static final String LOCATION = System.getenv().getOrDefault("LOCATION", "us-central1");
  private static final String WORKFLOW = System.getenv().getOrDefault("WORKFLOW",
      "myFirstWorkflow");

  public static void main(String... args)
      throws IOException, InterruptedException, ExecutionException {
    if (PROJECT == null) {
      throw new IllegalArgumentException(
        "Environment variable 'GOOGLE_CLOUD_PROJECT' is required to run this quickstart.");
    }
    workflowsQuickstart(PROJECT, LOCATION, WORKFLOW);
  }

  private static volatile boolean finished;

  public static void workflowsQuickstart(String projectId, String location, String workflow)
      throws IOException, InterruptedException, ExecutionException {
    // Initialize client that will be used to send requests. This client only needs
    // to be created once, and can be reused for multiple requests. After completing all of your
    // requests, call the "close" method on the client to safely clean up any remaining background
    // resources.
    try (ExecutionsClient executionsClient = ExecutionsClient.create()) {
      // Construct the fully qualified location path.
      WorkflowName parent = WorkflowName.of(projectId, location, workflow);

      // Creates the execution object.
      CreateExecutionRequest request =
          CreateExecutionRequest.newBuilder()
              .setParent(parent.toString())
              .setExecution(Execution.newBuilder().build())
              .build();
      Execution response = executionsClient.createExecution(request);

      String executionName = response.getName();
      System.out.printf("Created execution: %s%n", executionName);

      long backoffTime = 0;
      long backoffDelay = 1_000; // Start wait with delay of 1,000 ms
      final long backoffTimeout = 10 * 60 * 1_000; // Time out at 10 minutes
      System.out.println("Poll for results...");

      // Wait for execution to finish, then print results.
      while (!finished && backoffTime < backoffTimeout) {
        Execution execution = executionsClient.getExecution(executionName);
        finished = execution.getState() != Execution.State.ACTIVE;

        // If we haven't seen the results yet, wait.
        if (!finished) {
          System.out.println("- Waiting for results");
          Thread.sleep(backoffDelay);
          backoffTime += backoffDelay;
          backoffDelay *= 2; // Double the delay to provide exponential backoff.
        } else {
          System.out.println("Execution finished with state: " + execution.getState().name());
          System.out.println("Execution results: " + execution.getResult());
        }
      }
    }
  }
}

Node.js

Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido do Workflows: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Workflows para Node.js.

const {ExecutionsClient} = require('@google-cloud/workflows');
const client = new ExecutionsClient();

/**
 * Sleeps the process N number of milliseconds.
 * @param {Number} ms The number of milliseconds to sleep.
 */
function sleep(ms) {
  return new Promise(resolve => {
    setTimeout(resolve, ms);
  });
}

// Execute workflow
try {
  const createExecutionRes = await client.createExecution({
    parent: client.workflowPath(projectId, location, workflow),
  });
  const executionName = createExecutionRes[0].name;
  console.log(`Created execution: ${executionName}`);

  // Wait for execution to finish, then print results.
  let executionFinished = false;
  let backoffDelay = 1000; // Start wait with delay of 1,000 ms
  console.log('Poll every second for result...');
  while (!executionFinished) {
    const [execution] = await client.getExecution({
      name: executionName,
    });
    executionFinished = execution.state !== 'ACTIVE';

    // If we haven't seen the result yet, wait a second.
    if (!executionFinished) {
      console.log('- Waiting for results...');
      await sleep(backoffDelay);
      backoffDelay *= 2; // Double the delay to provide exponential backoff.
    } else {
      console.log(`Execution finished with state: ${execution.state}`);
      console.log(execution.result);
      return execution.result;
    }
  }
} catch (e) {
  console.error(`Error executing workflow: ${e}`);
}

Python

Antes de testar essa amostra, siga as instruções de configuração para Python no Guia de início rápido do Workflows: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Workflows para Python.

import time

from google.cloud import workflows_v1beta
from google.cloud.workflows import executions_v1beta
from google.cloud.workflows.executions_v1beta.types import executions

# TODO(developer): Uncomment these lines and replace with your values.
# project = 'my-project-id'
# location = 'us-central1'
# workflow = 'myFirstWorkflow'

if not project:
    raise Exception('GOOGLE_CLOUD_PROJECT env var is required.')

# Set up API clients.
execution_client = executions_v1beta.ExecutionsClient()
workflows_client = workflows_v1beta.WorkflowsClient()

# Construct the fully qualified location path.
parent = workflows_client.workflow_path(project, location, workflow)

# Execute the workflow.
response = execution_client.create_execution(request={"parent": parent})
print(f"Created execution: {response.name}")

# Wait for execution to finish, then print results.
execution_finished = False
backoff_delay = 1  # Start wait with delay of 1 second
print('Poll every second for result...')
while (not execution_finished):
    execution = execution_client.get_execution(request={"name": response.name})
    execution_finished = execution.state != executions.Execution.State.ACTIVE

    # If we haven't seen the result yet, wait a second.
    if not execution_finished:
        print('- Waiting for results...')
        time.sleep(backoff_delay)
        backoff_delay *= 2  # Double the delay to provide exponential backoff.
    else:
        print(f'Execution finished with state: {execution.state.name}')
        print(execution.result)
        return execution.result

A seguir

Para pesquisar e filtrar exemplos de código de outros produtos do Google Cloud, consulte o navegador de exemplos do Google Cloud.