Oracle BPEL, почему компенсация в то время как catch может обрабатывать исключения
Мне просто интересно в Oracle BPEL, цель компенсации - откат бизнеса. Но catch может делать почти похожие вещи (кроме отката в обратном порядке завершения). Я не очень понимаю, зачем нам все еще нужна компенсация?
1 ответ
Существует много сценариев, в которых ручная кодированная компенсация в обработчиках ошибок будет довольно сложной, если не невозможной, и будет содержать много повторяющегося кода.
Представьте, что у вас есть следующий процесс:
<flow>
<sequence>
<invoke name="I1"/>
<invoke name="I2"/>
</sequence>
<sequence>
<invoke name="I3"/>
<invoke name="I4"/>
</sequence>
</flow>
Если вы хотите выполнить обработку компенсации, вам просто нужно добавить обработчики компенсации в каждый вызов, и все готово.
Если вы использовали обработчики ошибок, вам нужно как-то проверить, какие действия уже выполнены. Представьте, что I4 выбрасывает ошибку. Вы знаете, что I3 был завершен и должен быть компенсирован. Однако вы НЕ знаете, был ли I1 или I2 запущен или еще не завершен. Вам нужно было бы поиграть с флагами как переменными, которые вам нужно установить для изолированных действий и т. Д. Также обработчики ошибок для I2, I3 и I4 должны содержать логику компенсации для I1. Использование обработчиков компенсации намного чище и проще, чем пытаться их заново изобретать:)