#572·dtm

workflow other error can't backoff retery and RetryInterval is invalid

Author: nogolangCreated Dec 17, 2025Updated Jan 27, 2026

workflow 模式下,当分支返回其他错误,不会进行指数退避重试,而是会采用固定重试

	AddCommand("http_workflow_saga_rollback", func() string {
		wfName := "wf_saga_rollback"
		err := workflow.Register(wfName, func(wf *workflow.Workflow, data []byte) error {
			req := MustUnmarshalReqHTTP(data)
			_, err := wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
				_, err := wf.NewRequest().SetBody(req).Post(busi.Busi + "/TransOutRevert")
				return err
			}).NewRequest().SetBody(req).Post(busi.Busi + "/TransOut")
			if err != nil {
				return err
			}
			_, err = wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
				_, err := wf.NewRequest().SetBody(req).Post(busi.Busi + "/TransInRevert")
				return err
			}).NewRequest().SetBody(req).Post(busi.Busi + "/TransIn")
			if err != nil {
				return err
			}
			return nil
		})
		logger.FatalIfError(err)

                //只会固定时间重试,固定为10s
		req := &busi.ReqHTTP{Amount: 30, TransOutResult: "ERROR"}
		//req := &busi.ReqHTTP{Amount: 30, TransInResult: dtmcli.ResultFailure}

		gid := shortuuid.New()
		err = workflow.Execute(wfName, gid, dtmimp.MustMarshal(req))
		logger.Infof("result is: %v", err)
		return gid
	})

因为上一个问题,指数退避变为了固定重试,所以我想调整RetryInterval,但是发现 虽然在ui 里改变了间隔时间 但是实际重试间隔依旧为10s左右

	err := workflow.Register2(wfName, func(wf *workflow.Workflow, data []byte) ([]byte, error) {
		var paramData Param
		err := json.Unmarshal(data, &paramData)
		if err != nil {
			return nil, err
		}
		log.Println("进入了Register")

		wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
			_, err := wf.NewRequest().SetBody(model.TransRequestArgsHTTP{
				Uid:    paramData.AUid,
				Amount: paramData.Amount,
			}).Post(baseUrl + "/api/SagaTransOutRollBack")
			if err != nil {
				return err
			}
			return nil
		})
		res, err := wf.NewRequest().SetBody(&model.TransRequestArgsHTTP{
			Uid:    paramData.AUid,
			Amount: -paramData.Amount,
		}).Post(baseUrl + "/api/SagaTransOut")
		if err != nil {
			return nil, err
		}
		wf.NewBranch().OnRollback(func(bb *dtmcli.BranchBarrier) error {
			_, err := wf.NewRequest().SetBody(&model.TransRequestArgsHTTP{
				Uid:    paramData.BUid,
				Amount: -paramData.Amount,
			}).Post(baseUrl + "/api/SagaTransInRollBack")
			if err != nil {
				return err
			}
			return nil
		})
		res, err = wf.NewRequest().SetBody(&model.TransRequestArgsHTTP{Uid: paramData.BUid, Amount: paramData.Amount}).Post(baseUrl + "/api/SagaTransIn")
		if err != nil {
			return nil, err
		}
		return res.Body(), nil
	}, func(wf *workflow.Workflow) {

		//因为上一个问题,指数退避变为了固定重试,所以我想调整RetryInterval
		wf.RetryInterval = 5
	})
Image