refactored and renamed AMQP code, refactored STM, fixed persistence bugs, renamed reactor package to dispatch, added programmatic API for RemoteServer

This commit is contained in:
jboner 2009-10-08 19:01:04 +02:00
parent 059502b463
commit c073c2bb2f
37 changed files with 572 additions and 338 deletions

View file

@ -7,11 +7,11 @@ package se.scalablesolutions.akka.actor
import java.lang.reflect.{InvocationTargetException, Method}
import java.net.InetSocketAddress
import reactor.{MessageDispatcher, FutureResult}
import nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory}
import config.ScalaConfig._
import util._
import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.util._
import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint}
import org.codehaus.aspectwerkz.proxy.Proxy

View file

@ -8,7 +8,7 @@ import java.net.InetSocketAddress
import java.util.HashSet
import se.scalablesolutions.akka.Config._
import se.scalablesolutions.akka.reactor._
import se.scalablesolutions.akka.dispatch._
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.stm.TransactionManagement._
import se.scalablesolutions.akka.stm.TransactionManagement
@ -514,10 +514,10 @@ trait Actor extends Logging with TransactionManagement {
try {
tryToCommitTransactions
if (currentTransaction.get.isDefined && !currentTransaction.get.get.isActive) {
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
setThreadLocalTransaction(null)
}
//if (currentTransaction.get.isDefined && !currentTransaction.get.get.isActive) {
// currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
// setThreadLocalTransaction(null)
//}
if (isInExistingTransaction) joinExistingTransaction
else if (isTransactional) startNewTransaction(messageHandle)
@ -535,16 +535,15 @@ trait Actor extends Logging with TransactionManagement {
val tx = currentTransaction.get
rollback(tx)
if (!(tx.isDefined && tx.get.isTopLevel)) {
if (tx.isDefined && tx.get.isTopLevel) {
val done = tx.get.retry
if (done) {
if (future.isDefined) future.get.completeWithException(this, e)
else e.printStackTrace
}
}
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
setThreadLocalTransaction(null)
clearTransaction
case e =>
e.printStackTrace
decrementTransaction
@ -555,8 +554,7 @@ trait Actor extends Logging with TransactionManagement {
if (future.isDefined) future.get.completeWithException(this, e)
else e.printStackTrace
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
setThreadLocalTransaction(null)
clearTransaction // need to clear currentTransaction before call to supervisor
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
if (supervisor.isDefined) supervisor.get ! Exit(this, e)
@ -564,8 +562,7 @@ trait Actor extends Logging with TransactionManagement {
} finally {
if (currentTransaction.get.isDefined && currentTransaction.get.get.isAborted) removeTransactionIfTopLevel(currentTransaction.get.get)
else tryToPrecommitTransactions
currentTransaction.set(None)
setThreadLocalTransaction(null)
clearTransaction
}
}

View file

@ -7,8 +7,8 @@ package se.scalablesolutions.akka.config
import com.google.inject._
import ScalaConfig._
import akka.actor.{Supervisor, ActiveObjectFactory, Dispatcher}
import akka.util.Logging
import se.scalablesolutions.akka.actor.{Supervisor, ActiveObjectFactory, Dispatcher}
import se.scalablesolutions.akka.util.Logging
//import org.apache.camel.impl.{DefaultCamelContext}
//import org.apache.camel.{CamelContext, Endpoint, Routes}

View file

@ -7,7 +7,7 @@ package se.scalablesolutions.akka.config
import reflect.BeanProperty
import actor.Actor
import reactor.MessageDispatcher
import dispatch.MessageDispatcher
/**
* Configuration classes - not to be used as messages.

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import actor.Actor

View file

@ -8,7 +8,7 @@
*
* Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/].
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.{LinkedList, List}

View file

@ -2,19 +2,21 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent._
import locks.ReentrantLock
import atomic.{AtomicLong, AtomicInteger}
import ThreadPoolExecutor.CallerRunsPolicy
import java.util.{Collection, HashSet, HashMap, LinkedList, List}
/**
* Implements the Reactor pattern as defined in: [http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf].<br/>
* See also this article: [http://today.java.net/cs/user/print/a/350].
* <p/>
* Default thread pool settings are:
*
* Default settings are:
* <pre/>
* - withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity
* - NR_START_THREADS = 16
@ -22,14 +24,16 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
* - KEEP_ALIVE_TIME = 60000L // one minute
* </pre>
* <p/>
*
* The dispatcher has a fluent builder interface to build up a thread pool to suite your use-case.
* There is a default thread pool defined but make use of the builder if you need it. Here are some examples.
* <p/>
*
* Scala API.
* <p/>
* Example usage:
* <pre/>
* val dispatcher = EventBasedThreadPoolDispatcher
* val dispatcher = new EventBasedThreadPoolDispatcher
* dispatcher
* .withNewThreadPoolWithBoundedBlockingQueue(100)
* .setCorePoolSize(16)
@ -53,7 +57,11 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
* .setRejectionPolicy(new CallerRunsPolicy())
* .buildThreadPool();
* </pre>
* <p/>
*
* But the preferred way of creating dispatchers is to use
* the {@link se.scalablesolutions.akka.dispatch.Dispatchers} factory object.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: Boolean) extends MessageDispatcherBase(name) {
@ -340,6 +348,7 @@ object MonitorableThread {
@volatile val debugLifecycle = false
}
// FIXME fix the issues with using the monitoring in MonitorableThread
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/

View file

@ -5,7 +5,7 @@
/**
* Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/].
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent.locks.{Lock, Condition, ReentrantLock}
import java.util.concurrent.TimeUnit

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.{LinkedList, Queue, List}
import java.util.concurrent.{TimeUnit, BlockingQueue}

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.List

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions.
*/
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent.LinkedBlockingQueue
import java.util.Queue
@ -11,9 +11,12 @@ import actor.{Actor, ActorMessageInvoker}
/**
* Dedicates a unique thread for each actor passed in as reference. Served through its messageQueue.
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler: MessageInvoker) extends MessageDispatcher {
class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler: MessageInvoker)
extends MessageDispatcher {
def this(actor: Actor) = this(actor.getClass.getName, new ActorMessageInvoker(actor))
private val queue = new BlockingMessageQueue(name)
@ -46,7 +49,7 @@ class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler:
}
class BlockingMessageQueue(name: String) extends MessageQueue {
// FIXME: configure the LBQ
// FIXME: configure the LinkedBlockingQueue in BlockingMessageQueue, use a Builder like in the EventBasedThreadPoolDispatcher
private val queue = new LinkedBlockingQueue[MessageInvocation]
def append(handle: MessageInvocation) = queue.put(handle)
def prepend(handle: MessageInvocation) = queue.add(handle) // FIXME is add prepend???

View file

@ -9,7 +9,7 @@ import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap}
import protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import actor.{Exit, Actor}
import reactor.{DefaultCompletableFutureResult, CompletableFutureResult}
import dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
import serialization.{Serializer, Serializable, SerializationProtocol}
import util.Logging

View file

@ -47,10 +47,14 @@ object RemoteServer extends Logging {
private val bootstrap = new ServerBootstrap(factory)
def start(loader: Option[ClassLoader]) = synchronized {
def start: Unit = start(None)
def start(loader: Option[ClassLoader]): Unit = start(HOSTNAME, PORT)
def start(hostname: String, port: Int): Unit = start(hostname, port, None)
def start(hostname: String, port: Int, loader: Option[ClassLoader]): Unit = synchronized {
if (!isRunning) {
log.info("Starting remote server at [%s:%s]", HOSTNAME, PORT)
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, loader))
// FIXME make these RemoteServer options configurable
bootstrap.setOption("child.tcpNoDelay", true)
bootstrap.setOption("child.keepAlive", true)
bootstrap.setOption("child.reuseAddress", true)

View file

@ -7,7 +7,7 @@ package se.scalablesolutions.akka.stm
import java.util.concurrent.atomic.AtomicLong
import java.util.concurrent.atomic.AtomicInteger
import se.scalablesolutions.akka.reactor.MessageInvocation
import se.scalablesolutions.akka.dispatch.MessageInvocation
import se.scalablesolutions.akka.util.Logging
import se.scalablesolutions.akka.state.Committable
@ -71,6 +71,7 @@ object Transaction {
}.execute()
}
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
@ -114,9 +115,8 @@ object Transaction {
}
def commit(participant: String): Boolean = synchronized {
log.debug("TX COMMIT - Trying to commit transaction [%s] for server with UUID [%s]", toString, participant)
setThreadLocalTransaction(transaction)
if (status == TransactionStatus.Active) {
log.debug("TX COMMIT - Trying to commit transaction [%s] for server with UUID [%s]", toString, participant)
val haveAllPreCommitted =
if (participants.size == precommitted.size) {{
for (part <- participants) yield {
@ -125,6 +125,7 @@ object Transaction {
}}.exists(_ == true)
} else false
if (haveAllPreCommitted && transaction != null) {
setThreadLocalTransaction(transaction)
log.debug("TX COMMIT - Committing transaction [%s] for server with UUID [%s]", toString, participant)
transaction.commit
reset
@ -132,6 +133,7 @@ object Transaction {
Transaction.Atomic {
persistentStateMap.values.foreach(_.commit)
}
setThreadLocalTransaction(null)
true
} else false
} else {
@ -146,14 +148,7 @@ object Transaction {
transaction.abort
reset
}
def rollbackForRescheduling(participant: String) = synchronized {
ensureIsActiveOrAborted
log.debug("TX ROLLBACK for recheduling - Actor with UUID [%s] has initiated transaction rollback for [%s]", participant, toString)
transaction.abort
reset
}
def join(participant: String) = synchronized {
ensureIsActive
log.debug("TX JOIN - Actor with UUID [%s] is joining transaction [%s]" , participant, toString)
@ -176,6 +171,7 @@ object Transaction {
precommitted = Nil
}
def status_? = status
def isNew = synchronized { status == TransactionStatus.New }
def isActive = synchronized { status == TransactionStatus.Active }
def isCompleted = synchronized { status == TransactionStatus.Completed }

View file

@ -6,7 +6,7 @@ package se.scalablesolutions.akka.stm
import java.util.concurrent.atomic.AtomicBoolean
import se.scalablesolutions.akka.reactor.MessageInvocation
import se.scalablesolutions.akka.dispatch.MessageInvocation
import se.scalablesolutions.akka.util.Logging
import org.codehaus.aspectwerkz.proxy.Uuid
@ -25,7 +25,7 @@ class TransactionAwareWrapperException(val cause: Throwable, val tx: Option[Tran
object TransactionManagement {
import se.scalablesolutions.akka.Config._
val TIME_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-for-completion", 100)
val TIME_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-for-completion", 1000)
val NR_OF_TIMES_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-nr-of-times", 3)
val MAX_NR_OF_RETRIES = config.getInt("akka.stm.max-nr-of-retries", 10)
val TRANSACTION_ENABLED = new AtomicBoolean(config.getBool("akka.stm.service", false))
@ -72,6 +72,11 @@ trait TransactionManagement extends Logging {
println("------------ COULD NOT COMMIT -- WAITING OR TIMEOUT? ---------")
//tx.retry
} else {
println("---------- tryToCommitTransactions ")
println("---------- tryToCommitTransactions tx.isTopLevel " + tx.isTopLevel)
println("---------- tryToCommitTransactions tx.depth.get " + tx.depth.get)
println("---------- tryToCommitTransactions tx.status_? " + tx.status_?)
rollback(Some(tx))
// continue, try to commit on next received message
// FIXME check if TX hase timed out => throw exception
}
@ -82,12 +87,17 @@ trait TransactionManagement extends Logging {
case None => {} // no tx; nothing to do
case Some(tx) =>
tx.rollback(uuid)
activeTransactions -= tx
}
protected def rollbackForRescheduling(tx: Option[Transaction]) = tx match {
case None => {} // no tx; nothing to do
case Some(tx) =>
tx.rollbackForRescheduling(uuid)
protected def setTransaction(transaction: Option[Transaction]) = if (transaction.isDefined) {
currentTransaction.set(transaction)
setThreadLocalTransaction(transaction.get.transaction)
}
protected def clearTransaction = {
currentTransaction.set(None)
setThreadLocalTransaction(null)
}
protected def isInExistingTransaction = currentTransaction.get.isDefined

View file

@ -73,11 +73,18 @@ object TransactionalRef {
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class TransactionalRef[T] extends Transactional {
private[this] val ref = new Ref[T]
import org.multiverse.utils.TransactionThreadLocal._
def swap(elem: T) = ref.set(elem)
println("---- create TX " + getThreadLocalTransaction)
private[this] val ref: Ref[T] = new Ref[T]//Ref.createCommittedRef[T]
def swap(elem: T) = {
println("---- swap TX " + getThreadLocalTransaction)
ref.set(elem)
}
def get: Option[T] = {
println("---- get TX " + getThreadLocalTransaction)
if (ref.isNull) None
else Some(ref.get)
}
@ -89,8 +96,11 @@ class TransactionalRef[T] extends Transactional {
else ref.get
}
def isDefined: Boolean = !ref.isNull
def isDefined: Boolean = {
println("---- isDefined TX " + getThreadLocalTransaction)
!ref.isNull
}
def isEmpty: Boolean = ref.isNull
def map[B](f: T => B): Option[B] = if (isEmpty) None else Some(f(ref.get))

View file

@ -5,7 +5,7 @@ import junit.framework.TestCase
import junit.framework.TestSuite
import actor.{ActorSpec, RemoteActorSpec, InMemoryActorSpec, SupervisorSpec, RemoteSupervisorSpec,SchedulerSpec}
import reactor.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest}
import dispatch.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest}
object AllTest extends TestCase {
def suite(): Test = {

View file

@ -1,4 +1,4 @@
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

View file

@ -1,4 +1,4 @@
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
import java.util.concurrent.atomic.AtomicBoolean

View file

@ -26,7 +26,7 @@ case class FailureOneWay(key: String, value: String, failer: Actor)
class InMemStatefulActor extends Actor {
timeout = 100000
makeTransactionRequired
//dispatcher = se.scalablesolutions.akka.reactor.Dispatchers.newThreadBasedDispatcher(this)
//dispatcher = se.scalablesolutions.akka.dispatch.Dispatchers.newThreadBasedDispatcher(this)
private lazy val mapState: TransactionalMap[String, String] = TransactionalState.newMap[String, String]
private lazy val vectorState: TransactionalVector[String] = TransactionalState.newVector[String]
private lazy val refState: TransactionalRef[String] = TransactionalState.newRef[String]

View file

@ -1,4 +1,4 @@
package se.scalablesolutions.akka.reactor
package se.scalablesolutions.akka.dispatch
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

View file

@ -7,10 +7,10 @@ package se.scalablesolutions.akka.amqp
import com.rabbitmq.client.{AMQP => RabbitMQ, _}
import com.rabbitmq.client.ConnectionFactory
import actor.{OneForOneStrategy, Actor}
import config.ScalaConfig._
import util.{HashCode, Logging}
import serialization.Serializer
import se.scalablesolutions.akka.actor.{OneForOneStrategy, Actor}
import se.scalablesolutions.akka.config.ScalaConfig._
import se.scalablesolutions.akka.util.{HashCode, Logging}
import se.scalablesolutions.akka.serialization.Serializer
import scala.collection.mutable.HashMap
@ -21,19 +21,19 @@ import java.util.{Timer, TimerTask}
import java.io.IOException
/**
* AMQP Actor API. Implements Client and Endpoint materialized as Actors.
* AMQP Actor API. Implements Producer and Consumer materialized as Actors.
*
* <pre>
* val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, Serializer.Java, None, 100)
* val endpoint = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, Serializer.Java, None, 100)
*
* endpoint ! MessageConsumer(QUEUE, ROUTING_KEY, new Actor() {
* endpoint ! MessageConsumerListener(QUEUE, ROUTING_KEY, new Actor() {
* def receive: PartialFunction[Any, Unit] = {
* case Message(payload, _, _, _, _) => log.debug("Received message: %s", payload)
* }
* })
*
* val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100)
* client ! Message("Hi", ROUTING_KEY)
* val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100)
* producer ! Message("Hi", ROUTING_KEY)
* </pre>
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
@ -57,10 +57,10 @@ object AMQP extends Actor {
new Message(payload, routingKey, false, false, null)
}
case class MessageConsumer(queueName: String, routingKey: String, actor: Actor) {
case class MessageConsumerListener(queueName: String, routingKey: String, actor: Actor) {
var tag: Option[String] = None
override def toString(): String = "MessageConsumer[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey + "]"
override def toString(): String = "MessageConsumerListener[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey + "]"
override def hashCode(): Int = synchronized {
var result = HashCode.SEED
@ -71,13 +71,13 @@ object AMQP extends Actor {
override def equals(that: Any): Boolean = synchronized {
that != null &&
that.isInstanceOf[MessageConsumer] &&
that.asInstanceOf[MessageConsumer].queueName== queueName &&
that.asInstanceOf[MessageConsumer].routingKey == routingKey
that.isInstanceOf[MessageConsumerListener] &&
that.asInstanceOf[MessageConsumerListener].queueName== queueName &&
that.asInstanceOf[MessageConsumerListener].routingKey == routingKey
}
}
case class CancelMessageConsumer(consumer: MessageConsumer)
case class CancelMessageConsumerListener(consumer: MessageConsumerListener)
case class Reconnect(delay: Long)
case class Failure(cause: Throwable)
case object Stop
@ -108,7 +108,7 @@ object AMQP extends Actor {
}
}
def newClient(
def newProducer(
config: ConnectionParameters,
hostname: String,
port: Int,
@ -116,8 +116,8 @@ object AMQP extends Actor {
serializer: Serializer,
returnListener: Option[ReturnListener],
shutdownListener: Option[ShutdownListener],
initReconnectDelay: Long): Client = {
val client = new Client(
initReconnectDelay: Long): Producer = {
val producer = new Producer(
new ConnectionFactory(config),
hostname, port,
exchangeName,
@ -125,11 +125,11 @@ object AMQP extends Actor {
returnListener,
shutdownListener,
initReconnectDelay)
startLink(client)
client
startLink(producer)
producer
}
def newEndpoint(
def newConsumer(
config: ConnectionParameters,
hostname: String,
port: Int,
@ -137,15 +137,21 @@ object AMQP extends Actor {
exchangeType: ExchangeType,
serializer: Serializer,
shutdownListener: Option[ShutdownListener],
initReconnectDelay: Long): Endpoint = {
val endpoint = new Endpoint(
initReconnectDelay: Long,
passive: Boolean,
durable: Boolean,
configurationArguments: Map[String, AnyRef]): Consumer = {
val endpoint = new Consumer(
new ConnectionFactory(config),
hostname, port,
exchangeName,
exchangeType,
serializer,
shutdownListener,
initReconnectDelay)
initReconnectDelay,
passive,
durable,
configurationArguments)
startLink(endpoint)
endpoint
}
@ -162,7 +168,7 @@ object AMQP extends Actor {
}
/**
* AMQP client actor.
* AMQP producer actor.
* Usage:
* <pre>
* val params = new ConnectionParameters
@ -170,13 +176,13 @@ object AMQP extends Actor {
* params.setPassword("obama")
* params.setVirtualHost("/")
* params.setRequestedHeartbeat(0)
* val client = AMQP.newClient(params, "localhost", 5672, "exchangeName", Serializer.Java, None, None, 100)
* client ! Message("hi")
* val producer = AMQP.newProducer(params, "localhost", 5672, "exchangeName", Serializer.Java, None, None, 100)
* producer ! Message("hi")
* </pre>
*
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class Client private[amqp] (
class Producer private[amqp] (
val connectionFactory: ConnectionFactory,
val hostname: String,
val port: Int,
@ -189,14 +195,15 @@ object AMQP extends Actor {
setupChannel
log.info("AMQP.Client [%s] is started", toString)
log.info("AMQP.Producer [%s] is started", toString)
def receive: PartialFunction[Any, Unit] = {
case message @ Message(payload, routingKey, mandatory, immediate, properties) =>
log.debug("Sending message [%s]", message)
channel.basicPublish(exchangeName, routingKey, mandatory, immediate, properties, serializer.out(payload))
case Stop =>
disconnect; stop
disconnect
stop
}
def setupChannel = {
@ -225,96 +232,109 @@ object AMQP extends Actor {
if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
}
override def toString(): String = "AMQP.Client[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + "]"
override def toString(): String =
"AMQP.Producer[hostname=" + hostname +
", port=" + port +
", exchange=" + exchangeName + "]"
}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/
class Endpoint private[amqp] (
class Consumer private[amqp] (
val connectionFactory: ConnectionFactory,
val hostname: String,
val port: Int,
exchangeName: String,
exchangeType: ExchangeType,
serializer: Serializer,
shutdownListener: Option[ShutdownListener],
val initReconnectDelay: Long)
extends FaultTolerantConnectionActor {
val exchangeName: String,
val exchangeType: ExchangeType,
val serializer: Serializer,
val shutdownListener: Option[ShutdownListener],
val initReconnectDelay: Long,
val passive: Boolean,
val durable: Boolean,
val configurationArguments: Map[java.lang.String, Object])
extends FaultTolerantConnectionActor { self: Consumer =>
faultHandler = Some(OneForOneStrategy(5, 5000))
trapExit = true
val consumers = new HashMap[MessageConsumer, MessageConsumer]
val endpoint = this
val listeners = new HashMap[MessageConsumerListener, MessageConsumerListener]
setupChannel
log.info("AMQP.Endpoint [%s] is started", toString)
log.info("AMQP.Consumer [%s] is started", toString)
def setupChannel = {
connection = connectionFactory.newConnection(hostname, port)
channel = connection.createChannel
channel.exchangeDeclare(exchangeName, exchangeType.toString)
consumers.elements.toList.map(_._2).foreach(setupConsumer)
channel.exchangeDeclare(exchangeName.toString, exchangeType.toString,
passive, durable,
configurationArguments.asJava)
listeners.elements.toList.map(_._2).foreach(setupConsumer)
if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
}
def setupConsumer(consumer: MessageConsumer) = {
channel.queueDeclare(consumer.queueName)
channel.queueBind(consumer.queueName, exchangeName, consumer.routingKey)
def setupConsumer(listener: MessageConsumerListener) = {
channel.queueDeclare(listener.queueName)
channel.queueBind(listener.queueName, exchangeName, listener.routingKey)
val consumerTag = channel.basicConsume(consumer.queueName, false, new DefaultConsumer(channel) with Logging {
val listenerTag = channel.basicConsume(listener.queueName, false, new DefaultConsumer(channel) with Logging {
override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) {
try {
consumer.actor ! Message(serializer.in(payload, None), envelope.getRoutingKey)
listener.actor ! Message(serializer.in(payload, None), envelope.getRoutingKey)
channel.basicAck(envelope.getDeliveryTag, false)
} catch {
case cause => endpoint ! Failure(cause) // pass on and rethrow exception in endpoint actor to trigger restart and reconnect
case cause => self ! Failure(cause) // pass on and re-throw exception in endpoint actor to trigger restart and reconnect
}
}
override def handleShutdownSignal(consumerTag: String, signal: ShutdownSignalException) = {
consumers.elements.toList.map(_._2).find(_.tag == consumerTag) match {
case None => log.warning("Could not find message consumer for tag [%s]; can't shut consumer down", consumerTag)
case Some(consumer) =>
log.warning("Message consumer [%s] is being shutdown by [%s] due to [%s]", consumer, signal.getReference, signal.getReason)
endpoint ! CancelMessageConsumer(consumer)
override def handleShutdownSignal(listenerTag: String, signal: ShutdownSignalException) = {
listeners.elements.toList.map(_._2).find(_.tag == listenerTag) match {
case None => log.warning("Could not find message listener for tag [%s]; can't shut listener down", listenerTag)
case Some(listener) =>
log.warning("Message listener listener [%s] is being shutdown by [%s] due to [%s]", listener, signal.getReference, signal.getReason)
self ! CancelMessageConsumerListener(listener)
}
}
})
consumer.tag = Some(consumerTag)
listener.tag = Some(listenerTag)
}
def receive: PartialFunction[Any, Unit] = {
case consumer: MessageConsumer =>
startLink(consumer.actor)
consumers.put(consumer, consumer)
setupConsumer(consumer)
log.info("Message consumer is registered [%s]", consumer)
case listener: MessageConsumerListener =>
startLink(listener.actor)
listeners.put(listener, listener)
setupConsumer(listener)
log.info("Message consumer listener is registered [%s]", listener)
case CancelMessageConsumer(hash) =>
consumers.get(hash) match {
case None => log.warning("Can't unregister message consumer [%s]; no such consumer", hash)
case Some(consumer) =>
consumers - consumer
consumer.tag match {
case None => log.warning("Can't unregister message consumer [%s]; no consumer tag", consumer)
case CancelMessageConsumerListener(hash) =>
listeners.get(hash) match {
case None => log.warning("Can't unregister message consumer listener [%s]; no such listener", hash)
case Some(listener) =>
listeners - listener
listener.tag match {
case None => log.warning("Can't unregister message consumer listener [%s]; no listener tag", listener)
case Some(tag) =>
channel.basicCancel(tag)
unlink(consumer.actor)
consumer.actor.stop
log.info("Message consumer is cancelled and shut down [%s]", consumer)
unlink(listener.actor)
listener.actor.stop
log.info("Message consumer is cancelled and shut down [%s]", listener)
}
}
case Reconnect(delay) => reconnect(delay)
case Failure(cause) => log.error(cause, ""); throw cause
case Stop => disconnect; stop
case unknown => throw new IllegalArgumentException("Unknown message [" + unknown + "] to AMQP Endpoint [" + this + "]")
case unknown => throw new IllegalArgumentException("Unknown message [" + unknown + "] to AMQP Consumer [" + this + "]")
}
override def toString(): String = "AMQP.Endpoint[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + ", type=" + exchangeType + "]"
override def toString(): String =
"AMQP.Consumer[hostname=" + hostname +
", port=" + port +
", exchange=" + exchangeName +
", type=" + exchangeType +
", passive=" + passive +
", durable=" + durable + "]"
}
trait FaultTolerantConnectionActor extends Actor {

View file

@ -4,9 +4,10 @@
package se.scalablesolutions.akka.amqp
import akka.serialization.Serializer
import se.scalablesolutions.akka.serialization.Serializer
import se.scalablesolutions.akka.actor.Actor
import com.rabbitmq.client.ConnectionParameters
import actor.Actor
object ExampleSession {
import AMQP._
@ -29,29 +30,29 @@ object ExampleSession {
}
def direct = {
val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100)
endpoint ! MessageConsumer("@george_bush", "direct", new Actor() {
val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
consumer ! MessageConsumerListener("@george_bush", "direct", new Actor() {
def receive: PartialFunction[Any, Unit] = {
case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
}
})
val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
client ! Message("@jonas_boner: You sucked!!", "direct")
val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
producer ! Message("@jonas_boner: You sucked!!", "direct")
}
def fanout = {
val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100)
endpoint ! MessageConsumer("@george_bush", "", new Actor() {
val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
consumer ! MessageConsumerListener("@george_bush", "", new Actor() {
def receive: PartialFunction[Any, Unit] = {
case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
}
})
endpoint ! MessageConsumer("@barack_obama", "", new Actor() {
consumer ! MessageConsumerListener("@barack_obama", "", new Actor() {
def receive: PartialFunction[Any, Unit] = {
case Message(payload, _, _, _, _) => log.info("@barack_obama received message from: %s", payload)
}
})
val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
client ! Message("@jonas_boner: I'm going surfing", "")
val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
producer ! Message("@jonas_boner: I'm going surfing", "")
}
}

View file

@ -10,7 +10,7 @@ import com.google.inject.Scopes;
import junit.framework.TestCase;
import se.scalablesolutions.akka.Config;
import se.scalablesolutions.akka.reactor.EventBasedThreadPoolDispatcher;
import se.scalablesolutions.akka.dispatch.EventBasedThreadPoolDispatcher;
import static se.scalablesolutions.akka.config.JavaConfig.*;
import java.util.concurrent.ThreadPoolExecutor;
@ -104,7 +104,7 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase {
try {
foo.longRunning();
fail("exception should have been thrown");
} catch (se.scalablesolutions.akka.reactor.FutureTimeoutException e) {
} catch (se.scalablesolutions.akka.dispatch.FutureTimeoutException e) {
}
}

View file

@ -56,7 +56,8 @@ public class InMemStateful {
mapState.put(key, msg);
vectorState.add(msg);
refState.swap(msg);
nested.success(key, msg);
nested.success(key, msg);
System.out.println("--- after success ");
}
public String failure(String key, String msg, InMemFailer failer) {

View file

@ -4,8 +4,8 @@
package se.scalablesolutions.akka.rest
import config.ConfiguratorRepository
import util.Logging
import se.scalablesolutions.akka.config.ConfiguratorRepository
import se.scalablesolutions.akka.util.Logging
import com.sun.jersey.api.core.ResourceConfig
import com.sun.jersey.spi.container.servlet.ServletContainer

View file

@ -29,6 +29,7 @@ object CassandraStorage extends MapStorage
val VECTOR_COLUMN_PARENT = new ColumnParent("vector", null)
val REF_COLUMN_PARENT = new ColumnParent("ref", null)
val REF_KEY = "item".getBytes("UTF-8")
val EMPTY_BYTE_ARRAY = new Array[Byte](0)
val CASSANDRA_SERVER_HOSTNAME = config.getString("akka.storage.cassandra.hostname", "127.0.0.1")
val CASSANDRA_SERVER_PORT = config.getInt("akka.storage.cassandra.port", 9160)
@ -126,7 +127,7 @@ object CassandraStorage extends MapStorage
val column: Option[ColumnOrSuperColumn] = sessions.withSession {
_ | (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index)))
}
if (column.isDefined) serializer.in(column.get.getColumn.value, None)
if (column.isDefined) serializer.in(column.get.column.value, None)
else throw new NoSuchElementException("No element for vector [" + name + "] and index [" + index + "]")
}
@ -191,17 +192,17 @@ object CassandraStorage extends MapStorage
}
def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = {
throw new UnsupportedOperationException
/*
val columns = server.get_columns_since(name, MAP_COLUMN_FAMILY, -1)
.toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]]
for {
column <- columns
col = (column.columnName, column.value)
} yield col
*/
val size = getMapStorageSizeFor(name)
sessions.withSession { session =>
val columns = session / (name, MAP_COLUMN_PARENT, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, true, size, CONSISTENCY_LEVEL)
for {
columnOrSuperColumn <- columns
entry = (serializer.in(columnOrSuperColumn.column.name, None), serializer.in(columnOrSuperColumn.column.value, None))
} yield entry
}
}
def getMapStorageSizeFor(name: String): Int = {
sessions.withSession {
_ |# (name, MAP_COLUMN_PARENT)

View file

@ -116,7 +116,7 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
} catch { case e: Exception => false }
override def size: Int = try {
storage.getMapStorageSizeFor(uuid) + newAndUpdatedEntries.size
storage.getMapStorageSizeFor(uuid)
} catch { case e: Exception => 0 }
override def get(key: AnyRef): Option[AnyRef] = {
@ -137,7 +137,7 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
private var elements = newAndUpdatedEntries.toList ::: originalList.reverse
override def next: Tuple2[AnyRef, AnyRef]= synchronized {
val element = elements.head
elements = elements.tail
elements = elements.tail
element
}
override def hasNext: Boolean = synchronized { !elements.isEmpty }
@ -151,7 +151,9 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
}
/**
* Implements a persistent transactional map based on the Cassandra distributed P2P key-value storage.
* Implements a persistent transaction
al map based on the Cassandra distributed P2P key-value storage.
*
* @author <a href="http://debasishg.blogspot.com">Debasish Ghosh</a>
*/

View file

@ -5,7 +5,7 @@ import java.util.concurrent.locks.ReentrantLock
import java.util.concurrent.TimeUnit
import junit.framework.TestCase
import reactor._
import dispatch._
import org.junit.{Test, Before}
import org.junit.Assert._

View file

@ -1,11 +1,11 @@
package se.scalablesolutions.akka.state
import akka.actor.Actor
import se.scalablesolutions.akka.actor.Actor
import junit.framework.TestCase
import org.junit.{Test, Before}
import org.junit.Assert._
import dispatch.json._
import dispatch.json.Js._
import _root_.dispatch.json._
import _root_.dispatch.json.Js._
/**
* A persistent actor based on MongoDB storage.

View file

@ -4,8 +4,8 @@ import junit.framework.TestCase
import org.junit.{Test, Before}
import org.junit.Assert._
import dispatch.json._
import dispatch.json.Js._
import _root_.dispatch.json._
import _root_.dispatch.json.Js._
class MongoStorageSpec extends TestCase {
@ -81,8 +81,6 @@ class MongoStorageSpec extends TestCase {
val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString]
assertEquals("debasish", str)
import dispatch.json.Js._
val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue]
val num_list = list ! num
val num_list(l0) = l

View file

@ -1,5 +1,6 @@
package se.scalablesolutions.akka.stm;
import org.multiverse.api.Stm;
import static org.multiverse.api.StmUtils.retry;
import org.multiverse.api.Transaction;
import org.multiverse.api.exceptions.LoadUncommittedException;
@ -7,6 +8,8 @@ import org.multiverse.api.exceptions.ReadonlyException;
import org.multiverse.datastructures.refs.ManagedRef;
import org.multiverse.stms.alpha.*;
import org.multiverse.stms.alpha.mixins.FastAtomicObjectMixin;
import org.multiverse.templates.AtomicTemplate;
import org.multiverse.utils.GlobalStmInstance;
import static org.multiverse.utils.TransactionThreadLocal.getThreadLocalTransaction;
import static java.lang.String.format;
@ -25,6 +28,63 @@ public final class Ref<E> extends FastAtomicObjectMixin implements ManagedRef<E>
final public static class NoTransactionInScopeException extends RuntimeException {
}
/**
* Creates a committed ref with a null value using the Stm in the
* {@link GlobalStmInstance}.
*
* @return the created ref.
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
*/
public static <E> Ref<E> createCommittedRef() {
return createCommittedRef(GlobalStmInstance.get(), null);
}
/**
* Creates a committed ref with a null value.
*
* @param stm the {@Stm} used for committing the ref.
* @return the created ref.
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
*/
public static <E> Ref<E> createCommittedRef(Stm stm) {
return createCommittedRef(stm, null);
}
/**
* Creates a committed ref with the given value using the Stm in the
* {@link GlobalStmInstance}.
*
* @param value the initial value of the Ref.
* @return the created ref.
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
*/
public static <E> Ref<E> createCommittedRef(E value) {
return createCommittedRef(GlobalStmInstance.get(), value);
}
/**
* Creates a committed ref with the given value and using the given Stm.
* <p/>
* This factory method should be called when one doesn't want to lift on the current
* transaction, but you want something to be committed whatever happens. In the future
* behavior will be added propagation levels. But for the time being this is the 'expect_new'
* implementation of this propagation level.
* <p/>
* If the value is an atomicobject or has a reference to it (perhaps indirectly), and
* the transaction this atomicobject is created in is aborted (or hasn't committed) yet,
* you will get the dreaded {@link org.multiverse.api.exceptions.LoadUncommittedException}.
*
* @param stm the {@Stm} used for committing the ref.
* @param value the initial value of the ref. The value is allowed to be null.
* @return the created ref.
*/
public static <E> Ref<E> createCommittedRef(Stm stm, E value) {
Transaction t = stm.startUpdateTransaction("createRef");
Ref<E> ref = new Ref<E>(t, value);
t.commit();
return ref;
}
public Ref() {
Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException();

View file

@ -6,7 +6,7 @@ package se.scalablesolutions.akka
import util.Logging
import net.lag.configgy.{Config => ConfiggyConfig, Configgy, ParseException}
import net.lag.configgy.{Configgy, ParseException}
/**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
@ -31,6 +31,14 @@ object Config extends Logging {
} catch {
case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.")
}
} else if (System.getProperty("akka.config", "") != "") {
val configFile = System.getProperty("akka.config", "")
try {
Configgy.configure(configFile)
log.info("Config loaded from -Dakka.config=%s", configFile)
} catch {
case e: ParseException => throw new IllegalStateException("Config could not be loaded from -Dakka.config=" + configFile)
}
} else {
try {
Configgy.configureFromResource("akka.conf", getClass.getClassLoader)

View file

@ -776,17 +776,6 @@
<root url="jar://$MAVEN_REPOSITORY$/com/mongodb/mongo/0.6/mongo-0.6-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: org.apache.cassandra:cassandra:0.4.0-trunk">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk.jar!/" />
</CLASSES>
<JAVADOC>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk-javadoc.jar!/" />
</JAVADOC>
<SOURCES>
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk-sources.jar!/" />
</SOURCES>
</library>
<library name="Maven: com.facebook:thrift:1.0">
<CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/facebook/thrift/1.0/thrift-1.0.jar!/" />

430
akka.iws
View file

@ -3,21 +3,41 @@
<component name="ChangeListManager" verified="true">
<list default="true" readonly="true" id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/config/akka-reference.conf" afterPath="$PROJECT_DIR$/config/akka-reference.conf" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" afterPath="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-amqp/src/main/scala/ExampleSession.scala" afterPath="$PROJECT_DIR$/akka-amqp/src/main/scala/ExampleSession.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/config/Config.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/config/Config.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" afterPath="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteClient.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteClient.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-util/src/main/scala/Config.scala" afterPath="$PROJECT_DIR$/akka-util/src/main/scala/Config.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" afterPath="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar" afterPath="$PROJECT_DIR$/embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Dispatchers.scala" afterPath="" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
</list>
<ignored path="akka.iws" />
@ -37,6 +57,34 @@
<disable_hints />
</component>
<component name="DebuggerManager">
<line_breakpoints>
<breakpoint url="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" line="53" class="se.scalablesolutions.akka.api.InMemStatefulNested" package="se.scalablesolutions.akka.api">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
<breakpoint url="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" line="55" class="se.scalablesolutions.akka.api.InMemStateful" package="se.scalablesolutions.akka.api">
<option name="ENABLED" value="true" />
<option name="LOG_ENABLED" value="false" />
<option name="LOG_EXPRESSION_ENABLED" value="false" />
<option name="SUSPEND_POLICY" value="SuspendAll" />
<option name="COUNT_FILTER_ENABLED" value="false" />
<option name="COUNT_FILTER" value="0" />
<option name="CONDITION_ENABLED" value="false" />
<option name="CLASS_FILTERS_ENABLED" value="false" />
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
<option name="CONDITION" value="" />
<option name="LOG_MESSAGE" value="" />
</breakpoint>
</line_breakpoints>
<breakpoint_any>
<breakpoint>
<option name="NOTIFY_CAUGHT" value="true" />
@ -78,82 +126,37 @@
<component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<file leaf-file-name="AMQP.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="36" selection-start="4409" selection-end="4409" vertical-scroll-proportion="0.0">
<state line="295" column="18" selection-start="10898" selection-end="10898" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<file leaf-file-name="Ref.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="19" selection-start="49" selection-end="49" vertical-scroll-proportion="0.015429122">
<state line="4" column="43" selection-start="158" selection-end="158" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="TransactionManagement.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<file leaf-file-name="MongoStorageSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="87" column="30" selection-start="3169" selection-end="3169" vertical-scroll-proportion="0.0">
<state line="6" column="22" selection-start="146" selection-end="154" vertical-scroll-proportion="-4.3846154">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Scheduler.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Scheduler.scala">
<file leaf-file-name="AkkaServlet.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="25" selection-start="1494" selection-end="1494" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Transaction.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="126" column="0" selection-start="4172" selection-end="4172" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="Future.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="59" column="50" selection-start="1822" selection-end="1822" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemoryActorSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="6" selection-start="3960" selection-end="3960" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemoryStateTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="23" selection-start="533" selection-end="533" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="InMemNestedStateTest.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="40" column="14" selection-start="1523" selection-end="1523" vertical-scroll-proportion="0.0">
<state line="41" column="70" selection-start="1514" selection-end="1514" vertical-scroll-proportion="1.3117155">
<folding />
</state>
</provider>
@ -174,22 +177,22 @@
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/config/storage-conf.xml" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
<option value="$PROJECT_DIR$/akka-persistence/logs/akka.log" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
<option value="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" />
<option value="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" />
<option value="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" />
</list>
</option>
</component>
@ -245,6 +248,9 @@
<sortByType />
</navigator>
<panes>
<pane id="PackagesPane">
<subPane />
</pane>
<pane id="Scope">
<subPane subId="Problems">
<PATH>
@ -272,10 +278,64 @@
</subPane>
</pane>
<pane id="ProjectPane">
<subPane />
</pane>
<pane id="PackagesPane">
<subPane />
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-amqp" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="akka-amqp" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="src" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="main" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="scala" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
<pane id="Favorites" />
</panes>
@ -300,7 +360,7 @@
<property name="project.structure.side.proportion" value="0.2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="124" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
<property name="options.lastSelected" value="preferences.sourceCode.General" />
<property name="options.lastSelected" value="reference.settingsdialog.IDE.editor.colors.Font" />
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
@ -315,7 +375,7 @@
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="166" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
</component>
<component name="RunManager" selected="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess">
<component name="RunManager" selected="JUnit.InMemNestedStateTest">
<configuration default="false" name="InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
@ -349,6 +409,39 @@
<option name="Make" enabled="false" />
</method>
</configuration>
<configuration default="false" name="InMemNestedStateTest.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
<option name="ENABLED" value="true" />
</pattern>
<module name="akka-fun-test-java" />
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
<option name="ALTERNATIVE_JRE_PATH" value="" />
<option name="PACKAGE_NAME" value="se.scalablesolutions.akka.api" />
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" />
<option name="METHOD_NAME" value="testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
<option name="TEST_OBJECT" value="method" />
<option name="VM_PARAMETERS" value="" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
<option name="PASS_PARENT_ENVS" value="true" />
<option name="TEST_SEARCH_SCOPE">
<value defaultName="moduleWithDependencies" />
</option>
<envs />
<RunnerSettings RunnerId="Debug">
<option name="DEBUG_PORT" value="65130" />
<option name="TRANSPORT" value="0" />
<option name="LOCAL" value="true" />
</RunnerSettings>
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Debug" />
<ConfigurationWrapper RunnerId="Run" />
<method>
<option name="Make" enabled="false" />
</method>
</configuration>
<configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" />
@ -585,7 +678,7 @@
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" />
<option name="VM_PARAMETERS" value="" />
<option name="VM_PARAMETERS" value="-Dakka.config=./config/akka.conf" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" />
@ -606,12 +699,13 @@
<option name="Make" enabled="false" />
</method>
</configuration>
<list size="5">
<list size="6">
<item index="0" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
<item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" />
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" />
<item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryStateTest" />
<item index="4" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest" />
<item index="5" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
</list>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host>
@ -652,29 +746,29 @@
</option>
</component>
<component name="ToolWindowManager">
<frame x="4" y="22" width="1916" height="1178" extended-state="0" />
<editor active="true" />
<frame x="4" y="22" width="1436" height="878" extended-state="6" />
<editor active="false" />
<layout>
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.63745385" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18595926" sideWeight="0.51291513" order="0" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4801444" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18542568" sideWeight="0.6645408" order="0" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29209185" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" />
<window_info id="Messages" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3265306" sideWeight="0.5" order="12" side_tool="false" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="8" side_tool="false" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.7397959" sideWeight="0.5" order="2" side_tool="false" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.47959185" sideWeight="0.5" order="3" side_tool="false" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="11" side_tool="false" />
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="10" side_tool="false" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29335794" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="12" side_tool="false" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" />
</layout>
@ -711,86 +805,116 @@
<option name="FILTER_TARGETS" value="false" />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="118" column="0" selection-start="4515" selection-end="4515" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="159" column="0" selection-start="6245" selection-end="6245" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="50" selection-start="445" selection-end="445" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-samples-java/src/main/java/sample/java/SimpleService.java">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="34" selection-start="307" selection-end="307" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5-sources.jar!/scala/Option.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="38" column="0" selection-start="1292" selection-end="1292" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5.jar!/scala/Some.class">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="36" selection-start="4409" selection-end="4409" vertical-scroll-proportion="0.0">
<state line="8" column="33" selection-start="173" selection-end="173" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="87" column="30" selection-start="3169" selection-end="3169" vertical-scroll-proportion="0.0" />
<state line="7" column="7" selection-start="249" selection-end="249" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Scheduler.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="42" column="25" selection-start="1494" selection-end="1494" vertical-scroll-proportion="0.0" />
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="126" column="0" selection-start="4172" selection-end="4172" vertical-scroll-proportion="0.0" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="59" column="50" selection-start="1822" selection-end="1822" vertical-scroll-proportion="0.0" />
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="6" selection-start="3960" selection-end="3960" vertical-scroll-proportion="0.0" />
<state line="28" column="43" selection-start="995" selection-end="995" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="20" column="23" selection-start="533" selection-end="533" vertical-scroll-proportion="0.0" />
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java">
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
<provider selected="true" editor-type-id="text-editor">
<state line="40" column="14" selection-start="1523" selection-end="1523" vertical-scroll-proportion="0.0" />
<state line="106" column="39" selection-start="3502" selection-end="3502" vertical-scroll-proportion="0.0">
<folding>
<element signature="imports" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/logs/akka.log">
<provider selected="true" editor-type-id="text-editor">
<state line="58" column="64" selection-start="6570" selection-end="6570" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="7" column="7" selection-start="190" selection-end="190" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="57" column="75" selection-start="2514" selection-end="2514" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="19" selection-start="49" selection-end="49" vertical-scroll-proportion="0.015429122">
<state line="148" column="6" selection-start="6208" selection-end="6208" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="34" column="44" selection-start="1224" selection-end="1224" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="295" column="18" selection-start="10898" selection-end="10898" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java">
<provider selected="true" editor-type-id="text-editor">
<state line="4" column="43" selection-start="158" selection-end="158" vertical-scroll-proportion="0.0">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="6" column="22" selection-start="146" selection-end="154" vertical-scroll-proportion="-4.3846154">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala">
<provider selected="true" editor-type-id="text-editor">
<state line="41" column="70" selection-start="1514" selection-end="1514" vertical-scroll-proportion="1.3117155">
<folding />
</state>
</provider>

View file

@ -19,7 +19,8 @@
# FQN to the class doing initial active object/actor
# supervisor bootstrap, should be defined in default constructor
boot = ["sample.java.Boot", "sample.scala.Boot", "sample.secure.Boot"]
#boot = ["sample.java.Boot", "sample.scala.Boot", "sample.secure.Boot"]
boot = ["training.ships.akka_persistence.Boot"]
<actor>
timeout = 5000 # default timeout for future based invocations
@ -30,7 +31,7 @@
service = on
restart-on-collision = off # (not implemented yet) if 'on' then it reschedules the transaction,
# if 'off' then throws an exception or rollback for user to handle
wait-for-completion = 100 # how long time in millis a transaction should be given time to complete when a collision is detected
wait-for-completion = 1000 # how long time in millis a transaction should be given time to complete when a collision is detected
wait-nr-of-times = 3 # the number of times it should check for completion of a pending transaction upon collision
distributed = off # not implemented yet
</stm>
@ -57,7 +58,7 @@
service = on
hostname = "127.0.0.1" # IP address or hostname of one of the Cassandra cluster's seeds
port = 9160
storage-format = "java" # Options: java, scala-json, java-json, protobuf
storage-format = "scala-json" # Options: java, scala-json, java-json, protobuf
consistency-level = 1
</cassandra>

Binary file not shown.