2009-05-25 14:48:43 +02:00
|
|
|
/**
|
|
|
|
|
* Copyright (C) 2009 Scalable Solutions.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package se.scalablesolutions.akka.kernel.reactor
|
|
|
|
|
|
2009-07-28 10:45:41 +02:00
|
|
|
import java.util.List
|
2009-06-29 15:01:20 +02:00
|
|
|
import kernel.stm.Transaction
|
2009-07-06 23:45:15 +02:00
|
|
|
import kernel.util.HashCode
|
|
|
|
|
|
|
|
|
|
trait MessageQueue {
|
|
|
|
|
def append(handle: MessageInvocation)
|
|
|
|
|
def prepend(handle: MessageInvocation)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trait MessageInvoker {
|
|
|
|
|
def invoke(message: MessageInvocation)
|
2009-06-05 22:08:53 +02:00
|
|
|
}
|
|
|
|
|
|
2009-05-25 14:48:43 +02:00
|
|
|
trait MessageDispatcher {
|
2009-06-10 20:04:33 +02:00
|
|
|
def messageQueue: MessageQueue
|
2009-07-06 23:45:15 +02:00
|
|
|
def registerHandler(key: AnyRef, handler: MessageInvoker)
|
2009-05-25 14:48:43 +02:00
|
|
|
def unregisterHandler(key: AnyRef)
|
2009-06-05 22:08:53 +02:00
|
|
|
def start
|
2009-05-25 14:48:43 +02:00
|
|
|
def shutdown
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
trait MessageDemultiplexer {
|
|
|
|
|
def select
|
2009-07-28 10:45:41 +02:00
|
|
|
def acquireSelectedInvocations: List[MessageInvocation]
|
|
|
|
|
def releaseSelectedInvocations
|
2009-05-25 14:48:43 +02:00
|
|
|
def wakeUp
|
|
|
|
|
}
|
|
|
|
|
|
2009-07-06 23:45:15 +02:00
|
|
|
class MessageInvocation(val sender: AnyRef,
|
|
|
|
|
val message: AnyRef,
|
|
|
|
|
val future: Option[CompletableFutureResult],
|
|
|
|
|
val tx: Option[Transaction]) {
|
2009-05-25 14:48:43 +02:00
|
|
|
|
2009-05-25 15:18:18 +02:00
|
|
|
override def hashCode(): Int = {
|
|
|
|
|
var result = HashCode.SEED
|
2009-06-05 22:08:53 +02:00
|
|
|
result = HashCode.hash(result, sender)
|
2009-05-25 15:18:18 +02:00
|
|
|
result = HashCode.hash(result, message)
|
2009-06-30 16:01:50 +02:00
|
|
|
result = if (future.isDefined) HashCode.hash(result, future.get) else result
|
2009-06-29 15:01:20 +02:00
|
|
|
result = if (tx.isDefined) HashCode.hash(result, tx.get.id) else result
|
2009-05-25 15:18:18 +02:00
|
|
|
result
|
2009-05-25 14:48:43 +02:00
|
|
|
}
|
2009-05-25 15:18:18 +02:00
|
|
|
|
|
|
|
|
override def equals(that: Any): Boolean =
|
|
|
|
|
that != null &&
|
2009-07-06 23:45:15 +02:00
|
|
|
that.isInstanceOf[MessageInvocation] &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].sender == sender &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].message == message &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].future.isDefined == future.isDefined &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].future.get == future.get &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].tx.isDefined == tx.isDefined &&
|
|
|
|
|
that.asInstanceOf[MessageInvocation].tx.get.id == tx.get.id
|
|
|
|
|
|
|
|
|
|
override def toString(): String = "MessageInvocation[message = " + message + ", sender = " + sender + ", future = " + future + ", tx = " + tx + "]"
|
2009-05-25 14:48:43 +02:00
|
|
|
}
|