关于 SyncContextFactory

除其他外,此模块实现了 SyncContextFactory。同步上下文工厂组件负责同步(协调)对 Maven 解析器内部共享资源的访问。一些示例: - 在单个主机上构建单线程 (ST):默认情况下以多线程 (MT) 方式给出解决方案,必须保护本地存储库中的文件不被同时访问。在这种情况下,在单个 JVM 进程级别“本地”发生协调就足够了。- 在单个主机上构建多线程 (MT):与上述相同的问题,但乘以 MT 构建线程。如上所述,在这种情况下,在 JVM 进程级别“本地”发生协调就足够了。- 多进程(MP)构建在单个主机上:如果多个进程“共享”(访问,设置为使用)同一个本地存储库,进程之间也必须存在协调。这里的协调必须跨越共享相同资源的多个 JVM 进程。- 使用相同(例如 NFS 挂载)本地存储库在多个主机上构建多进程 (MP)。同样,共享资源(NFS 挂载的本地存储库)应受到保护,以免同时访问。在这里,协调必须跨越所有涉及的主机的所有进程。

可以看出,ST 和 MT 情况只能通过 JVM 级别的“本地”锁定来解决。在 MP 单主机情况下需要跨进程,在 MP 多主机情况下需要跨进程和跨主机协调。

Maven Resolver 中的默认值涵盖了开箱即用的 ST 和 MT 案例(默认情况下)。

接口org.eclipse.aether.spi.synccontext.SyncContextFactory的此模块实现使用名为锁的解析器。

“命名” SyncContextFactory的配置选项

您可以控制和配置NamedSyncContextFactory的几个方面:

  • aether.syncContext.named.factory(可选,默认为rwlock-local):要使用的命名锁工厂。
  • aether.syncContext.named.nameMapper(可选,默认为gav):根据工件坐标创建锁名称。
  • aether.syncContext.named.time(可选,默认为30):尝试获取锁被阻塞的时间值。
  • aether.syncContext.named.time.unit(可选,默认为java.util.concurrent.TimeUnit.SECONDS):时间值的时间单位。

对于aether.syncContext.named.factory属性,允许使用以下值:

  • rwlock-local(默认),每个锁名称使用 JVM ReentrantReadWriteLock,可用于 MT 构建。
  • semaphore-local,每个锁名称使用 JVM Semaphore,可用于 MT 构建。
  • file-lock,使用建议文件锁定,可用于 MP 构建(必须与file-gav名称映射一起使用)。
  • noop,实现无操作锁定(无锁定)。仅供实验。具有与旧的“nolock”SyncContextFactory 实现相同的功能。

对于aether.syncContext.named.nameMapper属性,允许使用以下值:

  • 区分(默认),使用主机名 + 本地 repo + GAV 为工件创建唯一的锁名称。
  • gav使用 GAV 为工件和元数据创建唯一的锁名称。如果涉及多个本地存储库,则不是唯一的。
  • file-gav使用 GAV 和 session 创建绝对文件路径(与文件锁工厂一起使用)
  • static使用静态(相同)字符串作为任何输入的锁名称。有效地提供与旧的“全局”锁定 SyncContextFactory 相同的功能。

工厂的额外值(这些需要额外设置并且仅适用于 Sisu DI):

  • semaphore-hazelcast,分布式,可用于 MT 和 MP 构建,需要额外的设置
  • semaphore-hazelcast-client,分布式,可用于 MT 和 MP 构建,需要额外的设置
  • rwlock-redisson,分布式,可用于 MT 和 MP 构建,需要额外设置
  • semaphore-redisson,分布式,可用于 MT 和 MP 构建,需要额外的设置

其他配置键:

  • aether.syncContext.named.static.name,如果使用静态名称映射器,则用作静态锁名称的值。如果未设置,则默认为“静态”。
  • aether.syncContext.named.discriminating.discriminator,当使用区分名称映射器时,设置唯一标识主机和本地存储库对的鉴别器。如果未设置,则通过应用sha1(hostname + ":" + localRepoPath) + GAV 名称映射器计算鉴别器。
  • aether.syncContext.named.discriminating.hostname,用于计算鉴别器值的主机名,如果未设置上述值。如果未设置,则使用 Java API 检测主机名。