NotificationGracePeriodService.inGracePeriod() method does not update cache if lastEventTime.isPresent() is true, but the period is over.
I would suggest the following change:
public boolean inGracePeriod(EventDefinition definition, String notificationId, Event event) {
if (definition.notificationSettings().gracePeriodMs() <= 0) {
return false;
}
final Optional<DateTime> lastEventTime = get(definition.id(), notificationId, event.toDto().key());
final boolean isInGracePeriod = lastEventTime.isPresent() ?
lastEventTime.get().isAfter(event.getEventTimestamp().minus(definition.notificationSettings().gracePeriodMs())) :
false;
put(definition.id(), notificationId, event.toDto().key(), event.getEventTimestamp());
return isInGracePeriod;
}