|
@@ -5,6 +5,8 @@ import inn.ocsf.bee.freigeld.core.calc.CoinUtils
|
|
import inn.ocsf.bee.freigeld.core.model.*
|
|
import inn.ocsf.bee.freigeld.core.model.*
|
|
import inn.ocsf.bee.freigeld.core.service.TicketService
|
|
import inn.ocsf.bee.freigeld.core.service.TicketService
|
|
import kotlinx.coroutines.CompletableDeferred
|
|
import kotlinx.coroutines.CompletableDeferred
|
|
|
|
+import kotlinx.coroutines.GlobalScope
|
|
|
|
+import kotlinx.coroutines.launch
|
|
import org.slf4j.LoggerFactory
|
|
import org.slf4j.LoggerFactory
|
|
import org.springframework.beans.factory.annotation.Autowired
|
|
import org.springframework.beans.factory.annotation.Autowired
|
|
import org.springframework.stereotype.Service
|
|
import org.springframework.stereotype.Service
|
|
@@ -32,9 +34,9 @@ class CentralBankQueueLevel : CentralBankAccountLevel() {
|
|
|
|
|
|
private val log = LoggerFactory.getLogger(javaClass)
|
|
private val log = LoggerFactory.getLogger(javaClass)
|
|
|
|
|
|
- override fun exchange(to: BankAccount, from: BankAccount, amount: Long): CompletableFuture<Ticket> {
|
|
|
|
- val e = ExchangeStartEvent(UUID.randomUUID(), to, from, amount)
|
|
|
|
- val ret = CompletableFuture<Ticket>()
|
|
|
|
|
|
+ override fun exchange(to: BankAccount, from: BankAccount, amount: Long, details: BankExchangeDetails?): CompletableFuture<IExchangeTicket> {
|
|
|
|
+ val e = ExchangeStartEvent(UUID.randomUUID(), to, from, amount, details)
|
|
|
|
+ val ret = CompletableFuture<IExchangeTicket>()
|
|
globalFutureMap.computeIfAbsent(e.id) { id ->
|
|
globalFutureMap.computeIfAbsent(e.id) { id ->
|
|
ticketService.offerLast(bankTicketChannelName, e)
|
|
ticketService.offerLast(bankTicketChannelName, e)
|
|
val def = CompletableDeferred<Ticket>()
|
|
val def = CompletableDeferred<Ticket>()
|
|
@@ -208,24 +210,27 @@ class CentralBankQueueLevel : CentralBankAccountLevel() {
|
|
|
|
|
|
@PostConstruct
|
|
@PostConstruct
|
|
fun start() {
|
|
fun start() {
|
|
- emitter.listen { e ->
|
|
|
|
- log.debug("emitter event ${e.javaClass.name}")
|
|
|
|
- when (e) {
|
|
|
|
- is EmitterStartRecalculationEvent -> ticketService.offerLast(bankTicketChannelName, BankPauseOnRecalcEvent(UUID.randomUUID(), e))
|
|
|
|
- is EmitterStopRecalculationEvent -> ticketService.offerLast(bankTicketChannelName, BankResumeAfterRecalcEvent(UUID.randomUUID(), e))
|
|
|
|
- else -> throw RuntimeException("unknown emitter event ${e.javaClass.name}")
|
|
|
|
|
|
+ GlobalScope.launch {
|
|
|
|
+ emitter.listen { e ->
|
|
|
|
+ log.debug("emitter event ${e.javaClass.name}")
|
|
|
|
+ when (e) {
|
|
|
|
+ is EmitterStartRecalculationEvent -> ticketService.offerLast(bankTicketChannelName, BankPauseOnRecalcEvent(UUID.randomUUID(), e))
|
|
|
|
+ is EmitterStopRecalculationEvent -> ticketService.offerLast(bankTicketChannelName, BankResumeAfterRecalcEvent(UUID.randomUUID(), e))
|
|
|
|
+ else -> throw RuntimeException("unknown emitter event ${e.javaClass.name}")
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- ticketService.listen(bankTicketChannelName) { e ->
|
|
|
|
- val qst = getCurrentState { it.queueState ?: BankQueueState.open }
|
|
|
|
- if (e is AbstractBankEvent && qst != BankQueueState.closed) {
|
|
|
|
- if ((qst == BankQueueState.open && !(e is BankResumeAfterRecalcEvent)) || (qst == BankQueueState.recalc && e is BankResumeAfterRecalcEvent)) {
|
|
|
|
- pollLater(e)
|
|
|
|
|
|
+ ticketService.listen(bankTicketChannelName) { e ->
|
|
|
|
+ val qst = getCurrentState { it.queueState ?: BankQueueState.open }
|
|
|
|
+ log.info("poll event ${e::class.java} on state ${qst}")
|
|
|
|
+ if (e is AbstractBankEvent && qst != BankQueueState.closed) {
|
|
|
|
+ if ((qst == BankQueueState.open && !(e is BankResumeAfterRecalcEvent)) || (qst == BankQueueState.recalc && e is BankResumeAfterRecalcEvent)) {
|
|
|
|
+ pollLater(e)
|
|
|
|
+ } else {
|
|
|
|
+ false
|
|
|
|
+ }
|
|
} else {
|
|
} else {
|
|
- false
|
|
|
|
|
|
+ null
|
|
}
|
|
}
|
|
- } else {
|
|
|
|
- null
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -259,17 +264,24 @@ class ExchangeFailedEvent() : ExchangeBankEvent() {
|
|
|
|
|
|
class ExchangeFailedException(val event: ExchangeBankEvent, message: String? = "exchange failed") : Exception(message)
|
|
class ExchangeFailedException(val event: ExchangeBankEvent, message: String? = "exchange failed") : Exception(message)
|
|
|
|
|
|
-class ExchangeStartEvent() : ExchangeBankEvent() {
|
|
|
|
|
|
+class ExchangeStartEvent() : ExchangeBankEvent(), IExchangeTicket {
|
|
var to: UUID? = null
|
|
var to: UUID? = null
|
|
var from: UUID? = null
|
|
var from: UUID? = null
|
|
var amount: Long? = null
|
|
var amount: Long? = null
|
|
|
|
+ var _details: BankExchangeDetails? = null
|
|
|
|
|
|
- constructor(id: UUID, to: BankAccount, from: BankAccount, amount: Long) : this() {
|
|
|
|
|
|
+ constructor(id: UUID, to: BankAccount, from: BankAccount, amount: Long, details: BankExchangeDetails?) : this() {
|
|
this.id = id
|
|
this.id = id
|
|
this.to = to.id
|
|
this.to = to.id
|
|
this.from = from.id
|
|
this.from = from.id
|
|
this.amount = amount
|
|
this.amount = amount
|
|
|
|
+ this._details = details
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ override fun getDetails(): BankExchangeDetails? {
|
|
|
|
+ return _details
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
class BankPauseOnRecalcEvent() : AbstractBankEvent() {
|
|
class BankPauseOnRecalcEvent() : AbstractBankEvent() {
|