@@ -17,15 +17,15 @@ Workflows are written in Go code. The only exception is they must not use any of
17
17
18
18
``` go
19
19
func Workflow1 (ctx workflow .Context , input string ) error {
20
- var r1 , r2 int
21
-
22
- if err := workflow.ExecuteActivity (ctx, workflow.DefaultActivityOptions , Activity1, 35 , 12 ).Get (ctx, &r1); err != nil {
20
+ r1 , err := workflow.ExecuteActivity [int ](ctx, workflow.DefaultActivityOptions , Activity1, 35 , 12 ).Get (ctx)
21
+ if err != nil {
23
22
panic (" error getting activity 1 result" )
24
23
}
25
24
26
25
log.Println (" A1 result:" , r1)
27
26
28
- if err := workflow.ExecuteActivity (ctx, workflow.DefaultActivityOptions , Activity2).Get (ctx, &r2); err != nil {
27
+ r2 , err := workflow.ExecuteActivity [int ](ctx, workflow.DefaultActivityOptions , Activity2).Get (ctx)
28
+ if err != nil {
29
29
panic (" error getting activity 1 result" )
30
30
}
31
31
@@ -99,7 +99,6 @@ func main() {
99
99
}
100
100
101
101
c2 := make (chan os.Signal , 1 )
102
- signal.Notify (c2, os.Interrupt )
103
102
signal.Notify (c2, os.Interrupt )
104
103
<- c2
105
104
}
@@ -210,7 +209,8 @@ to call activities registered on a struct from a workflow:
210
209
// ...
211
210
var a *act
212
211
213
- if err := workflow.ExecuteActivity (ctx, workflow.DefaultActivityOptions , a.Activity1 , 35 , 12 ).Get (ctx, &r1); err != nil {
212
+ r1 , err := workflow.ExecuteActivity [int ](ctx, workflow.DefaultActivityOptions , a.Activity1 , 35 , 12 ).Get (ctx)
213
+ if err != nil {
214
214
// handle error
215
215
}
216
216
// Output r1 = 47 + 12 (from the worker registration) = 59
@@ -232,8 +232,7 @@ if err != nil {
232
232
From a workflow, call ` workflow.ExecuteActivity ` to execute an activity. The call returns a ` Future` you can await to get the result or any error it might return.
233
233
234
234
` ` ` go
235
- var r1 int
236
- err := workflow.ExecuteActivity (ctx, Activity1 , 35 , 12 , nil , " test" ).Get (ctx, &r1)
235
+ r1 , err := workflow.ExecuteActivity [int ](ctx, Activity1, 35 , 12 , nil , " test" ).Get (ctx)
237
236
if err != nil {
238
237
panic (" error getting activity 1 result" )
239
238
}
@@ -267,10 +266,9 @@ cancel()
267
266
Sometimes scheduling an activity is too much overhead for a simple side effect. For those scenarios you can use ` workflow.SideEffect ` . You can pass a func which will be executed only once inline with its result being recorded in the history. Subsequent executions of the workflow will return the previously recorded result.
268
267
269
268
` ` ` go
270
- var id string
271
- workflow.SideEffect (ctx, func (ctx workflow.Context ) interface {}) {
269
+ id , _ := workflow.SideEffect [string ](ctx, func (ctx workflow.Context ) string ) {
272
270
return uuid.NewString ()
273
- }).Get (ctx, &id )
271
+ }).Get (ctx)
274
272
` ` `
275
273
276
274
### Running sub-workflows
@@ -279,8 +277,8 @@ Call `workflow.CreateSubWorkflowInstance` to start a sub-workflow.
279
277
280
278
` ` ` go
281
279
func Workflow1 (ctx workflow.Context , msg string ) error {
282
- var wr int
283
- if err := workflow. CreateSubWorkflowInstance (ctx, workflow. SubWorkflowInstanceOptions {}, Workflow2, " some input " ). Get (ctx, &wr); err != nil {
280
+ wr , err := workflow. CreateSubWorkflowInstance [ int ](ctx, workflow. SubWorkflowInstanceOptions {}, Workflow2, " some input " ). Get (ctx, &wr)
281
+ if err != nil {
284
282
return errors.Wrap (err, " could not get sub workflow result" )
285
283
}
286
284
@@ -289,9 +287,8 @@ func Workflow1(ctx workflow.Context, msg string) error {
289
287
}
290
288
291
289
func Workflow2 (ctx workflow.Context , msg string ) (int , error ) {
292
- var r1 int
293
-
294
- if err := workflow.ExecuteActivity (ctx, Activity1, 35 , 12 ).Get (ctx, &r1); err != nil {
290
+ r1 , err := workflow.ExecuteActivity [int ](ctx, Activity1, 35 , 12 ).Get (ctx, &r1)
291
+ if err != nil {
295
292
return " " , errors.Wrap (err, " could not get activity result" )
296
293
}
297
294
@@ -320,19 +317,17 @@ if err != nil {
320
317
Due its non-deterministic behavior you must not use a ` select ` statement in workflows. Instead you can use the provided ` workflow.Select ` function. It blocks until one of the provided cases is ready. Cases are evaluated in the order passed to ` Select.
321
318
322
319
` ` ` go
323
- var f1 workflow.Future
324
- var c workflow.Channel
320
+ var f1 workflow.Future[int]
321
+ var c workflow.Channel[int]
325
322
326
323
workflow.Select(
327
324
ctx,
328
- workflow.Await(f1, func (ctx workflow.Context, f Future) {
329
- var r int
330
- err := f.Get(ctx, &r)
325
+ workflow.Await(f1, func (ctx workflow.Context, f Future[int]) {
326
+ r, err := f.Get(ctx)
331
327
// ...
332
328
}),
333
- workflow.Receive(c, func (ctx workflow.Context, c Channel) {
334
- v, _ := c.Receive(ctx)
335
- // ...
329
+ workflow.Receive(c, func (ctx workflow.Context, v int, ok bool) {
330
+ // use v
336
331
}),
337
332
workflow.Default(ctx, func (ctx workflow.Context) {
338
333
// ...
@@ -345,18 +340,16 @@ workflow.Select(
345
340
` Await` adds a case to wait for a Future to have a value
346
341
347
342
` ` ` go
348
- var f1, f2 workflow.Future
343
+ var f1, f2 workflow.Future[int]
349
344
350
345
workflow.Select(
351
346
ctx,
352
- workflow.Await(f1, func (ctx workflow.Context, f Future) {
353
- var r int
354
- err := f.Get(ctx, &r)
347
+ workflow.Await(f1, func (ctx workflow.Context, f Future[int]) {
348
+ r, err := f.Get(ctx)
355
349
// ...
356
350
}),
357
- workflow.Await(f2, func (ctx workflow.Context, f Future) {
358
- var r int
359
- err := f.Get(ctx, &r)
351
+ workflow.Await(f2, func (ctx workflow.Context, f Future[int]) {
352
+ r, err := f.Get(ctx)
360
353
// ...
361
354
}),
362
355
)
@@ -367,12 +360,11 @@ workflow.Select(
367
360
` Receive` adds a case to receive from a given channel
368
361
369
362
` ` ` go
370
- var c workflow.Channel
363
+ var c workflow.Channel[int]
371
364
372
365
workflow.Select(
373
366
ctx,
374
- workflow.Receive(c, func (ctx workflow.Context, c Channel) {
375
- v, _ := c.Receive(ctx)
367
+ workflow.Receive(c, func (ctx workflow.Context, v int, ok bool) {
376
368
// ...
377
369
}),
378
370
)
@@ -383,13 +375,12 @@ workflow.Select(
383
375
A ` Default` case is executed if no previous case is ready and selected:
384
376
385
377
` ` ` go
386
- var f1 workflow.Future
378
+ var f1 workflow.Future[int]
387
379
388
380
workflow.Select(
389
381
ctx,
390
- workflow.Await(f1, func (ctx workflow.Context, f Future) {
391
- var r int
392
- err := f.Get(ctx, &r)
382
+ workflow.Await(f1, func (ctx workflow.Context, f Future[int]) {
383
+ r, err := f.Get(ctx, &r)
393
384
// ...
394
385
}),
395
386
workflow.Default(ctx, func (ctx workflow.Context) {
@@ -415,15 +406,15 @@ func Workflow2(ctx workflow.Context, msg string) (string, error) {
415
406
}
416
407
}()
417
408
418
- var r1 int
419
- if err := workflow.ExecuteActivity(ctx, ActivityCancel, 1, 2).Get(ctx, &r1); err != nil { // <---- Workflow is canceled while this activity is running
409
+ r1, err := workflow.ExecuteActivity[ int](ctx, ActivityCancel, 1, 2).Get(ctx)
410
+ if err != nil { // <---- Workflow is canceled while this activity is running
420
411
return errors.Wrap(err, "could not get ActivityCancel result")
421
412
}
422
413
423
414
// r1 will contain the result of ActivityCancel
424
415
// ⬇ ActivitySkip will be skipped immediately
425
- var r2 int
426
- if err := workflow.ExecuteActivity(ctx, ActivitySkip, 1, 2).Get(ctx, &r2); err != nil {
416
+ r2, err := workflow.ExecuteActivity(ctx, ActivitySkip, 1, 2).Get(ctx)
417
+ if err != nil {
427
418
return errors.Wrap(err, "could not get ActivitySkip result")
428
419
}
429
420
@@ -471,12 +462,10 @@ For now, I've intentionally left our versioning. Cadence, Temporal, and DTFx all
471
462
472
463
```go
473
464
func Workflow1(ctx workflow.Context) {
474
- var r1 int
475
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx, &r1)
465
+ r1, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx)
476
466
log.Println("A1 result:", r1)
477
467
478
- var r2 int
479
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx, &r2)
468
+ r2, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx)
480
469
log.Println("A2 result:", r2)
481
470
}
482
471
```
@@ -486,15 +475,13 @@ to:
486
475
```go
487
476
func Workflow1(ctx workflow.Context) {
488
477
var r1 int
489
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx, &r1 )
478
+ r1, _ := workflow.ExecuteActivity[int] (ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx)
490
479
log.Println("A1 result:", r1)
491
480
492
- var r3 int
493
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity3).Get(ctx, &r3)
481
+ r3, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity3).Get(ctx)
494
482
log.Println("A3 result:", r3)
495
483
496
- var r2 int
497
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx, &r2)
484
+ r2, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx)
498
485
log.Println("A2 result:", r2)
499
486
}
500
487
```
@@ -511,18 +498,15 @@ the workflow will encounter an attempt to execute `Activity3` in-between event 2
511
498
512
499
```go
513
500
func Workflow1(ctx workflow.Context) {
514
- var r1 int
515
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx, &r1)
501
+ r1, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity1, 35, 12).Get(ctx)
516
502
log.Println("A1 result:", r1)
517
503
518
504
if workflow.Version(ctx) >= 2 {
519
- var r3 int
520
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity3).Get(ctx, &r3)
505
+ r3, _ := workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity3).Get(ctx)
521
506
log.Println("A3 result:", r3)
522
507
}
523
508
524
- var r2 int
525
- workflow.ExecuteActivity(ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx, &r2)
509
+ r2, _ := workflow.ExecuteActivity[int](ctx, workflow.DefaultActivityOptions, Activity2).Get(ctx)
526
510
log.Println("A2 result:", r2)
527
511
}
528
512
```
0 commit comments