Хорошо реализованная Saga может справиться с любыми ошибочными сценариями ios, возникающими из транзакции, которой управляет Saga. Таким образом, после любой операции , отправленной из саги, вы должны ожидать исключительного случая, на который вы отреагируете. Это эта реакция, которая является компенсирующим действием, которое вы ищете.
Теперь, go по вашим точным вопросам:
нужно ли мне создайте новый класс с помощью @Saga?
Вполне уверен, что вам не нужна новая сага для разрешения исключительных случаев в вашем домене. Так что нет.
в сервисе, который завершился неудачно, если я выберу исключение или отправлю ошибку другой команде / событию
Я бы go либо с исключением, либо с здесь событие, а не команда (поскольку (Axon) Saga не обрабатывает команды). Независимо от того, используете ли вы go любой из маршрутов, зависит от того, является ли событие важным бизнес-событием, поэтому его необходимо хранить в событии на неопределенный срок. Однако использование события будет означать, что вы разделяете отказоустойчивое поведение вашей саги между отдельными обработчиками событий саги, что я лично не предпочел бы. Таким образом, я предпочитаю генерировать исключение из одной из служб, которые будут обрабатываться сагой. Впоследствии, если вам нужно сохранить исключительное событие, просто опубликуйте sh событие рядом с ним.
как мне вызвать SagaLifecycle.end ()
Not честно говоря, уверен, что вы ищете с этим вопросом. SagaLifecycle.end()
следует вызывать после завершения жизненного цикла саги. Таким образом, когда эта транзакция будет завершена. Когда это будет сделано, полностью зависит от вашего домена и обратите внимание на то, что необходимо из-за того, что вам нужно отправить компенсационное действие.
Чтобы прояснить мои намерения, вот некоторый (псевдокод), показывающий, где Я бы выполнил компенсирующее действие:
private transient CommandGateway commandGateway;
@SagaEventHandler(assocationProperty = "some-association)
public void on(SomeEvent event) {
// Validate/set state if necessary
commandGateway.send(new SomeCommand(...))
.exceptionally(exception -> {
// Dispatch compensating action through service/CommandGateway
});
}