From 696b71cb40208e5d5ed18e84d4aea1f4581a5867 Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Sun, 17 Dec 2023 15:31:16 -0500 Subject: [PATCH 1/5] update to SpringBoot 3 Signed-off-by: Tihomir Surdilovic --- springboot/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/springboot/build.gradle b/springboot/build.gradle index 569e1cc9..1cd62751 100644 --- a/springboot/build.gradle +++ b/springboot/build.gradle @@ -24,4 +24,9 @@ bootJar { jar { enabled = true +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } \ No newline at end of file From c59d30d596d325751520abd52aeb11d193fd4259 Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Thu, 28 Dec 2023 22:15:20 -0500 Subject: [PATCH 2/5] hello delayed start sample Signed-off-by: Tihomir Surdilovic --- .../samples/hello/HelloDelayedStart.java | 131 ++++++++++++++++++ .../samples/hello/HelloDelayedStartTest.java | 69 +++++++++ 2 files changed, 200 insertions(+) create mode 100644 core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java create mode 100644 core/src/test/java/io/temporal/samples/hello/HelloDelayedStartTest.java diff --git a/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java b/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java new file mode 100644 index 00000000..8280111c --- /dev/null +++ b/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java @@ -0,0 +1,131 @@ +/* + * Copyright (c) 2020 Temporal Technologies, Inc. All Rights Reserved + * + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package io.temporal.samples.hello; + +import io.temporal.client.WorkflowClient; +import io.temporal.client.WorkflowOptions; +import io.temporal.common.WorkflowExecutionHistory; +import io.temporal.serviceclient.WorkflowServiceStubs; +import io.temporal.worker.Worker; +import io.temporal.worker.WorkerFactory; +import io.temporal.workflow.Workflow; +import io.temporal.workflow.WorkflowInterface; +import io.temporal.workflow.WorkflowMethod; +import java.time.Duration; + +/** Sample Temporal Workflow Definition that shows how to use delayed start. */ +public class HelloDelayedStart { + // Define the task queue name + static final String TASK_QUEUE = "HelloDelayedStartTaskQueue"; + + // Define our workflow unique id + static final String WORKFLOW_ID = "HelloDelayedStartWorkflow"; + + /** + * The Workflow Definition's Interface must contain one method annotated with @WorkflowMethod. + * + *

Workflow Definitions should not contain any heavyweight computations, non-deterministic + * code, network calls, database operations, etc. Those things should be handled by the + * Activities. + * + * @see io.temporal.workflow.WorkflowInterface + * @see io.temporal.workflow.WorkflowMethod + */ + @WorkflowInterface + public interface DelayedStartWorkflow { + + /** + * This is the method that is executed when the Workflow Execution is started. The Workflow + * Execution completes when this method finishes execution. + */ + @WorkflowMethod + void start(); + } + + // Define the workflow implementation which implements our start workflow method. + public static class DelayedStartWorkflowImpl implements DelayedStartWorkflow { + @Override + public void start() { + // this workflow just sleeps for a second + Workflow.sleep(Duration.ofSeconds(1)); + } + } + + public static void main(String[] args) { + // Get a Workflow service stub. + WorkflowServiceStubs service = WorkflowServiceStubs.newLocalServiceStubs(); + + /* + * Get a Workflow service client which can be used to start, Signal, and Query Workflow Executions. + */ + WorkflowClient client = WorkflowClient.newInstance(service); + + /* + * Define the workflow factory. It is used to create workflow workers for a specific task queue. + */ + WorkerFactory factory = WorkerFactory.newInstance(client); + + /* + * Define the workflow worker. Workflow workers listen to a defined task queue and process + * workflows and activities. + */ + Worker worker = factory.newWorker(TASK_QUEUE); + + /* + * Register our workflow implementation with the worker. + * Workflow implementations must be known to the worker at runtime in + * order to dispatch workflow tasks. + */ + worker.registerWorkflowImplementationTypes(DelayedStartWorkflowImpl.class); + + /* + * Start all the workers registered for a specific task queue. + * The started workers then start polling for workflows and activities. + */ + factory.start(); + + DelayedStartWorkflow workflow = + client.newWorkflowStub( + DelayedStartWorkflow.class, + WorkflowOptions.newBuilder() + .setWorkflowId(WORKFLOW_ID) + .setTaskQueue(TASK_QUEUE) + // set delayed start in 10s + .setStartDelay(Duration.ofSeconds(2)) + .build()); + + workflow.start(); + + // Delayed executions are still created right away by the service but + // they have a firstWorkflowTaskBackoff set to the delay duration + // meaning the first workflow task is dispatched by service + // 2 second after exec is started in our sample + WorkflowExecutionHistory history = client.fetchHistory(WORKFLOW_ID); + com.google.protobuf.Duration backoff = + history + .getHistory() + .getEvents(0) + .getWorkflowExecutionStartedEventAttributes() + .getFirstWorkflowTaskBackoff(); + System.out.println("First workflow task backoff: " + backoff.getSeconds()); + + System.exit(0); + } +} diff --git a/core/src/test/java/io/temporal/samples/hello/HelloDelayedStartTest.java b/core/src/test/java/io/temporal/samples/hello/HelloDelayedStartTest.java new file mode 100644 index 00000000..273b351e --- /dev/null +++ b/core/src/test/java/io/temporal/samples/hello/HelloDelayedStartTest.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 Temporal Technologies, Inc. All Rights Reserved + * + * Copyright 2012-2016 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Modifications copyright (C) 2017 Uber Technologies, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"). You may not + * use this file except in compliance with the License. A copy of the License is + * located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package io.temporal.samples.hello; + +import static org.junit.Assert.assertEquals; + +import io.temporal.client.WorkflowOptions; +import io.temporal.common.WorkflowExecutionHistory; +import io.temporal.testing.TestWorkflowRule; +import java.time.Duration; +import org.junit.Rule; +import org.junit.Test; + +public class HelloDelayedStartTest { + private final String WORKFLOW_ID = "HelloDelayedStartWorkflow"; + + @Rule + public TestWorkflowRule testWorkflowRule = + TestWorkflowRule.newBuilder() + .setWorkflowTypes(HelloDelayedStart.DelayedStartWorkflowImpl.class) + .build(); + + @Test + public void testDelayedStart() { + // Get a workflow stub using the same task queue the worker uses. + WorkflowOptions workflowOptions = + WorkflowOptions.newBuilder() + .setTaskQueue(testWorkflowRule.getTaskQueue()) + .setWorkflowId(WORKFLOW_ID) + .setStartDelay(Duration.ofSeconds(2)) + .build(); + + HelloDelayedStart.DelayedStartWorkflow workflow = + testWorkflowRule + .getWorkflowClient() + .newWorkflowStub(HelloDelayedStart.DelayedStartWorkflow.class, workflowOptions); + + workflow.start(); + + // Fetch event history and make sure we got the 2 seconds first workflow task backoff + WorkflowExecutionHistory history = + testWorkflowRule.getWorkflowClient().fetchHistory(WORKFLOW_ID); + com.google.protobuf.Duration backoff = + history + .getHistory() + .getEvents(0) + .getWorkflowExecutionStartedEventAttributes() + .getFirstWorkflowTaskBackoff(); + + assertEquals(2, backoff.getSeconds()); + } +} From f13f7914e6ca3d579857e716f88b0c65485169dd Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Thu, 28 Dec 2023 22:22:38 -0500 Subject: [PATCH 3/5] fix Signed-off-by: Tihomir Surdilovic --- springboot/build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/springboot/build.gradle b/springboot/build.gradle index 1cd62751..569e1cc9 100644 --- a/springboot/build.gradle +++ b/springboot/build.gradle @@ -24,9 +24,4 @@ bootJar { jar { enabled = true -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 } \ No newline at end of file From 02744b39b64a1f0a661caadc5d72ea45cace5f9f Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Thu, 28 Dec 2023 22:24:52 -0500 Subject: [PATCH 4/5] fix comment Signed-off-by: Tihomir Surdilovic --- .../main/java/io/temporal/samples/hello/HelloDelayedStart.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java b/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java index 8280111c..a0b85085 100644 --- a/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java +++ b/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java @@ -107,7 +107,7 @@ public static void main(String[] args) { WorkflowOptions.newBuilder() .setWorkflowId(WORKFLOW_ID) .setTaskQueue(TASK_QUEUE) - // set delayed start in 10s + // set delayed start in 2 seconds .setStartDelay(Duration.ofSeconds(2)) .build()); From 8498969297215c3bf5a12904d10f207f93109bec Mon Sep 17 00:00:00 2001 From: Tihomir Surdilovic Date: Fri, 29 Dec 2023 08:56:24 -0500 Subject: [PATCH 5/5] update to readme Signed-off-by: Tihomir Surdilovic --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 320be8f4..4d3c226d 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,7 @@ See the README.md file in each main sample directory for cut/paste Gradle comman - [**HelloSearchAttributes**](/core/src/main/java/io/temporal/samples/hello/HelloSearchAttributes.java): Demonstrates how to add custom Search Attributes to Workflow Executions. - [**HelloSideEffect**](/core/src/main/java/io/temporal/samples/hello/HelloSideEffect.java)**: Demonstrates how to implement a Side Effect. - [**HelloUpdate**](/core/src/main/java/io/temporal/samples/hello/HelloUpdate.java): Demonstrates how to create and interact with an Update. + - [**HelloDelayedStart**](/core/src/main/java/io/temporal/samples/hello/HelloDelayedStart.java): Demonstrates how to use delayed start config option when starting a Workflow Executions. #### Scenario-based samples