Occcurrent:JVM事件溯源工具库包


Occcurrent 是一个事件溯源库,它是一组用于 JVM 的事件溯源实用程序,由Johan Haleby创建。
能够在不依赖Occurrent或任何其他库的情况下设计你的领域模型。你的领域模型可以用返回事件的纯函数来表达。使用Occurrent来存储这些事件。
使用Occurrent组件作为乐高积木来组成你自己的管道。组件被设计得很小,所以如果需要,你可以根据自己的需要重新编写。在Occurrent之上编写你自己的特定问题/领域层。
领域事件在数据库中是作为云事件存储的,你可以利用数据库的优势。例如,你可以创建自定义索引,用于直接在一个事件流(甚至多个流)上进行快速和完全一致的领域查询。
云事件是一个CNCF规范,用于以通用方式描述事件数据。云事件旨在极大地简化跨服务、跨平台和跨领域的事件声明和交付。
支持(如Spring @Transactional)以事务性方式编写预测和事件。

代码案例:

public class ApplicationService {

    private final EventStore eventStore;
    private final Converter converter;

    public ApplicationService(EventStore eventStore, Converter converter) {
        this.eventStore = eventStore;
        this.converter = converter;
    }

    public void execute(String streamId, Function<Stream<DomainEvent>, Stream<DomainEvent>> functionThatCallsDomainModel) {
        // Read all events from the event store for a particular stream
        EventStream<CloudEvent> eventStream = eventStore.read(streamId.toString());
        // Convert the cloud events into domain events
        Stream<DomainEvent> persistedDomainEvents = eventStream.events().map(converter::toDomainEvent);

        // Call a pure function from the domain model which returns a Stream of domain events  
        Stream<DomainEvent> newDomainEvents = functionThatCallsDomainModel.apply(persistedDomainEvents);

        // Convert domain events to cloud events and write them to the event store  
        eventStore.write(streamId, eventStream.version(), newDomainEvents.map(converter::toCloudEvent));
    }
}

Occcurrent 没有任何用于创建视图/投影的特殊组件。相反,您只需创建一个订阅,您可以在其中创建和存储您认为合适的视图。