Workflows mit Clientbibliotheken ausführen

Führen Sie einen Workflow mit Clientbibliotheken aus. Fragt die Ausführung des Workflows mit exponentiellem Backoff ab, bis die Ausführung beendet ist, und gibt dann die Ergebnisse aus.

Dokumentationsseiten mit diesem Codebeispiel

Die folgenden Dokumente enthalten das Codebeispiel im Kontext:

Codebeispiel

Java

Bevor Sie dieses Beispiel anwenden, folgen Sie der Anleitung zur Einrichtung von Java in der Workflows-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Workflows Java API.


// 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

Bevor Sie dieses Beispiel ausprobieren, folgen Sie der Anleitung für die Einrichtung von Node.js in der Workflows-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Angaben finden Sie in der Referenzdokumentation zur Workflow Node.js API.

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

Bevor Sie dieses Beispiel anwenden, folgen Sie der Anleitung für die Einrichtung von Python in der Workflows-Kurzanleitung zur Verwendung von Clientbibliotheken. Weitere Informationen finden Sie in der Referenzdokumentation zur Workflows Python API.

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

Nächste Schritte

Informationen zum Suchen und Filtern von Codebeispielen für andere Google Cloud-Produkte finden Sie im Google Cloud-Beispielbrowser.