60 lines
3.0 KiB
Plaintext
60 lines
3.0 KiB
Plaintext
= Moduliths Moments
|
|
|
|
Moments is an implementation of the https://verraes.net/2019/05/patterns-for-decoupling-distsys-passage-of-time-event/[Passage of Time Event] idea, originally presented by https://github.com/mathiasverraes[Mathias Verraes].
|
|
It enables Spring Boot applications to consume the following events to attach business logic to them:
|
|
|
|
* `DayHasPassed` - signals the end of a day
|
|
* `WeekHasPassed` - signals the end of a week
|
|
* `MonthHasPassed` - signals the end of a month
|
|
* `QuarterHasPassed` - signals the end of a quarter
|
|
* `YearHasPassed` - signals the end of a year
|
|
|
|
This allows event listeners to be registered that react on the publication of such events.
|
|
They allow to decouple from the actual triggering mechanism (e.g. Spring's built-in scheduling) and can thus be tested more easily.
|
|
|
|
== How to use Moments?
|
|
|
|
Moments will auto-activate in a Spring Boot application if you put it on the classpath of your application.
|
|
|
|
[source, xml]
|
|
----
|
|
<dependency>
|
|
<groupId>org.springframework.experimental</groupId>
|
|
<artifactId>spring-modulith-moments</artifactId>
|
|
<version>…</version>
|
|
</dependency>
|
|
----
|
|
|
|
== What does Moments enable?
|
|
|
|
The Moments module enables scheduling for the application it is applied to.
|
|
It registers a bean of type `Moments` that takes care of publishing the above mentioned events.
|
|
By setting `moduliths.moments.enable-time-machine` you can also rather expose a bean of type `TimeMachine` (which extends `Moments`), which exposes a `….shift(Duration)` method which allows to move what constitutes "now" by the given `Duration`.
|
|
Moving time forward will cause all events published that would occur during the delta.
|
|
|
|
=== How to disable Moments?
|
|
|
|
If you don't control the classpath of the application you run, you can still disable Moments by setting the `moduliths.moments.enabled` property to `false`.
|
|
|
|
== Customization options
|
|
|
|
Moments works with Java's standard `Clock` abstraction to determine the current time.
|
|
By default, `Clock.standardUTC()` is used.
|
|
To use a different clock, just register a Spring Bean of type `Clock`.
|
|
Moments will pick it up automatically.
|
|
|
|
=== Moments configuration properties
|
|
|
|
Moments exposes configuration properties to tweak its behavior under the `moduliths.moments` namespace.
|
|
|
|
[%header, cols="1,1,2"]
|
|
|===
|
|
|Property|Default value|Description
|
|
|`enabled`|`true`|Whether to enable Moments in the first place.
|
|
|`enable-time-machine`|`false`|Set to true to expose `TimeMachine` instead of `Moments` to publicly expose methods to shift time.
|
|
|`granularity`|`hours`|At which granularity to publish events. Switch to `days` if you want to disable the distribution of `HourHasPassed` events.
|
|
|`locale`|`Locale.default()`|The `Locale` to determine the start date of the week for `WeekHasPassed` events.
|
|
|`quarter-start-month`|January|The month in which the first quarter starts. Customize via the month's name you like to start the quarters at (e.g. `February`).
|
|
|`zone-id`|`UTC`|The time zone to determine the dates and times attached to the events published. Use standardized region time zone descriptors (e.g. `Europe/Berlin`) to customize
|
|
|===
|