Hello everyone! Sorry for my bad English
I try to build a workflow that can accept 2 signals 1st to start workflow and some actions and 2nd for actions and finish. I’d like to wait for 1st signal (start) and do “save” and “update” activities.
After that I’d like workflow to wait for next signal (SecondSignal) (maybe in 1 minute, maybe in 1h). When it has received the second signal new activity must be run “CalculateDeliveryDates” and UpdateOrder and finish my workflow.
Is it the correct way to do that?
startWorkflowSignal := workflow.GetSignalChannel(ctx, string(pkgworkflow.StartWorkflowSignal))
calculateDeliveryDatesSignal := workflow.GetSignalChannel(ctx, string(pkgworkflow.SecondSignal))
for {
selector := workflow.NewSelector(ctx)
selector.AddReceive(startWorkflowSignal, func(c workflow.ReceiveChannel, _ bool) {
c.Receive(ctx, &o)
ao := workflow.ActivityOptions{
StartToCloseTimeout: time.Minute,
}
ctx = workflow.WithActivityOptions(ctx, ao)
err := workflow.ExecuteActivity(ctx, w.activities.Save, o).Get(ctx, &order)
if err != nil {
logger.Error("SaveOrder activity: %v", err)
myErr = err
finished = true
return
}
ao = workflow.ActivityOptions{
StartToCloseTimeout: time.Minute,
}
ctx = workflow.WithActivityOptions(ctx, ao)
err = workflow.ExecuteActivity(ctx, w.activities.Update, &order).Get(ctx, nil)
if err != nil {
logger.Error("UpdateOrder activity: %v", err)
myErr = err
finished = true
return
}
})
selector.AddReceive(calculateDeliveryDatesSignal, func(c workflow.ReceiveChannel, _ bool) {
c.Receive(ctx, &reservedOrder)
ao := workflow.ActivityOptions{
StartToCloseTimeout: time.Minute,
}
ctx = workflow.WithActivityOptions(ctx, ao)
err := workflow.ExecuteActivity(ctx, w.activities.CalculateDeliveryDates, reservedOrder).Get(ctx, &deliveryDates)
if err != nil {
logger.Error("CalculateDeliveryDates activity: %v", err)
myErr = err
finished = true
return
}
ao = workflow.ActivityOptions{
StartToCloseTimeout: time.Minute,
}
ctx = workflow.WithActivityOptions(ctx, ao)
err = workflow.ExecuteActivity(ctx, w.activities.UpdateOrder, &order).Get(ctx, nil)
if err != nil {
logger.Error("UpdateOrder activity: %v", err)
myErr = err
finished = true
return
}
finished = true
})
selector.Select(ctx)
if finished {
break
}
}
I tried to test only 1st signal, but I got
workflow execution error (type: Start, workflowID: default-test-workflow-id, runID: default-test-run-id): deadline exceeded (type: ScheduleToClose)
s.env.OnActivity(activities.Save, mock.Anything, mock.Anything).Return(&ordersrv, nil)
s.env.OnActivity(activities.UpdateOrder, mock.Anything, &ordersrv).Return(nil)
// First callback at 1ms: query to make sure the cart is empty, and signal to add an item.
s.env.RegisterDelayedCallback(func() {
s.env.SignalWorkflow(string(workflow.StartWorkflowSignal), o)
}, time.Millisecond*10)
s.env.ExecuteWorkflow(workflowB2C.Start)
s.True(s.env.IsWorkflowCompleted())
require.NoError(s.T(), s.env.GetWorkflowError())
Please help me anyone