From b564d7320a16f28997f587cd17bfa45e73413997 Mon Sep 17 00:00:00 2001 From: flippedcoder Date: Fri, 16 Oct 2026 14:20:52 -0500 Subject: [PATCH] feat(go): migrated dynamic activities --- go-sandbox/activities/dynamic/activity.go | 24 +++++++++++++ go-sandbox/activities/dynamic/dynamic_test.go | 34 +++++++++++++++++++ go-sandbox/activities/dynamic/worker/main.go | 29 ++++++++++++++++ go-sandbox/activities/dynamic/workflow.go | 21 ++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 go-sandbox/activities/dynamic/activity.go create mode 100644 go-sandbox/activities/dynamic/dynamic_test.go create mode 100644 go-sandbox/activities/dynamic/worker/main.go create mode 100644 go-sandbox/activities/dynamic/workflow.go diff --git a/go-sandbox/activities/dynamic/activity.go b/go-sandbox/activities/dynamic/activity.go new file mode 100644 index 0000000..d5bd6b0 --- /dev/null +++ b/go-sandbox/activities/dynamic/activity.go @@ -0,0 +1,24 @@ +package dynamic + +import ( + "context" + "fmt" + + "go.temporal.io/sdk/activity" + "go.temporal.io/sdk/converter" +) + +// @@@SNIPSTART go-dynamic-activity-definition +func DynamicActivity(ctx context.Context, args converter.EncodedValues) (string, error) { + var arg1, arg2 string + err := args.Get(&arg1, &arg2) + if err != nil { + return "", fmt.Errorf("failed to decode arguments: %w", err) + } + + info := activity.GetInfo(ctx) + result := fmt.Sprintf("%s - %s - %s", info.WorkflowType.Name, arg1, arg2) + + return result, nil +} +// @@@SNIPEND diff --git a/go-sandbox/activities/dynamic/dynamic_test.go b/go-sandbox/activities/dynamic/dynamic_test.go new file mode 100644 index 0000000..197e9c5 --- /dev/null +++ b/go-sandbox/activities/dynamic/dynamic_test.go @@ -0,0 +1,34 @@ +package dynamic_test + +import ( + "testing" + + "github.com/stretchr/testify/suite" + "go.temporal.io/sdk/activity" + "go.temporal.io/sdk/testsuite" + + "my-org/quickstart/activities/dynamic" +) + +type DynamicActivityTestSuite struct { + suite.Suite + testsuite.WorkflowTestSuite +} + +func TestDynamicActivityTestSuite(t *testing.T) { + suite.Run(t, new(DynamicActivityTestSuite)) +} + +func (s *DynamicActivityTestSuite) Test_UnregisteredActivityRunsDynamicActivity() { + env := s.NewTestWorkflowEnvironment() + env.RegisterWorkflow(dynamic.CallUnregisteredActivityWorkflow) + env.RegisterDynamicActivity(dynamic.DynamicActivity, activity.DynamicRegisterOptions{}) + + env.ExecuteWorkflow(dynamic.CallUnregisteredActivityWorkflow, "first", "second") + s.True(env.IsWorkflowCompleted()) + s.NoError(env.GetWorkflowError()) + + var result string + s.NoError(env.GetWorkflowResult(&result)) + s.Equal("CallUnregisteredActivityWorkflow - first - second", result) +} diff --git a/go-sandbox/activities/dynamic/worker/main.go b/go-sandbox/activities/dynamic/worker/main.go new file mode 100644 index 0000000..029577f --- /dev/null +++ b/go-sandbox/activities/dynamic/worker/main.go @@ -0,0 +1,29 @@ +package main + +import ( + "log" + + "go.temporal.io/sdk/activity" + "go.temporal.io/sdk/client" + "go.temporal.io/sdk/worker" + + "my-org/quickstart/activities/dynamic" +) + +func main() { + temporalClient, err := client.Dial(client.Options{}) + if err != nil { + log.Fatalln("Unable to create client", err) + } + defer temporalClient.Close() + + w := worker.New(temporalClient, dynamic.TaskQueue, worker.Options{}) + w.RegisterWorkflow(dynamic.CallUnregisteredActivityWorkflow) + // @@@SNIPSTART go-dynamic-activity-register + w.RegisterDynamicActivity(dynamic.DynamicActivity, activity.DynamicRegisterOptions{}) + // @@@SNIPEND + + if err := w.Run(worker.InterruptCh()); err != nil { + log.Fatalln("Unable to start Worker", err) + } +} diff --git a/go-sandbox/activities/dynamic/workflow.go b/go-sandbox/activities/dynamic/workflow.go new file mode 100644 index 0000000..d58e112 --- /dev/null +++ b/go-sandbox/activities/dynamic/workflow.go @@ -0,0 +1,21 @@ +package dynamic + +import ( + "time" + + "go.temporal.io/sdk/workflow" +) + +const TaskQueue = "dynamic-activity" + +// CallUnregisteredActivityWorkflow calls an Activity Type that no Activity is +// registered under, so the Worker runs the Dynamic Activity instead. +func CallUnregisteredActivityWorkflow(ctx workflow.Context, arg1, arg2 string) (string, error) { + ctx = workflow.WithActivityOptions(ctx, workflow.ActivityOptions{ + StartToCloseTimeout: 10 * time.Second, + }) + + var result string + err := workflow.ExecuteActivity(ctx, "UnregisteredActivityType", arg1, arg2).Get(ctx, &result) + return result, err +}