2013-09-14 14:19:18 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009-2013 Typesafe Inc. <http://www.typesafe.com>
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package akka.persistence
|
|
|
|
|
|
2013-10-08 11:46:02 +02:00
|
|
|
import java.util.{ List ⇒ JList }
|
|
|
|
|
|
2013-09-14 14:19:18 +02:00
|
|
|
import akka.actor.ActorRef
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Persistent message.
|
|
|
|
|
*/
|
|
|
|
|
sealed abstract class Persistent {
|
|
|
|
|
/**
|
|
|
|
|
* This persistent message's payload.
|
|
|
|
|
*/
|
|
|
|
|
//#payload
|
|
|
|
|
def payload: Any
|
|
|
|
|
//#payload
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* This persistent message's sequence number.
|
|
|
|
|
*/
|
|
|
|
|
//#sequence-nr
|
|
|
|
|
def sequenceNr: Long
|
|
|
|
|
//#sequence-nr
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a new persistent message with the specified `payload`.
|
|
|
|
|
*/
|
|
|
|
|
def withPayload(payload: Any): Persistent
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Called by [[Channel]] destinations to confirm the receipt of a persistent message.
|
|
|
|
|
*/
|
|
|
|
|
def confirm(): Unit
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
object Persistent {
|
|
|
|
|
/**
|
|
|
|
|
* Java API.
|
|
|
|
|
*
|
|
|
|
|
* Creates a new persistent message. Must only be used outside processors.
|
|
|
|
|
*
|
|
|
|
|
* @param payload payload of new persistent message.
|
|
|
|
|
*/
|
|
|
|
|
def create(payload: Any): Persistent =
|
|
|
|
|
create(payload, null)
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Java API.
|
|
|
|
|
*
|
|
|
|
|
* Creates a new persistent message, derived from the specified current message. The current
|
|
|
|
|
* message can be obtained inside a [[Processor]] by calling `getCurrentPersistentMessage()`.
|
|
|
|
|
*
|
|
|
|
|
* @param payload payload of new persistent message.
|
|
|
|
|
* @param currentPersistentMessage current persistent message.
|
|
|
|
|
*/
|
|
|
|
|
def create(payload: Any, currentPersistentMessage: Persistent): Persistent =
|
|
|
|
|
apply(payload)(Option(currentPersistentMessage))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Creates a new persistent message, derived from an implicit current message.
|
2013-09-26 09:14:43 +02:00
|
|
|
* When used inside a [[Processor]], this is the optional current [[Persistent]]
|
|
|
|
|
* message of that processor.
|
2013-09-14 14:19:18 +02:00
|
|
|
*
|
|
|
|
|
* @param payload payload of the new persistent message.
|
|
|
|
|
* @param currentPersistentMessage optional current persistent message, defaults to `None`.
|
|
|
|
|
*/
|
|
|
|
|
def apply(payload: Any)(implicit currentPersistentMessage: Option[Persistent] = None): Persistent =
|
|
|
|
|
currentPersistentMessage.map(_.withPayload(payload)).getOrElse(PersistentImpl(payload))
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Persistent message extractor.
|
|
|
|
|
*/
|
|
|
|
|
def unapply(persistent: Persistent): Option[(Any, Long)] =
|
|
|
|
|
Some((persistent.payload, persistent.sequenceNr))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2013-10-08 11:46:02 +02:00
|
|
|
* Plugin API.
|
|
|
|
|
*
|
|
|
|
|
* Internal [[Persistent]] message representation.
|
|
|
|
|
*
|
|
|
|
|
* @param processorId Id of processor that journaled the message.
|
|
|
|
|
* @param channelId Id of last channel that delivered the message to a destination.
|
|
|
|
|
* @param sender Serialized sender reference.
|
|
|
|
|
* @param deleted `true` if this message is marked as deleted.
|
2013-10-09 13:11:53 +02:00
|
|
|
* @param resolved `true` by default, `false` for replayed messages. Set to `true` by a channel if this
|
|
|
|
|
* message is replayed and its sender reference was resolved. Channels use this field to
|
|
|
|
|
* avoid redundant sender reference resolutions.
|
2013-10-08 11:46:02 +02:00
|
|
|
* @param confirms Channel ids of delivery confirmations that are available for this message. Only non-empty
|
|
|
|
|
* for replayed messages.
|
|
|
|
|
* @param confirmTarget Delivery confirmation target.
|
|
|
|
|
* @param confirmMessage Delivery confirmation message.
|
2013-09-14 14:19:18 +02:00
|
|
|
*
|
2013-10-08 11:46:02 +02:00
|
|
|
* @see [[Processor]]
|
|
|
|
|
* @see [[Channel]]
|
|
|
|
|
* @see [[Deliver]]
|
2013-09-14 14:19:18 +02:00
|
|
|
*/
|
2013-10-08 11:46:02 +02:00
|
|
|
case class PersistentImpl(
|
2013-09-14 14:19:18 +02:00
|
|
|
payload: Any,
|
|
|
|
|
sequenceNr: Long = 0L,
|
2013-10-09 13:11:53 +02:00
|
|
|
processorId: String = PersistentImpl.Undefined,
|
|
|
|
|
channelId: String = PersistentImpl.Undefined,
|
2013-10-08 11:46:02 +02:00
|
|
|
deleted: Boolean = false,
|
2013-10-09 13:11:53 +02:00
|
|
|
resolved: Boolean = true,
|
2013-09-14 14:19:18 +02:00
|
|
|
confirms: Seq[String] = Nil,
|
2013-10-09 13:11:53 +02:00
|
|
|
confirmMessage: Confirm = null,
|
2013-09-14 14:19:18 +02:00
|
|
|
confirmTarget: ActorRef = null,
|
2013-10-09 13:11:53 +02:00
|
|
|
sender: ActorRef = null) extends Persistent {
|
2013-09-14 14:19:18 +02:00
|
|
|
|
2013-10-08 11:46:02 +02:00
|
|
|
def withPayload(payload: Any): Persistent =
|
|
|
|
|
copy(payload = payload)
|
|
|
|
|
|
|
|
|
|
def confirm(): Unit =
|
|
|
|
|
if (confirmTarget != null) confirmTarget ! confirmMessage
|
|
|
|
|
|
|
|
|
|
import scala.collection.JavaConverters._
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Java Plugin API.
|
|
|
|
|
*/
|
|
|
|
|
def getConfirms: JList[String] = confirms.asJava
|
2013-09-14 14:19:18 +02:00
|
|
|
}
|
|
|
|
|
|
2013-10-08 11:46:02 +02:00
|
|
|
object PersistentImpl {
|
2013-10-09 13:11:53 +02:00
|
|
|
val Undefined = ""
|
2013-10-08 11:46:02 +02:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Java Plugin API.
|
|
|
|
|
*/
|
2013-10-09 13:11:53 +02:00
|
|
|
def create(payload: Any, sequenceNr: Long, processorId: String, channelId: String, deleted: Boolean, resolved: Boolean, confirms: Seq[String], confirmMessage: Confirm, confirmTarget: ActorRef, sender: ActorRef): PersistentImpl =
|
|
|
|
|
PersistentImpl(payload, sequenceNr, processorId, channelId, deleted, resolved, confirms, confirmMessage, confirmTarget, sender)
|
2013-10-08 11:46:02 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2013-10-15 09:01:07 +02:00
|
|
|
* Sent to a [[Processor]] when a journal failed to write a [[Persistent]] message. If
|
|
|
|
|
* not handled, an `akka.actor.ActorKilledException` is thrown by that processor.
|
2013-10-08 11:46:02 +02:00
|
|
|
*
|
|
|
|
|
* @param payload payload of the persistent message.
|
|
|
|
|
* @param sequenceNr sequence number of the persistent message.
|
|
|
|
|
* @param cause failure cause.
|
|
|
|
|
*/
|
|
|
|
|
case class PersistenceFailure(payload: Any, sequenceNr: Long, cause: Throwable)
|
|
|
|
|
|
2013-09-14 14:19:18 +02:00
|
|
|
/**
|
2013-10-09 13:11:53 +02:00
|
|
|
* Internal API.
|
|
|
|
|
*
|
2013-09-14 14:19:18 +02:00
|
|
|
* Message to confirm the receipt of a persistent message (sent via a [[Channel]]).
|
|
|
|
|
*/
|
|
|
|
|
@SerialVersionUID(1L)
|
|
|
|
|
private[persistence] case class Confirm(processorId: String, sequenceNr: Long, channelId: String)
|