package Ġli . do er f . micro store . payment . listeners Ċ Ċ import Ġli . do er f . micro store . TOPIC _ ORD ERS Ċ import Ġli . do er f . micro store . dto . kafka .* Ċ import Ġli . do er f . micro store . listeners . Replay ing Records Listener Ċ import Ġli . do er f . micro store . payment . services . Credit Limit Service Ċ import Ġli . do er f . micro store . payment . services . Order Service Ċ import Ġli . do er f . micro store . services . Kafka Service Ċ import Ġli . do er f . micro store . utils . getLogger Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . kafka . annotation . Kafka Listener Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . math . BigDecimal Ċ Ċ @ Kafka Listener ( topics Ġ= Ġ[ TOPIC _ ORD ERS ]) Ċ @ Component Ċ class ĠOrders Listener Ġ@ Autowired Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġkafka Service : ĠKafka Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġorder Service : ĠOrder Service , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcredit Limit Service : ĠCredit Limit Service Ċ ) Ġ: ĠRe playing Records Listener () Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" JAVA _ CLASS _ ON _ COMP AN ION ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= Ġget Logger ( java Class ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġapply Event To Store ( event : ĠAny ?, Ġcorrelation Id : ĠString ): ĠAny ? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOrder Opened Ġ-> Ġreturn Ġorder Service . open ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOrder Items Reserved Ġ-> Ġreturn Ġcredit Limit Service . pay Order ( event ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOrder Finished Ġ-> Ġreturn Ġorder Service . delete ( event . id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Business Logic ( event : ĠAny , Ġcorrelation Id : ĠString , Ġevent Response : ĠAny ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . debug (" handle Business Logic ") ĊĠĠĠĠĠĠĠ Ġwhen ( event ) Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOrder Create Ġ-> Ġ{ Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoid Ġ= ĠUUID . randomUUID (). toString () Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkafka Service . send Event ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP IC _ ORD ERS , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoid , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Opened ( Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoid , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . customer Id , Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . items Ids Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), Ċ // ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorrelation Id ) Ċ // ĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠOrder Items Reserved Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpayment Successful Ġ= Ġevent Response Ġas ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( payment Successful ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkafka Service . send Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP IC _ ORD ERS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Payment Successful ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorrelation Id ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġorder Ġ= Ġorder Service . get ( event . id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkafka Service . send Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTOP IC _ ORD ERS , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder Finished ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent . id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġorder . customer Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBigDecimal . ZERO , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠOrder End State . PAYMENT _ FAILED , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" customer Ġ${ order . customer Id } Ġpayment Ġlimit Ġexceeded }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcorrelation Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊ Ċ }