此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Modulith 2.0.4spring-doc.cadn.net.cn

附录

附录 A:Spring Boot 兼容性

Spring Modulith 版本 Spring Boot 版本
(编译自)
Spring Boot 版本
(示例已针对以下环境测试)
jMolecules
(已编译)
jMolecules
(已测试)

2.0(快照版)spring-doc.cadn.net.cn

4.0 快照版spring-doc.cadn.net.cn

4.0 快照和里程碑版本spring-doc.cadn.net.cn

2023.2spring-doc.cadn.net.cn

2023.2, 2025.0 RC2spring-doc.cadn.net.cn

1.4spring-doc.cadn.net.cn

3.5spring-doc.cadn.net.cn

3.1, 3.2, 3.3, 3.4, 3.5spring-doc.cadn.net.cn

2023.2spring-doc.cadn.net.cn

2023.2, 2025.0 RC2spring-doc.cadn.net.cn

1.3spring-doc.cadn.net.cn

3.4spring-doc.cadn.net.cn

3.1, 3.2, 3.3, 3.4, 3.5spring-doc.cadn.net.cn

2023.1spring-doc.cadn.net.cn

2023.1, 2023.2, 2025.0 RC2spring-doc.cadn.net.cn

1.2spring-doc.cadn.net.cn

3.3spring-doc.cadn.net.cn

3.1, 3.2, 3.3, 3.4spring-doc.cadn.net.cn

2023.1spring-doc.cadn.net.cn

2023.1, 2023.2, 2025.0 RC2spring-doc.cadn.net.cn

1.1spring-doc.cadn.net.cn

3.2spring-doc.cadn.net.cn

3.1, 3.2, 3.3, 3.4spring-doc.cadn.net.cn

2023.1spring-doc.cadn.net.cn

2023.1, 2023.2, 2025.0 RC2spring-doc.cadn.net.cn

附录 B:Spring Modulith 配置属性

属性 默认值 描述

spring.modulith.default-async-terminationspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否配置异步处理终止的默认值,即等待任务完成 2 秒。详见TaskExecutionProperties以获取详细信息。spring-doc.cadn.net.cn

spring.modulith.detection-strategyspring-doc.cadn.net.cn

spring-doc.cadn.net.cn

用于检测应用程序模块的策略。 可以是 ApplicationModuleDetectionStrategydirect-subpackages(若未进行任何配置,则作为最终回退方案)的自定义实现类名,也可以是 explicitly-annotated 以仅选择显式标注了 @ApplicationModule 或 jMolecules 的 @Module 的包。详情请参阅 自定义应用程序模块检测spring-doc.cadn.net.cn

spring.modulith.events.completion-modespring-doc.cadn.net.cn

updatespring-doc.cadn.net.cn

如何将事件发布标记为已完成。 支持以下值:spring-doc.cadn.net.cn

  • update(默认)— 设置事件发布条目的完成日期。spring-doc.cadn.net.cn

  • delete — 移除事件发布条目。 已完成的事件发布无法通过 CompletedEventPublications 获取。spring-doc.cadn.net.cn

  • archive — 从主数据库抽象(表、集合或节点)中移除事件发布条目,并在归档(具有相同模式的表、集合或节点)中创建一个新条目。 详细信息请参阅 事件发布完成spring-doc.cadn.net.cn

spring.modulith.events.externalization.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否启用事件外部化。spring-doc.cadn.net.cn

spring.modulith.events.externalization.modespring-doc.cadn.net.cn

module-listenerspring-doc.cadn.net.cn

事件外部化的模式。详见 事件外部化。 支持以下值:spring-doc.cadn.net.cn

* module-listener(默认)— 事件通过@ApplicationModuleListener外部化。 * outbox — 事件通过实际的外箱实现进行外部化。spring-doc.cadn.net.cn

spring.modulith.events.externalization.serialize-externalizationspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否将事件外部化序列化到代理。spring-doc.cadn.net.cn

spring.modulith.events.jdbc.schema-initialization.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否初始化 JDBC 事件发布模式。spring-doc.cadn.net.cn

spring.modulith.events.jdbc.schemaspring-doc.cadn.net.cn

事件发布表的模式名称。如果未指定,则该表将不带模式限定。spring-doc.cadn.net.cn

spring.modulith.events.jdbc.use-legacy-structurespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否使用旧版事件发布数据库结构。spring-doc.cadn.net.cn

spring.modulith.events.kafka.enable-jsonspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否启用 KafkaTemplate 的 JSON 支持。spring-doc.cadn.net.cn

spring.modulith.events.mongodb.transaction-management.enabledspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否自动为 MongoDB 启用事务。这需要数据库以副本集模式运行。spring-doc.cadn.net.cn

spring.modulith.events.neo4j.event-index.enabledspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否在 Neo4j 事件发布的事件哈希属性上创建索引。spring-doc.cadn.net.cn

spring.modulith.events.rabbitmq.enable-jsonspring-doc.cadn.net.cn

truespring-doc.cadn.net.cn

是否启用 RabbitTemplate 的 JSON 支持。spring-doc.cadn.net.cn

spring.modulith.events.republish-outstanding-events-on-restartspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否在应用程序重启时重新发布未完成的事件公告。 通常在多实例部署中不推荐,因为其他实例可能仍在处理事件。spring-doc.cadn.net.cn

spring.modulith.events.staleness.check-intervalspring-doc.cadn.net.cn

Duration.ofMinutes(1)spring-doc.cadn.net.cn

陈旧性监控器 运行以将过期的事件发布标记为失败的间隔时间。spring-doc.cadn.net.cn

spring.modulith.events.staleness.processingspring-doc.cadn.net.cn

Duration.ZEROspring-doc.cadn.net.cn

事件发布在处理状态下经过多长时间后被视为过期。spring-doc.cadn.net.cn

spring.modulith.events.staleness.publishedspring-doc.cadn.net.cn

Duration.ZEROspring-doc.cadn.net.cn

事件发布处于已发布状态后,经过多长时间会被视为过期。spring-doc.cadn.net.cn

spring.modulith.events.staleness.resubmittedspring-doc.cadn.net.cn

Duration.ZEROspring-doc.cadn.net.cn

事件发布在重新提交状态下,经过多长时间后被视为过时。spring-doc.cadn.net.cn

spring.modulith.moments.enableTimeMachinespring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否启用 TimeMachinespring-doc.cadn.net.cn

spring.modulith.moments.granularityspring-doc.cadn.net.cn

HOURSspring-doc.cadn.net.cn

发布事件的粒度。(HOURSDAYSspring-doc.cadn.net.cn

spring.modulith.moments.localespring-doc.cadn.net.cn

Locale.getDefault()spring-doc.cadn.net.cn

确定周边界时要使用的Localespring-doc.cadn.net.cn

spring.modulith.moments.zoneIdspring-doc.cadn.net.cn

ZoneOffset.UTCspring-doc.cadn.net.cn

发布事件日期的时区。spring-doc.cadn.net.cn

spring.modulith.republish-outstanding-events-on-restartspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

自 1.3 版本起已弃用。推荐使用 spring.modulith.events.republish-outstanding-events-on-restartspring-doc.cadn.net.cn

spring.modulith.runtime.flyway-enabledspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

配置是否启用模块特定的 Flyway 自定义。 如果启用,应用程序配置的 Flyway 实例将得到增强,以额外执行位于已配置位置的模块特定子文件夹中的迁移,并按模块依赖顺序执行。 这使得测试执行仅应用实际测试运行所需的迁移。 详见 此部分spring-doc.cadn.net.cn

spring.modulith.runtime.verification-enabledspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

是否在应用程序启动期间验证应用模块的排列。需要类路径上存在 spring-modulith-runtime 构件。更多信息,请参阅关于 Spring Modulith 运行时支持 的章节以获取详情。spring-doc.cadn.net.cn

spring.modulith.test.file-modification-detectorspring-doc.cadn.net.cn

spring-doc.cadn.net.cn

这可以是预定义值 uncommitted-changesreference-commitdefault 之一,也可以是 FileModificationDetector 的全限定类名,该类将用于检查项目中哪些文件发生了变更。 顾名思义,uncommitted-changes 仅考虑尚未提交的已变更文件。 reference-commit 会考虑自通过 spring.modulith.test.reference-commit 提供的指定 Git 提交以来的所有变更文件,这在 CI 环境中特别有用,因为该属性可以指向最后一次成功构建的提交哈希值。 default 检测所有未提交的变更,以及尚未推送到当前分支跟踪分支的变更,这主要适用于本地开发。spring-doc.cadn.net.cn

spring.modulith.test.on-no-changesspring-doc.cadn.net.cn

execute-allspring-doc.cadn.net.cn

当未检测到类路径或构建资源变更时,是执行 (execute-all) 还是跳过 (skip-all) 所有测试。spring-doc.cadn.net.cn

spring.modulith.test.reference-commitspring-doc.cadn.net.cn

spring-doc.cadn.net.cn

用于计算变更文件集的提交哈希值。 通常在 CI 环境中传播,以考虑自上次成功构建以来的所有变更。spring-doc.cadn.net.cn

spring.modulith.test.thread-bound-published-eventsspring-doc.cadn.net.cn

falsespring-doc.cadn.net.cn

无论 Scenario 还是 PublishedEvents 实例应当绑定到线程,即它是否应当仅看到执行测试的线程及其所有派生子线程所产生的事件。spring-doc.cadn.net.cn

附录 C:Spring Modulith 模块

表 1. Spring Modulith Starters POM
starter 典型作用域 包含

spring-modulith-starter-corespring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

spring-modulith-starter-insightspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

spring-modulith-starter-jdbcspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

spring-modulith-starter-jpaspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

spring-modulith-starter-mongodbspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

spring-modulith-starter-neo4jspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

spring-modulith-starter-testspring-doc.cadn.net.cn

testspring-doc.cadn.net.cn

表 2. 独立的 Spring Modulith JAR
模块 典型作用域 描述

spring-modulith-actuatorspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

一个 Spring Boot 执行器,用于通过执行器暴露应用程序模块结构。spring-doc.cadn.net.cn

spring-modulith-apispring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

用于在生产代码中自定义 Spring Modulith 默认行为的抽象组件。spring-doc.cadn.net.cn

spring-modulith-aptspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

一个用于提取 Javadoc 以便包含在应用模块画布中的注解处理器。spring-doc.cadn.net.cn

spring-modulith-corespring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

核心应用程序模块模型和 API。spring-doc.cadn.net.cn

spring-modulith-docsspring-doc.cadn.net.cn

testspring-doc.cadn.net.cn

用于从模块模型创建 Asciidoctor 和 PlantUML 文档的 Documenter API。spring-doc.cadn.net.cn

spring-modulith-events-amqpspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

支持将事件外部化到 AMQP。spring-doc.cadn.net.cn

spring-modulith-events-apispring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

用于自定义 Spring Modulith 事件功能的 API。spring-doc.cadn.net.cn

spring-modulith-events-corespring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

事件发布注册表的核心实现,以及集成抽象 EventPublicationRegistryEventPublicationSerializerspring-doc.cadn.net.cn

spring-modulith-events-jacksonspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

基于 Jackson 的 EventPublicationSerializer 实现。spring-doc.cadn.net.cn

spring-modulith-events-jdbcspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

基于 JDBC 实现的 EventPublicationRegistryspring-doc.cadn.net.cn

spring-modulith-events-jmsspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

支持 JMS 的事件外部化。spring-doc.cadn.net.cn

spring-modulith-events-jpaspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

基于 JPA 的 EventPublicationRegistry 实现。spring-doc.cadn.net.cn

spring-modulith-events-kafkaspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

支持 Kafka 的事件外部化。spring-doc.cadn.net.cn

spring-modulith-events-messagingspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

将事件外部化支持引入 Spring Messaging MessageChannels。spring-doc.cadn.net.cn

spring-modulith-events-mongodbspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

基于 MongoDB 的 EventPublicationRegistry 实现。spring-doc.cadn.net.cn

spring-modulith-events-neo4jspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

基于 Neo4j 实现的EventPublicationRegistryspring-doc.cadn.net.cn

spring-modulith-junitspring-doc.cadn.net.cn

testspring-doc.cadn.net.cn

基于应用程序模块结构的测试执行优化。更多详情请点击 此处spring-doc.cadn.net.cn

spring-modulith-momentsspring-doc.cadn.net.cn

compilespring-doc.cadn.net.cn

时间流逝事件的实现描述见此处spring-doc.cadn.net.cn

spring-modulith-observabilityspring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

可观测性基础设施描述见 此处spring-doc.cadn.net.cn

spring-modulith-runtimespring-doc.cadn.net.cn

runtimespring-doc.cadn.net.cn

支持在运行时引导一个 ApplicationModules 实例。通常不直接依赖,而是由 spring-modulith-actuatorspring-modulith-observability 传递性使用。spring-doc.cadn.net.cn

spring-modulith-testspring-doc.cadn.net.cn

testspring-doc.cadn.net.cn

集成测试支持。更多详情请点击此处spring-doc.cadn.net.cn

附录 D:事件发布注册表架构

基于 JDBC 的事件发布注册表支持要求数据库中存在以下数据库模式。 如果您希望 Spring Modulith 为您创建该模式,请将应用程序属性 spring.modulith.events.jdbc-schema-initialization.enabled 设置为 truespring-doc.cadn.net.cn

H2

当前模式

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID                     UUID NOT NULL,
  COMPLETION_DATE        TIMESTAMP(9) WITH TIME ZONE,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(9) WITH TIME ZONE NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(9) WITH TIME ZONE,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
    ID                     UUID NOT NULL,
    COMPLETION_DATE        TIMESTAMP(9) WITH TIME ZONE,
    EVENT_TYPE             VARCHAR(512) NOT NULL,
    LISTENER_ID            VARCHAR(512) NOT NULL,
    PUBLICATION_DATE       TIMESTAMP(9) WITH TIME ZONE NOT NULL,
    SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
    `STATUS`               VARCHAR(20),
    COMPLETION_ATTEMPTS    INT,
    LAST_RESUBMISSION_DATE TIMESTAMP(9) WITH TIME ZONE,
    PRIMARY KEY (ID)
    );
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION_ARCHIVE (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION_ARCHIVE (COMPLETION_DATE);

旧版架构

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9) WITH TIME ZONE,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
    ID               UUID NOT NULL,
    COMPLETION_DATE  TIMESTAMP(9) WITH TIME ZONE,
                                      EVENT_TYPE       VARCHAR(512) NOT NULL,
    LISTENER_ID      VARCHAR(512) NOT NULL,
    PUBLICATION_DATE TIMESTAMP(9) WITH TIME ZONE NOT NULL,
                                      SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
    PRIMARY KEY (ID)
    );
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION_ARCHIVE (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION_ARCHIVE (COMPLETION_DATE);

HSQLDB

当前模式

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID                     UUID NOT NULL,
  COMPLETION_DATE        TIMESTAMP(9),
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(9) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(9),
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
  ID                     UUID NOT NULL,
  COMPLETION_DATE        TIMESTAMP(9),
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(9) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(9),
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION_ARCHIVE (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION_ARCHIVE (COMPLETION_DATE);

旧版架构

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               UUID NOT NULL,
  COMPLETION_DATE  TIMESTAMP(9),
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(9) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PRIMARY KEY (ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
    ID               UUID NOT NULL,
    COMPLETION_DATE  TIMESTAMP(9),
    EVENT_TYPE       VARCHAR(512) NOT NULL,
    LISTENER_ID      VARCHAR(512) NOT NULL,
    PUBLICATION_DATE TIMESTAMP(9) NOT NULL,
    SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
    PRIMARY KEY (ID)
    );
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_LISTENER_ID_AND_SERIALIZED_EVENT_IDX ON EVENT_PUBLICATION_ARCHIVE (LISTENER_ID, SERIALIZED_EVENT);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION_ARCHIVE (COMPLETION_DATE);

MariaDB

当前模式

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE        TIMESTAMP(6) DEFAULT NULL NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(6),
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE        TIMESTAMP(6) DEFAULT NULL NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(6),
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

旧版架构

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
    ID               VARCHAR(36) NOT NULL,
    LISTENER_ID      VARCHAR(512) NOT NULL,
    EVENT_TYPE       VARCHAR(512) NOT NULL,
    SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
    PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
    COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
    PRIMARY KEY (ID),
    INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
    );

Microsoft SQL Server

当前模式

标准模式
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION')
CREATE TABLE EVENT_PUBLICATION
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE       DATETIME2(6) NOT NULL,
  COMPLETION_DATE        DATETIME2(6) NULL,
  STATUS                 VARCHAR(20) NULL,
  COMPLETION_ATTEMPTS    INT NULL,
  LAST_RESUBMISSION_DATE DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION_ARCHIVE')
CREATE TABLE EVENT_PUBLICATION_ARCHIVE
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE       DATETIME2(6) NOT NULL,
  COMPLETION_DATE        DATETIME2(6) NULL,
  STATUS                 VARCHAR(20) NULL,
  COMPLETION_ATTEMPTS    INT NULL,
  LAST_RESUBMISSION_DATE DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

旧版架构

标准模式
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION')
CREATE TABLE EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE DATETIME2(6) NOT NULL,
  COMPLETION_DATE  DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'EVENT_PUBLICATION_ARCHIVE')
CREATE TABLE EVENT_PUBLICATION_ARCHIVE
(
    ID               VARCHAR(36) NOT NULL,
    LISTENER_ID      VARCHAR(512) NOT NULL,
    EVENT_TYPE       VARCHAR(512) NOT NULL,
    SERIALIZED_EVENT VARCHAR(MAX) NOT NULL,
  PUBLICATION_DATE DATETIME2(6) NOT NULL,
  COMPLETION_DATE  DATETIME2(6) NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

MySQL

当前模式

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE        TIMESTAMP(6) DEFAULT NULL NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
  ID                     VARCHAR(36) NOT NULL,
  LISTENER_ID            VARCHAR(512) NOT NULL,
  EVENT_TYPE             VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT       VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE       TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE        TIMESTAMP(6) DEFAULT NULL NULL,
  STATUS                 VARCHAR(20),
  COMPLETION_ATTEMPTS    INT,
  LAST_RESUBMISSION_DATE TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);

旧版架构

标准模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION
(
  ID               VARCHAR(36) NOT NULL,
  LISTENER_ID      VARCHAR(512) NOT NULL,
  EVENT_TYPE       VARCHAR(512) NOT NULL,
  SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
  PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
  COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
  PRIMARY KEY (ID),
  INDEX EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
);
启用归档的模式
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION_ARCHIVE
(
    ID               VARCHAR(36) NOT NULL,
    LISTENER_ID      VARCHAR(512) NOT NULL,
    EVENT_TYPE       VARCHAR(512) NOT NULL,
    SERIALIZED_EVENT VARCHAR(4000) NOT NULL,
    PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
    COMPLETION_DATE  TIMESTAMP(6) DEFAULT NULL NULL,
    PRIMARY KEY (ID),
    INDEX EVENT_PUBLICATION_ARCHIVE_BY_COMPLETION_DATE_IDX (COMPLETION_DATE)
    );

PostgreSQL

当前模式

标准模式
CREATE TABLE IF NOT EXISTS event_publication
(
  id                     UUID NOT NULL,
  listener_id            TEXT NOT NULL,
  event_type             TEXT NOT NULL,
  serialized_event       TEXT NOT NULL,
  publication_date       TIMESTAMP WITH TIME ZONE NOT NULL,
  completion_date        TIMESTAMP WITH TIME ZONE,
  status                 TEXT,
  completion_attempts    INT,
  last_resubmission_date TIMESTAMP WITH TIME ZONE,
  PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS event_publication_serialized_event_hash_idx ON event_publication USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_by_completion_date_idx ON event_publication (completion_date);
启用归档的模式
CREATE TABLE IF NOT EXISTS event_publication_archive
(
  id                     UUID NOT NULL,
  listener_id            TEXT NOT NULL,
  event_type             TEXT NOT NULL,
  serialized_event       TEXT NOT NULL,
  publication_date       TIMESTAMP WITH TIME ZONE NOT NULL,
  completion_date        TIMESTAMP WITH TIME ZONE,
  status                 TEXT,
  completion_attempts    INT,
  last_resubmission_date TIMESTAMP WITH TIME ZONE,
  PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS event_publication_archive_serialized_event_hash_idx ON event_publication_archive USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_archive_by_completion_date_idx ON event_publication_archive (completion_date);

旧版架构

标准模式
CREATE TABLE IF NOT EXISTS event_publication
(
  id               UUID NOT NULL,
  listener_id      TEXT NOT NULL,
  event_type       TEXT NOT NULL,
  serialized_event TEXT NOT NULL,
  publication_date TIMESTAMP WITH TIME ZONE NOT NULL,
  completion_date  TIMESTAMP WITH TIME ZONE,
  PRIMARY KEY (id)
);
CREATE INDEX IF NOT EXISTS event_publication_serialized_event_hash_idx ON event_publication USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_by_completion_date_idx ON event_publication (completion_date);
启用归档的模式
CREATE TABLE IF NOT EXISTS event_publication_archive
(
    id               UUID NOT NULL,
    listener_id      TEXT NOT NULL,
    event_type       TEXT NOT NULL,
    serialized_event TEXT NOT NULL,
    publication_date TIMESTAMP WITH TIME ZONE NOT NULL,
    completion_date  TIMESTAMP WITH TIME ZONE,
    PRIMARY KEY (id)
    );
CREATE INDEX IF NOT EXISTS event_publication_archive_serialized_event_hash_idx ON event_publication_archive USING hash(serialized_event);
CREATE INDEX IF NOT EXISTS event_publication_archive_by_completion_date_idx ON event_publication_archive (completion_date);

附录 E:从 Moduliths 迁移

  • o.m.model.Modules 已重命名为 o.s.m.model.ApplicationModulesspring-doc.cadn.net.cn

  • o.m.model.ModuleDetectionStrategy 已重命名为 o.s.m.model.ApplicationModuleDetectionStrategyspring-doc.cadn.net.cn

  • @o.m.test.ModuleTest 已重命名为 @o.s.m.test.ApplicationModuleTestspring-doc.cadn.net.cn

  • o.m.docs.Documenter.Options 已重命名为 o.s.m.docs.Documenter.DiagramOptionsspring-doc.cadn.net.cn

  • 组件图的图表样式现在默认为 DiagramStyle.C4(可通过调用 DiagramOptions.withStyle(DiagramStyle.UML) 进行覆盖)spring-doc.cadn.net.cn

  • 模块画布默认隐藏未暴露的类型。 若要在画布中包含 application-module-internal 类型,请将 CanvasOptions 配置为 ….revealInternals()spring-doc.cadn.net.cn

  • 组件图和应用模块画布的输出文件夹已从 moduliths-docs 移至构建目标文件夹中的 spring-modulith-docs(例如,对于 Maven 为 target)。spring-doc.cadn.net.cn