附录

附录 A: Spring Boot 兼容性

Spring Modulith 版本 Spring Boot 版本
(编译时使用)
Spring Boot 版本
(示例测试时使用)
jMolecules
(编译)
jMolecules
(测试)

2.0 (快照)

4.0 快照

4.0 快照和里程碑版本

2023.2

2023.2, 2025.0 RC2

1.4

3.5

3.1, 3.2, 3.3, 3.4, 3.5

2023.2

2023.2, 2025.0 RC2

1.3

3.4

3.1, 3.2, 3.3, 3.4, 3.5

2023.1

2023.1, 2023.2, 2025.0 RC2

1.2

3.3

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

1.1

3.2

3.1, 3.2, 3.3, 3.4

2023.1

2023.1, 2023.2, 2025.0 RC2

附录 B: Spring Modulith 配置属性

财产 默认值 描述

spring.modulith.default-async-termination

true

是否为异步处理终止配置默认值,即等待任务完成 2 秒。详情请参阅 TaskExecutionProperties

spring.modulith.detection-strategy

用于检测应用模块的策略。可以是 ApplicationModuleDetectionStrategy 的自定义实现的类名,或者 direct-subpackages(如果未配置任何内容,这也是最终的回退),或者 explicitly-annotated,仅选择明确使用 @ApplicationModule 或 jMolecules 的 @Module 注解的包。详情请参阅自定义应用模块检测

spring.modulith.events.completion-mode

更新

如何将事件发布标记为已完成。支持以下值:

  • update (默认) — 设置事件发布条目的完成日期。

  • delete — 移除事件发布条目。已完成的事件发布不可通过 CompletedEventPublications 获取。

  • archive — 从主数据库抽象(表、集合或节点)中移除事件发布条目,并在存档(相同模式的表、集合或节点)中创建一个。详情请参阅事件发布完成

spring.modulith.events.externalization.enabled

true

是否启用事件外部化。

spring.modulith.events.externalization.serialize-externalization

是否将事件外部化序列化到代理。

spring.modulith.events.jdbc.schema-initialization.enabled

是否初始化 JDBC 事件发布模式。

spring.modulith.events.jdbc.schema

事件发布表的模式名称。如果未指定,表将不进行模式限定。

spring.modulith.events.jdbc.use-legacy-structure

是否使用遗留的事件发布数据库结构。

spring.modulith.events.kafka.enable-json

true

是否为 KafkaTemplate 启用 JSON 支持。

spring.modulith.events.mongodb.transaction-management.enabled

true

是否自动为 MongoDB 启用事务。需要数据库以副本集运行。

spring.modulith.events.neo4j.event-index.enabled

是否在 Neo4j 事件发布事件哈希属性上创建索引。

spring.modulith.events.rabbitmq.enable-json

true

是否为 RabbitTemplate 启用 JSON 支持。

spring.modulith.events.republish-outstanding-events-on-restart

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

spring.modulith.events.staleness.check-interval

Duration.ofMinutes(1)

我们应该检查过期事件发布的间隔。

spring.modulith.events.staleness.processing

Duration.ZERO

事件发布在处理状态下经过多长时间被视为过期。

spring.modulith.events.staleness.published

Duration.ZERO

事件发布在已发布状态下经过多长时间被视为过期。

spring.modulith.events.staleness.resubmitted

Duration.ZERO

事件发布在重新提交状态下经过多长时间被视为过期。

spring.modulith.moments.enableTimeMachine

是否启用TimeMachine

spring.modulith.moments.granularity

HOURS

要发布的事件的粒度。(HOURSDAYS

spring.modulith.moments.locale

Locale.getDefault()

用于确定周边界的 Locale

spring.modulith.moments.zoneId

ZoneOffset.UTC

发布事件的日期的时区。

spring.modulith.republish-outstanding-events-on-restart

自 1.3 起已弃用。请优先使用 spring.modulith.events.republish-outstanding-events-on-restart

spring.modulith.runtime.flyway-enabled

配置是否启用模块特定的 Flyway 自定义。如果启用,配置在应用程序中的 Flyway 实例将进行增强,以额外执行位于配置位置的模块特定子文件夹中的迁移,按模块依赖关系的顺序执行。这允许测试执行仅应用实际测试运行所需的迁移。详情请参阅此部分

spring.modulith.runtime.verification-enabled

是否在应用程序启动期间验证应用程序模块的排列。需要在类路径上包含 spring-modulith-runtime 工件。更多信息请参阅Spring Modulith 运行时支持部分

spring.modulith.test.file-modification-detector

这可以是预定义值 uncommitted-changesreference-commitdefault 之一,或者是 FileModificationDetector 的完全限定类名,用于检查项目中的哪些文件已更改。正如其名称所示,uncommitted-changes 将仅考虑尚未提交的已更改文件。reference-commit 将考虑自通过 spring.modulith.test.reference-commit 提供的给定 Git 提交以来的所有已更改文件,这在 CI 环境中特别有用,其中该属性可以指向上次成功构建的提交哈希。default 检测所有未提交的更改以及尚未推送到当前分支的跟踪分支的更改,这主要用于本地开发。

spring.modulith.test.reference-commit

用于计算已更改文件集的提交哈希。通常在 CI 环境中传播,以考虑自上次成功构建以来的所有更改。

附录 C: Spring Modulith 模块

表 1. Spring Modulith starter POM
启动器 典型范围 包括

spring-modulith-starter-core

compile

  • spring-modulith-api

  • spring-modulith-apt

  • spring-modulith-moments

  • spring-modulith-core (runtime)

  • spring-modulith-runtime (runtime)

spring-modulith-starter-insight

runtime

  • spring-modulith-actuator (runtime)

  • spring-modulith-observability (runtime)

  • spring-boot-starter-actuator (runtime)

spring-modulith-starter-jdbc

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jdbc (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-jpa

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-jpa (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-mongodb

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-mongodb (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-neo4j

compile

  • spring-modulith-starter-core

  • spring-modulith-events-api

  • spring-modulith-events-core (runtime)

  • spring-modulith-events-neo4j (runtime)

  • spring-modulith-events-jackson (runtime)

spring-modulith-starter-test

test

  • spring-modulith-docs

  • spring-modulith-test

表 2. 单独的 Spring Modulith JAR
模块 典型范围 描述

spring-modulith-actuator

runtime

一个 Spring Boot 执行器,通过执行器公开应用程序模块结构。

spring-modulith-api

compile

在生产代码中用于自定义 Spring Modulith 默认行为的抽象。

spring-modulith-apt

compile

一个注解处理器,用于提取 Javadoc 以包含在应用模块画布中。

spring-modulith-core

runtime

核心应用模块模型和 API。

spring-modulith-docs

test

Documenter API,用于从模块模型创建 Asciidoctor 和 PlantUML 文档。

spring-modulith-events-amqp

runtime

AMQP 的事件外部化支持。

spring-modulith-events-api

runtime

用于自定义 Spring Modulith 事件功能的 API。

spring-modulith-events-core

runtime

事件发布注册表的核心实现,以及集成抽象 EventPublicationRegistryEventPublicationSerializer

spring-modulith-events-jackson

runtime

EventPublicationSerializer 的基于 Jackson 的实现。

spring-modulith-events-jdbc

runtime

EventPublicationRegistry 的基于 JDBC 的实现。

spring-modulith-events-jms

runtime

JMS 的事件外部化支持。

spring-modulith-events-jpa

runtime

EventPublicationRegistry 的基于 JPA 的实现。

spring-modulith-events-kafka

runtime

Kafka 的事件外部化支持。

spring-modulith-events-messaging

runtime

将事件外部化到 Spring Messaging MessageChannel 的支持。

spring-modulith-events-mongodb

runtime

EventPublicationRegistry 的基于 MongoDB 的实现。

spring-modulith-events-neo4j

runtime

EventPublicationRegistry 的基于 Neo4j 的实现。

spring-modulith-junit

test

基于应用模块结构的测试执行优化。更多详情请参见此处

spring-modulith-moments

compile

此处描述的时光流逝事件实现此处

spring-modulith-observability

runtime

此处描述的可观测性基础设施此处

spring-modulith-runtime

runtime

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

spring-modulith-test

test

集成测试支持。更多详情请参见此处

附录 D: 事件发布注册表模式

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

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.ApplicationModules

  • o.m.model.ModuleDetectionStrategy 已重命名为 o.s.m.model.ApplicationModuleDetectionStrategy

  • @o.m.test.ModuleTest 已重命名为 @o.s.m.test.ApplicationModuleTest

  • o.m.docs.Documenter.Options 已重命名为 o.s.m.docs.Documenter.DiagramOptions

  • 组件图的图表样式现在默认为 DiagramStyle.C4(通过调用 DiagramOptions.withStyle(DiagramStyle.UML) 覆盖)

  • 模块画布默认隐藏未公开的类型。要在画布中包含应用程序模块内部类型,请将 CanvasOptions 配置为 ….revealInternals()

  • 组件图和应用模块画布的输出文件夹已从 moduliths-docs 移动到位于构建目标文件夹(例如 Maven 的 target)中的 spring-modulith-docs

© . This site is unofficial and not affiliated with VMware.