CGX106
CGX106

Reputation: 75

Is there a hook for reacting to a catching up Axon projection?

I want to implement a Axon projection providing a subscription query. The projection persists entities of a specific based on the events (CRUD). The following should happen if a replay of the projection is executed:

  1. Inform about a empty collection via the subscription query.
  2. Process the events until the projection catches up with the event store.
  3. Inform about the current state of the entities via the subscription query.

My intention is that the subscription query should not inform about many events in a very short time and I want to prevent informing about many intermediate positions (e.g. create and delete a specific entity, it should not be used in the subscription query, because it is not available after catching up).

Currently I cannot implement the third step, because I miss a hook for reacting to the moment when the Axon projection is catching up again.

I use Axon v4.5 and Spring Boot v2.4.5.

Upvotes: 1

Views: 138

Answers (1)

Steven
Steven

Reputation: 7275

At the moment, the Reference Guide is sadly not extremely specific on how to achieve this. I can assure you though that work is underway to improve the entire Event Processor section, including a clearer explanation of the Replay process and the hooks you have.

However, the possible hooks are stated as it is (you can find them here). What you can do to know whether your event handlers are replaying yes/no, is to utilize the ReplayStatus enumeration. This enum can be used as an additional parameter to your @EventHandler annotated method, holding just two states:

  1. REPLAY
  2. REGULAR

This enumeration allows for conditional logic within an event handler on what to do during replays. If an event handler for example not only updates a projection but also sends an email, you'd want to make sure the email isn't sent again when replaying.

To further clarify how to use this, consider the following snippet:

@EventHandler
public void on(SomeEvent event, ReplayStatus replayStatus) {
    if (replayStatus == REGULAR) {
        // perform tasks that only may happen when the processor is not replaying
    }
    // perform tasks that can happen during regular processing and replaying
}

It's within the if-block where you could invoke the QueryUpdateEmitter, to only emit updates when the event handler is performing the regular event handling process.

Upvotes: 2

Related Questions