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
							 |