handleFailure 处理 Actor 失败
(cell *actorCell, msg Message, err any)
| 536 | |
| 537 | // handleFailure 处理 Actor 失败 |
| 538 | func (s *System) handleFailure(cell *actorCell, msg Message, err any) { |
| 539 | supervisor := cell.supervisor |
| 540 | if supervisor == nil && cell.parent != nil { |
| 541 | // 使用父 Actor 的监督策略 |
| 542 | s.actorsMu.RLock() |
| 543 | if parentCell, ok := s.actors[cell.parent.ID]; ok { |
| 544 | supervisor = parentCell.supervisor |
| 545 | } |
| 546 | s.actorsMu.RUnlock() |
| 547 | } |
| 548 | |
| 549 | if supervisor == nil { |
| 550 | supervisor = DefaultSupervisorStrategy() |
| 551 | } |
| 552 | |
| 553 | result := supervisor.HandleFailure(s, cell.pid, msg, err) |
| 554 | |
| 555 | // 处理返回结果 |
| 556 | switch r := result.(type) { |
| 557 | case DirectiveWithDelay: |
| 558 | // 延迟重启 |
| 559 | time.AfterFunc(r.Delay, func() { |
| 560 | s.applyDirective(cell, r.Directive) |
| 561 | }) |
| 562 | case Directive: |
| 563 | // 立即执行 |
| 564 | s.applyDirective(cell, r) |
| 565 | } |
| 566 | } |
| 567 | |
| 568 | // applyDirective 应用监督指令 |
| 569 | func (s *System) applyDirective(cell *actorCell, directive Directive) { |
no test coverage detected