OxL Справочник OxL
РусскийEnglish

fn resolve

Manual resolution of a stuck saga: the operator did (or did not need) the compensations by hand and closes the saga.

Example:

oxl✓ проверяется в CI
@error data Boom { m: str }

service Bank {
  @public @idempotent rpc hold(n: u64) -> u64
  @public @idempotent rpc unhold(n: u64) -> () | Boom
  @public @idempotent rpc refuse(n: u64) -> u64 | Boom
}

impl Bank {
  rpc hold(n) => n
  rpc unhold(n) { fail Boom{ m: "bank is down" } }
  rpc refuse(n) { fail Boom{ m: "no" } }
}

// the second step fails and its compensation never succeeds: the saga becomes stuck
saga pay(n: u64) -> u64 {
  Bank.hold(n)   undo h => Bank.unhold(h)
  -> Bank.refuse(n)
}

fn main() io, net, time, db {
  let _ = pay(9)
  for s in std.saga.list(.Stuck) {
    print("{std.saga.resolve(s.id, .Compensated)}")
    print("{std.saga.status(s.id)!.status}")
    print("{std.saga.resolve(s.id, .Compensated)}")
  }
}
Вывод
true
failed
false
pub(api) fn resolve(sagaId: str, how: SagaResolution) -> bool  net, db, time

С версии. 1.0.0-beta

Параметры

ИмяТип
sagaIdstr
howSagaResolution

Возвращает

bool

Эффекты

net, db, time

Определено в: std/saga/saga.oxl:1044

См. также