Spring IO 2019大會上Axon+Spring的事件驅動微服務和CQRS原始碼專案
點選標題進入專案,CommandHandler程式碼
@Profile("command") @Aggregate public class Bike { @AggregateIdentifier private String bikeId; private boolean isAvailable; public Bike() { } @CommandHandler public Bike(RegisterBikeCommand command) { apply(new BikeRegisteredEvent(command.getBikeId(), command.getLocation())); } @CommandHandler public void handle(RentBikeCommand command) { if (!this.isAvailable) { throw new IllegalStateException("Bike is already rented"); } apply(new BikeRentedEvent(command.getBikeId(), command.getRenter())); } @CommandHandler public void handle(ReturnBikeCommand command) { if (this.isAvailable) { throw new IllegalStateException("Bike was already returned"); } apply(new BikeReturnedEvent(command.getBikeId(), command.getLocation())); } @EventSourcingHandler protected void handle(BikeRegisteredEvent event) { this.bikeId = event.getBikeId(); this.isAvailable = true; } @EventSourcingHandler protected void handle(BikeReturnedEvent event) { this.isAvailable = true; } @EventSourcingHandler protected void handle(BikeRentedEvent event) { this.isAvailable = false; } } |
用於EventSourcing的歷史實體:
@Profile("history") @Entity public class BikeHistory { @Id @GeneratedValue private Long id; private String bikeId; private String description; private String timestamp; public BikeHistory() { } public BikeHistory(String bikeId, Instant timestamp, String description) { this.bikeId = bikeId; this.timestamp = timestamp.toString(); this.description = description; } public String getBikeId() { return bikeId; } public String getDescription() { return description; } public String getTimestamp() { return timestamp; } } |
領域歷史事件重播到當前狀態:
@Profile("history") @Component public class BikeHistoryProjection { private final BikeHistoryRepository bikeHistoryRepository; private final QueryUpdateEmitter updateEmitter; public BikeHistoryProjection(BikeHistoryRepository bikeHistoryRepository, QueryUpdateEmitter updateEmitter) { this.bikeHistoryRepository = bikeHistoryRepository; this.updateEmitter = updateEmitter; } @EventHandler public void handle(BikeRegisteredEvent event, @Timestamp Instant timestamp) { bikeHistoryRepository.save(new BikeHistory(event.getBikeId(), timestamp, "Bike registered in " + event.getLocation())); } @EventHandler public void handle(BikeRentedEvent event, @Timestamp Instant timestamp) { BikeHistory newEntry = new BikeHistory(event.getBikeId(), timestamp, "Bike rented out to " + event.getRenter()); bikeHistoryRepository.save(newEntry); updateEmitter.emit(m -> "locationHistory".equals(m.getQueryName()) && newEntry.getBikeId().equals(m.getPayload()), newEntry); } @EventHandler public void handle(BikeReturnedEvent event, @Timestamp Instant timestamp) { BikeHistory newEntry = new BikeHistory(event.getBikeId(), timestamp, "Bike returned in " + event.getLocation()); bikeHistoryRepository.save(newEntry); updateEmitter.emit(m -> "locationHistory".equals(m.getQueryName()) && newEntry.getBikeId().equals(m.getPayload()), newEntry); } @QueryHandler(queryName = "locationHistory") public List<BikeHistory> findMovements(String bikeId) { return bikeHistoryRepository.findByBikeIdOrderById(bikeId); } } |
領域事件歷史使用Spring JPA持久:
@Profile("history") public interface BikeHistoryRepository extends JpaRepository<BikeHistory, Long> { List<BikeHistory> findByBikeIdOrderById(String bikeId); } |
相關文章
- 使用領域驅動設計DDD和CQRS實現身份驗證的微服務原始碼專案微服務原始碼
- 事件驅動的微服務-事件驅動設計事件微服務
- 使用Spring Cloud Stream和RabbitMQ實現事件驅動的微服務SpringCloudMQ事件微服務
- 基於事件溯源與CDC的事件驅動微服務架構案例原始碼事件微服務架構原始碼
- 使用Spring Cloud Stream和Spring State Machine建立事件驅動的微服務案例SpringCloudMac事件微服務
- 微服務事件驅動架構演進微服務事件架構
- 領域驅動設計:CQRS 和事件源的強大功能事件
- 為什麼微服務應該是事件驅動?微服務事件
- 事件驅動的微服務-建立第三方庫事件微服務
- Spring:事件驅動Spring事件
- axon框架創始人談微服務與事件驅動框架微服務事件
- 使用TypeScript和nextjs實現基於CQRS的微服務的銀行API原始碼TypeScriptNextJS微服務API原始碼
- 領域驅動設計(DDD)實踐之路(二):事件驅動與CQRS事件
- 如何在Java中實現事件驅動的微服務架構Java事件微服務架構
- Redis 原始碼學習之事件驅動Redis原始碼事件
- 訊息驅動式微服務:Spring Cloud Stream & RabbitMQ微服務SpringCloudMQ
- 微服務、CQRS和eventsourcing開源資源微服務
- 跟著大彬讀原始碼 - Redis 4 - 伺服器的事件驅動有什麼含義?(上)原始碼Redis伺服器事件
- 結合領域事件和微服務的實現領域驅動設計 - Alagarsamy事件微服務
- 微服務專案Git倉庫自動化指令碼微服務Git指令碼
- Event-Sourcing+CQRS的Spring原始碼案例Spring原始碼
- Spring Cloud構建微服務架構:訊息驅動的微服務(消費組)【Dalston版】SpringCloud微服務架構
- Spring Cloud分散式微服務原始碼結構SpringCloud分散式微服務原始碼
- Spring IO Platform專案的介紹和應用SpringPlatform
- 基於gRPC、API閘道器和身份驗證的Go微服務原始碼專案RPCAPIGo微服務原始碼
- Spring中的事件驅動模型(一)Spring事件模型
- 零程式碼快速啟動Node.js微服務專案Node.js微服務
- redis個人原始碼分析筆記3---redis的事件驅動原始碼分析Redis原始碼筆記事件
- 從Turbo Vision原始碼看事件驅動 (轉)原始碼事件
- 基於Spring Cloud Netflix的TCC柔性事務和EDA事件驅動示例SpringCloud事件
- 使用Redis/RabbitMQ/EventStore實現事件溯源CQRS微服務應用 - Aram KoukiaRedisMQ事件微服務
- 使用Apache Kafka實現從單體到事件驅動微服務 - swlhApacheKafka事件微服務
- [譯] 微服務從設計到部署(五)事件驅動資料管理微服務事件
- 【DDD/CQRS/微服務架構案例】在Ubuntu 14.04.4 LTS中執行WeText專案的服務端微服務架構Ubuntu服務端
- spring — Spring中的事件驅動機制解析Spring事件
- 小馬哥Spring事件驅動模型Spring事件模型
- 事件驅動架構正在起飛 – Boyney.io事件架構
- Quarkus和MongoDB微服務簡單案例原始碼MongoDB微服務原始碼