222 lines
6.3 KiB
Plaintext
222 lines
6.3 KiB
Plaintext
|
@startuml
|
||
|
package com.iluwatar.saga.orchestration {
|
||
|
class ChapterResult<K> {
|
||
|
- state : State
|
||
|
- value : K
|
||
|
~ ChapterResult<K>(value : K, state : State)
|
||
|
+ failure(val : K) : ChapterResult<K> {static}
|
||
|
+ getValue() : K
|
||
|
+ isSuccess() : boolean
|
||
|
+ success(val : K) : ChapterResult<K> {static}
|
||
|
}
|
||
|
enum State {
|
||
|
+ FAILURE {static}
|
||
|
+ SUCCESS {static}
|
||
|
+ valueOf(name : String) : State {static}
|
||
|
+ values() : State[] {static}
|
||
|
}
|
||
|
class FlyBookingService {
|
||
|
+ FlyBookingService()
|
||
|
+ getName() : String
|
||
|
}
|
||
|
class HotelBookingService {
|
||
|
+ HotelBookingService()
|
||
|
+ getName() : String
|
||
|
+ rollback(value : String) : ChapterResult<String>
|
||
|
}
|
||
|
interface OrchestrationChapter<K> {
|
||
|
+ getName() : String {abstract}
|
||
|
+ process(K) : ChapterResult<K> {abstract}
|
||
|
+ rollback(K) : ChapterResult<K> {abstract}
|
||
|
}
|
||
|
class OrderService {
|
||
|
+ OrderService()
|
||
|
+ getName() : String
|
||
|
}
|
||
|
class Saga {
|
||
|
- chapters : List<Chapter>
|
||
|
- Saga()
|
||
|
+ chapter(name : String) : Saga
|
||
|
+ create() : Saga {static}
|
||
|
+ get(idx : int) : Chapter
|
||
|
+ isPresent(idx : int) : boolean
|
||
|
}
|
||
|
class Chapter {
|
||
|
~ name : String
|
||
|
+ Chapter(name : String)
|
||
|
+ getName() : String
|
||
|
}
|
||
|
enum Result {
|
||
|
+ CRASHED {static}
|
||
|
+ FINISHED {static}
|
||
|
+ ROLLBACK {static}
|
||
|
+ valueOf(name : String) : Result {static}
|
||
|
+ values() : Result[] {static}
|
||
|
}
|
||
|
class SagaApplication {
|
||
|
- LOGGER : Logger {static}
|
||
|
+ SagaApplication()
|
||
|
+ main(args : String[]) {static}
|
||
|
- newSaga() : Saga {static}
|
||
|
- serviceDiscovery() : ServiceDiscoveryService {static}
|
||
|
}
|
||
|
class SagaOrchestrator {
|
||
|
- LOGGER : Logger {static}
|
||
|
- saga : Saga
|
||
|
- sd : ServiceDiscoveryService
|
||
|
- state : CurrentState
|
||
|
+ SagaOrchestrator(saga : Saga, sd : ServiceDiscoveryService)
|
||
|
+ execute(value : K) : Result
|
||
|
}
|
||
|
-class CurrentState {
|
||
|
~ currentNumber : int
|
||
|
~ isForward : boolean
|
||
|
~ CurrentState()
|
||
|
~ back() : int
|
||
|
~ cleanUp()
|
||
|
~ current() : int
|
||
|
~ directionToBack()
|
||
|
~ forward() : int
|
||
|
~ isForward() : boolean
|
||
|
}
|
||
|
abstract class Service<K> {
|
||
|
# LOGGER : Logger {static}
|
||
|
+ Service<K>()
|
||
|
+ getName() : String {abstract}
|
||
|
+ process(value : K) : ChapterResult<K>
|
||
|
+ rollback(value : K) : ChapterResult<K>
|
||
|
}
|
||
|
class ServiceDiscoveryService {
|
||
|
- services : Map<String, OrchestrationChapter<?>>
|
||
|
+ ServiceDiscoveryService()
|
||
|
+ discover(orchestrationChapterService : OrchestrationChapter<?>) : ServiceDiscoveryService
|
||
|
+ find(service : String) : Optional<OrchestrationChapter<K>>
|
||
|
}
|
||
|
class WithdrawMoneyService {
|
||
|
+ WithdrawMoneyService()
|
||
|
+ getName() : String
|
||
|
+ process(value : String) : ChapterResult<String>
|
||
|
}
|
||
|
}
|
||
|
package com.iluwatar.saga.choreography {
|
||
|
interface ChoreographyChapter {
|
||
|
+ execute(Saga) : Saga {abstract}
|
||
|
+ getName() : String {abstract}
|
||
|
+ process(Saga) : Saga {abstract}
|
||
|
+ rollback(Saga) : Saga {abstract}
|
||
|
}
|
||
|
class FlyBookingService {
|
||
|
+ FlyBookingService(service : ServiceDiscoveryService)
|
||
|
+ getName() : String
|
||
|
}
|
||
|
class HotelBookingService {
|
||
|
+ HotelBookingService(service : ServiceDiscoveryService)
|
||
|
+ getName() : String
|
||
|
}
|
||
|
class OrderService {
|
||
|
+ OrderService(service : ServiceDiscoveryService)
|
||
|
+ getName() : String
|
||
|
}
|
||
|
class Saga {
|
||
|
- chapters : List<Chapter>
|
||
|
- finished : boolean
|
||
|
- forward : boolean
|
||
|
- pos : int
|
||
|
- Saga()
|
||
|
~ back() : int
|
||
|
+ chapter(name : String) : Saga
|
||
|
+ create() : Saga {static}
|
||
|
~ forward() : int
|
||
|
~ getCurrent() : Chapter
|
||
|
+ getCurrentValue() : Object
|
||
|
+ getResult() : SagaResult
|
||
|
~ isCurrentSuccess() : boolean
|
||
|
~ isForward() : boolean
|
||
|
~ isPresent() : boolean
|
||
|
+ setCurrentStatus(result : ChapterResult)
|
||
|
+ setCurrentValue(value : Object)
|
||
|
~ setFinished(finished : boolean)
|
||
|
+ setInValue(value : Object) : Saga
|
||
|
+ toString() : String
|
||
|
}
|
||
|
class Chapter {
|
||
|
- inValue : Object
|
||
|
- name : String
|
||
|
- result : ChapterResult
|
||
|
+ Chapter(name : String)
|
||
|
+ getInValue() : Object
|
||
|
+ getName() : String
|
||
|
+ isSuccess() : boolean
|
||
|
+ setInValue(object : Object)
|
||
|
+ setResult(result : ChapterResult)
|
||
|
}
|
||
|
enum ChapterResult {
|
||
|
+ INIT {static}
|
||
|
+ ROLLBACK {static}
|
||
|
+ SUCCESS {static}
|
||
|
+ valueOf(name : String) : ChapterResult {static}
|
||
|
+ values() : ChapterResult[] {static}
|
||
|
}
|
||
|
enum SagaResult {
|
||
|
+ FINISHED {static}
|
||
|
+ PROGRESS {static}
|
||
|
+ ROLLBACKED {static}
|
||
|
+ valueOf(name : String) : SagaResult {static}
|
||
|
+ values() : SagaResult[] {static}
|
||
|
}
|
||
|
class SagaApplication {
|
||
|
- LOGGER : Logger {static}
|
||
|
+ SagaApplication()
|
||
|
+ main(args : String[]) {static}
|
||
|
- newSaga(value : Object) : Saga {static}
|
||
|
- serviceDiscovery() : ServiceDiscoveryService {static}
|
||
|
}
|
||
|
abstract class Service {
|
||
|
# LOGGER : Logger {static}
|
||
|
- sd : ServiceDiscoveryService
|
||
|
+ Service(service : ServiceDiscoveryService)
|
||
|
+ execute(saga : Saga) : Saga
|
||
|
- isSagaFinished(saga : Saga) : boolean
|
||
|
+ process(saga : Saga) : Saga
|
||
|
+ rollback(saga : Saga) : Saga
|
||
|
- serviceNotFoundException(chServiceName : String) : Supplier<RuntimeException>
|
||
|
}
|
||
|
class ServiceDiscoveryService {
|
||
|
- services : Map<String, ChoreographyChapter>
|
||
|
+ ServiceDiscoveryService()
|
||
|
+ discover(chapterService : ChoreographyChapter) : ServiceDiscoveryService
|
||
|
+ find(service : String) : Optional<ChoreographyChapter>
|
||
|
+ findAny() : ChoreographyChapter
|
||
|
}
|
||
|
class WithdrawMoneyService {
|
||
|
+ WithdrawMoneyService(service : ServiceDiscoveryService)
|
||
|
+ getName() : String
|
||
|
+ process(saga : Saga) : Saga
|
||
|
}
|
||
|
}
|
||
|
SagaOrchestrator --> "-saga" Saga
|
||
|
SagaOrchestrator --> "-sd" ServiceDiscoveryService
|
||
|
SagaOrchestrator --> "-state" CurrentState
|
||
|
CurrentState ..+ SagaOrchestrator
|
||
|
Chapter ..+ Saga
|
||
|
Saga --> "-chapters" Chapter
|
||
|
Chapter --> "-result" ChapterResult
|
||
|
ChapterResult ..+ Saga
|
||
|
ChapterResult --> "-state" State
|
||
|
State ..+ ChapterResult
|
||
|
Result ..+ Saga
|
||
|
Service --> "-sd" ServiceDiscoveryService
|
||
|
SagaResult ..+ Saga
|
||
|
Saga --> "-chapters" Chapter
|
||
|
Chapter ..+ Saga
|
||
|
FlyBookingService --|> Service
|
||
|
HotelBookingService --|> Service
|
||
|
OrderService --|> Service
|
||
|
Service ..|> ChoreographyChapter
|
||
|
WithdrawMoneyService --|> Service
|
||
|
FlyBookingService --|> Service
|
||
|
HotelBookingService --|> Service
|
||
|
OrderService --|> Service
|
||
|
Service ..|> OrchestrationChapter
|
||
|
WithdrawMoneyService --|> Service
|
||
|
@enduml
|