同一個專案中的多個Spring Boot應用實現CQRS - itnext

banq發表於2021-12-08

展示瞭如何使用兩種不同的程式碼路徑實現 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);
    }
}

  1. Operation以某種方式生成隨機
  2. 從引數中獲取呼叫次數
  3. 呼叫主 Web 應用程式的 URL

當我在另一個 Web 應用程式之後啟動此應用程式時,它失敗了。有兩個原因:
  1. 兩個應用程式共享相同的 Maven POM。由於 位於spring-boot-starter-web類路徑上,因此生成器應用程式會嘗試啟動 Tomcat。它失敗是因為第一個應用程式確實繫結了預設埠。
  2. 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
}

  1. 掃描 JPA 儲存庫
  2. 掃描 JPA 實體
  3. 阻止 Web 伺服器啟動

它按預期工作,我們終於可以從設定中獲益。

相關文章