LeasedWorkflowOutboxEntry.java

package org.hammer.audio.workflow.collaboration.store;

import java.time.Instant;
import java.util.Objects;

/**
 * One pending durable outbox event exclusively leased by a dispatcher instance.
 *
 * @param entry durable event awaiting publication
 * @param leaseOwner stable dispatcher-instance identifier
 * @param leaseToken opaque token required for acknowledgement
 * @param leaseExpiresAt time after which another dispatcher may reclaim the event
 */
public record LeasedWorkflowOutboxEntry(
    StoredWorkflowOutboxEntry entry, String leaseOwner, String leaseToken, Instant leaseExpiresAt) {

  public LeasedWorkflowOutboxEntry {
    Objects.requireNonNull(entry, "entry");
    if (!entry.pending()) {
      throw new IllegalArgumentException("Only pending outbox entries may be leased");
    }
    leaseOwner = requireNotBlank(leaseOwner, "leaseOwner");
    leaseToken = requireNotBlank(leaseToken, "leaseToken");
    Objects.requireNonNull(leaseExpiresAt, "leaseExpiresAt");
  }

  private static String requireNotBlank(String value, String name) {
    Objects.requireNonNull(value, name);
    if (value.isBlank()) {
      throw new IllegalArgumentException(name + " must not be blank");
    }
    return value;
  }
}