2019-12-07 18:03:49 +02:00

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