同一個專案中的多個Spring Boot應用實現CQRS - itnext
展示瞭如何使用兩種不同的程式碼路徑實現 CQRS:
- 命令部分透過Spring Data JPA 實現
- 透過jOOQ的查詢部分
用例是一個銀行應用程式,它提供了一個 REST 層,允許客戶端呼叫任何部分。
在同一個專案中建立另一個帶註釋@SpringBootApplication的類:
@SpringBootApplication public class GeneratorApplication { @Bean public CommandLineRunner run() { var template = new RestTemplate(); return args -> { var operation = generateRandomOperation(); // 1 LongStream.range(0, Long.parseLong(args[0])) // 2 .forEach( operation -> template.postForObject( // 3 "http://localhost:8080/operation", operation, Object.class)); }; } public static void main(String[] args) { new SpringApplicationBuilder(GeneratorApplication.class) .run(args); } } |
- Operation以某種方式生成隨機
- 從引數中獲取呼叫次數
- 呼叫主 Web 應用程式的 URL
當我在另一個 Web 應用程式之後啟動此應用程式時,它失敗了。有兩個原因:
- 兩個應用程式共享相同的 Maven POM。由於 位於spring-boot-starter-web類路徑上,因此生成器應用程式會嘗試啟動 Tomcat。它失敗是因為第一個應用程式確實繫結了預設埠。
- Spring Boot 預設依賴元件掃描。因此,Web 應用程式掃描生成器應用程式及其宣告的 bean 並建立它們。可以透過這種方式重新定義一些 bean。但是,webapp 也會建立CommandLineRunner上面的bean。因此,當它的伺服器還沒有準備好時,它“向自己釋出”。
最直接的解決方案是將每個應用程式的類移動到它們自己專用的 Maven 模組中。您需要在每個模組中建立一個 POM,其中只包含必要的依賴項。另外,我需要在 webapp 的執行器中使用幾個類。雖然我可以在另一個模組中複製它們,但這是額外的工作和複雜性。
為了防止類路徑掃描,我們將每個應用程式類移動到它的包中。請注意,當包具有父子關係時它不起作用:它們必須是兄弟姐妹。
要建立特定類的 bean,我們需要根據它們的性質依賴特定的註釋:
- 對於 JPA 實體,@EntityScan, 指向要掃描的包
- 對於 JPA 儲存庫,@EnableJpaRepositories, 指向要掃描的包
- 對於其他類,@Import指向要從中生成 bean 的類
最後一步是防止生成器應用程式啟動網路伺服器。您可以在啟動應用程式時對其進行配置。
@SpringBootApplication @EnableJpaRepositories("org.hazelcast.cqrs") // 1 @EntityScan("org.hazelcast.cqrs") // 2 public class GeneratorApplication { public static void main(String[] args) { new SpringApplicationBuilder(GeneratorApplication.class) .web(WebApplicationType.NONE) // 3 .run(args); } // Command-line runner } |
- 掃描 JPA 儲存庫
- 掃描 JPA 實體
- 阻止 Web 伺服器啟動
它按預期工作,我們終於可以從設定中獲益。
相關文章
- 使用Spring Boot的10多個免費開源專案Spring Boot
- 使用Spring Boot和Kafka Streams實現CQRSSpring BootKafka
- Spring Boot 之路(一):一個簡單的Spring Boot應用Spring Boot
- 同一臺伺服器部署多個專案,實現不同域名訪問伺服器
- Intellij IDEA 中 的spring boot 專案使用了spring-boot-devtools要做的兩個設定IntelliJIdeaSpring Bootdev
- 如何在github同一個倉庫上傳多個專案Github
- iOS 同一個workspace下建立多個專案程式設計iOS程式設計
- Spring Boot 中的同一個 Bug,竟然把我坑了兩次!Spring Boot
- 在spring boot專案(maven)中引入其他 spring boot專案Spring BootMaven
- 快速建立你的第一個Spring Boot專案Spring Boot
- Spring Boot實際專案用簡單的AOPSpring Boot
- (譯)使用Spring Boot和Axon實現CQRS&Event SourcingSpring Boot
- 推薦一個開源免費的 Spring Boot 實戰專案Spring Boot
- 如何把Electron做成一個Runtime,讓多個應用共享同一個Electron
- 同一會話中的多個 WebRequest會話Web
- 構建第一個基於 Gradle 的 Spring Boot 專案GradleSpring Boot
- Eclipse通過EGit外掛提交多個專案到同一個倉庫EclipseGit
- 如何將一個spring專案重構成spring-boot專案(僅後臺)Springboot
- Spring Boot 應用程式中的 QueryDSLSpring Boot
- Spring Boot中實現乾淨API響應Spring BootAPI
- 使用 SAP BTP 建立一個 Spring Boot Java 應用Spring BootJava
- spring-boot-route(三)實現多檔案上傳Springboot
- [譯] 用 Apache Shiro 來保護一個 Spring Boot 應用ApacheSpring Boot
- 使用Spring Boot開發的10個免費開源專案Spring Boot
- 將多個實體類集合寫入同一個 Excel 檔案的不同 Sheet 頁Excel
- Spring Boot + MyBatis 多模組專案搭建教程Spring BootMyBatis
- 使用Spring Boot實現微服務架構的開源專案Spring Boot微服務架構
- Github 上 Star 最多的個人 Spring Boot 開源學習專案GithubSpring Boot
- Spring Boot中五個設計模式最佳實踐Spring Boot設計模式
- Spring Boot應用監控實戰Spring Boot
- Spring boot webflux 中實現 RequestContextHolderSpring BootWebUXContext
- Spring Boot中實現Thymeleaf通知Spring Boot
- Spring Boot專案建立Spring Boot
- Spring Boot + MongoDB 應用的 Docker 化實踐Spring BootMongoDBDocker
- django中多個app的路由實現DjangoAPP路由
- Guava Cache本地快取在 Spring Boot應用中的實踐Guava快取Spring Boot
- Spring Boot入門(一):搭建Spring Boot專案Spring Boot
- 你真的理解 Spring Boot 專案中的 parent 嗎?Spring Boot