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.lang.reflect.{InvocationTargetException, Method}
import java.net.InetSocketAddress import java.net.InetSocketAddress
import reactor.{MessageDispatcher, FutureResult} import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
import nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply} import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory} import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
import config.ScalaConfig._ import se.scalablesolutions.akka.config.ScalaConfig._
import util._ import se.scalablesolutions.akka.util._
import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint} import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint}
import org.codehaus.aspectwerkz.proxy.Proxy import org.codehaus.aspectwerkz.proxy.Proxy

View file

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

View file

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

View file

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

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions. * Copyright (C) 2009 Scalable Solutions.
*/ */
package se.scalablesolutions.akka.reactor package se.scalablesolutions.akka.dispatch
import actor.Actor 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/]. * 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} import java.util.{LinkedList, List}

View file

@ -2,19 +2,21 @@
* Copyright (C) 2009 Scalable Solutions. * Copyright (C) 2009 Scalable Solutions.
*/ */
package se.scalablesolutions.akka.reactor package se.scalablesolutions.akka.dispatch
import java.util.concurrent._ import java.util.concurrent._
import locks.ReentrantLock import locks.ReentrantLock
import atomic.{AtomicLong, AtomicInteger} import atomic.{AtomicLong, AtomicInteger}
import ThreadPoolExecutor.CallerRunsPolicy import ThreadPoolExecutor.CallerRunsPolicy
import java.util.{Collection, HashSet, HashMap, LinkedList, List} 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/> * 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]. * See also this article: [http://today.java.net/cs/user/print/a/350].
* <p/> * <p/>
* Default thread pool settings are: *
* Default settings are:
* <pre/> * <pre/>
* - withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity * - withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity
* - NR_START_THREADS = 16 * - NR_START_THREADS = 16
@ -22,14 +24,16 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
* - KEEP_ALIVE_TIME = 60000L // one minute * - KEEP_ALIVE_TIME = 60000L // one minute
* </pre> * </pre>
* <p/> * <p/>
*
* The dispatcher has a fluent builder interface to build up a thread pool to suite your use-case. * 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. * There is a default thread pool defined but make use of the builder if you need it. Here are some examples.
* <p/> * <p/>
*
* Scala API. * Scala API.
* <p/> * <p/>
* Example usage: * Example usage:
* <pre/> * <pre/>
* val dispatcher = EventBasedThreadPoolDispatcher * val dispatcher = new EventBasedThreadPoolDispatcher
* dispatcher * dispatcher
* .withNewThreadPoolWithBoundedBlockingQueue(100) * .withNewThreadPoolWithBoundedBlockingQueue(100)
* .setCorePoolSize(16) * .setCorePoolSize(16)
@ -53,6 +57,10 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
* .setRejectionPolicy(new CallerRunsPolicy()) * .setRejectionPolicy(new CallerRunsPolicy())
* .buildThreadPool(); * .buildThreadPool();
* </pre> * </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> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@ -340,6 +348,7 @@ object MonitorableThread {
@volatile val debugLifecycle = false @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> * @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/]. * 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.locks.{Lock, Condition, ReentrantLock}
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit

View file

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

View file

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

View file

@ -2,7 +2,7 @@
* Copyright (C) 2009 Scalable Solutions. * Copyright (C) 2009 Scalable Solutions.
*/ */
package se.scalablesolutions.akka.reactor package se.scalablesolutions.akka.dispatch
import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.LinkedBlockingQueue
import java.util.Queue 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. * 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> * @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)) def this(actor: Actor) = this(actor.getClass.getName, new ActorMessageInvoker(actor))
private val queue = new BlockingMessageQueue(name) 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 { 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] private val queue = new LinkedBlockingQueue[MessageInvocation]
def append(handle: MessageInvocation) = queue.put(handle) def append(handle: MessageInvocation) = queue.put(handle)
def prepend(handle: MessageInvocation) = queue.add(handle) // FIXME is add prepend??? 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 protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
import actor.{Exit, Actor} import actor.{Exit, Actor}
import reactor.{DefaultCompletableFutureResult, CompletableFutureResult} import dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
import serialization.{Serializer, Serializable, SerializationProtocol} import serialization.{Serializer, Serializable, SerializationProtocol}
import util.Logging import util.Logging

View file

@ -47,10 +47,14 @@ object RemoteServer extends Logging {
private val bootstrap = new ServerBootstrap(factory) 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) { if (!isRunning) {
log.info("Starting remote server at [%s:%s]", HOSTNAME, PORT) log.info("Starting remote server at [%s:%s]", HOSTNAME, PORT)
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, loader)) bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, loader))
// FIXME make these RemoteServer options configurable
bootstrap.setOption("child.tcpNoDelay", true) bootstrap.setOption("child.tcpNoDelay", true)
bootstrap.setOption("child.keepAlive", true) bootstrap.setOption("child.keepAlive", true)
bootstrap.setOption("child.reuseAddress", 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.AtomicLong
import java.util.concurrent.atomic.AtomicInteger 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.util.Logging
import se.scalablesolutions.akka.state.Committable import se.scalablesolutions.akka.state.Committable
@ -71,6 +71,7 @@ object Transaction {
}.execute() }.execute()
} }
} }
/** /**
* @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
@ -114,9 +115,8 @@ object Transaction {
} }
def commit(participant: String): Boolean = synchronized { 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) { if (status == TransactionStatus.Active) {
log.debug("TX COMMIT - Trying to commit transaction [%s] for server with UUID [%s]", toString, participant)
val haveAllPreCommitted = val haveAllPreCommitted =
if (participants.size == precommitted.size) {{ if (participants.size == precommitted.size) {{
for (part <- participants) yield { for (part <- participants) yield {
@ -125,6 +125,7 @@ object Transaction {
}}.exists(_ == true) }}.exists(_ == true)
} else false } else false
if (haveAllPreCommitted && transaction != null) { if (haveAllPreCommitted && transaction != null) {
setThreadLocalTransaction(transaction)
log.debug("TX COMMIT - Committing transaction [%s] for server with UUID [%s]", toString, participant) log.debug("TX COMMIT - Committing transaction [%s] for server with UUID [%s]", toString, participant)
transaction.commit transaction.commit
reset reset
@ -132,6 +133,7 @@ object Transaction {
Transaction.Atomic { Transaction.Atomic {
persistentStateMap.values.foreach(_.commit) persistentStateMap.values.foreach(_.commit)
} }
setThreadLocalTransaction(null)
true true
} else false } else false
} else { } else {
@ -147,13 +149,6 @@ object Transaction {
reset 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 { def join(participant: String) = synchronized {
ensureIsActive ensureIsActive
log.debug("TX JOIN - Actor with UUID [%s] is joining transaction [%s]" , participant, toString) log.debug("TX JOIN - Actor with UUID [%s] is joining transaction [%s]" , participant, toString)
@ -176,6 +171,7 @@ object Transaction {
precommitted = Nil precommitted = Nil
} }
def status_? = status
def isNew = synchronized { status == TransactionStatus.New } def isNew = synchronized { status == TransactionStatus.New }
def isActive = synchronized { status == TransactionStatus.Active } def isActive = synchronized { status == TransactionStatus.Active }
def isCompleted = synchronized { status == TransactionStatus.Completed } def isCompleted = synchronized { status == TransactionStatus.Completed }

View file

@ -6,7 +6,7 @@ package se.scalablesolutions.akka.stm
import java.util.concurrent.atomic.AtomicBoolean 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 se.scalablesolutions.akka.util.Logging
import org.codehaus.aspectwerkz.proxy.Uuid import org.codehaus.aspectwerkz.proxy.Uuid
@ -25,7 +25,7 @@ class TransactionAwareWrapperException(val cause: Throwable, val tx: Option[Tran
object TransactionManagement { object TransactionManagement {
import se.scalablesolutions.akka.Config._ 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 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 MAX_NR_OF_RETRIES = config.getInt("akka.stm.max-nr-of-retries", 10)
val TRANSACTION_ENABLED = new AtomicBoolean(config.getBool("akka.stm.service", false)) 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? ---------") println("------------ COULD NOT COMMIT -- WAITING OR TIMEOUT? ---------")
//tx.retry //tx.retry
} else { } 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 // continue, try to commit on next received message
// FIXME check if TX hase timed out => throw exception // 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 None => {} // no tx; nothing to do
case Some(tx) => case Some(tx) =>
tx.rollback(uuid) tx.rollback(uuid)
activeTransactions -= tx
} }
protected def rollbackForRescheduling(tx: Option[Transaction]) = tx match { protected def setTransaction(transaction: Option[Transaction]) = if (transaction.isDefined) {
case None => {} // no tx; nothing to do currentTransaction.set(transaction)
case Some(tx) => setThreadLocalTransaction(transaction.get.transaction)
tx.rollbackForRescheduling(uuid) }
protected def clearTransaction = {
currentTransaction.set(None)
setThreadLocalTransaction(null)
} }
protected def isInExistingTransaction = currentTransaction.get.isDefined 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> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
*/ */
class TransactionalRef[T] extends Transactional { 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] = { def get: Option[T] = {
println("---- get TX " + getThreadLocalTransaction)
if (ref.isNull) None if (ref.isNull) None
else Some(ref.get) else Some(ref.get)
} }
@ -89,7 +96,10 @@ class TransactionalRef[T] extends Transactional {
else ref.get else ref.get
} }
def isDefined: Boolean = !ref.isNull def isDefined: Boolean = {
println("---- isDefined TX " + getThreadLocalTransaction)
!ref.isNull
}
def isEmpty: Boolean = ref.isNull def isEmpty: Boolean = ref.isNull

View file

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

View file

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

View file

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

View file

@ -57,6 +57,7 @@ public class InMemStateful {
vectorState.add(msg); vectorState.add(msg);
refState.swap(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) { public String failure(String key, String msg, InMemFailer failer) {

View file

@ -4,8 +4,8 @@
package se.scalablesolutions.akka.rest package se.scalablesolutions.akka.rest
import config.ConfiguratorRepository import se.scalablesolutions.akka.config.ConfiguratorRepository
import util.Logging import se.scalablesolutions.akka.util.Logging
import com.sun.jersey.api.core.ResourceConfig import com.sun.jersey.api.core.ResourceConfig
import com.sun.jersey.spi.container.servlet.ServletContainer 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 VECTOR_COLUMN_PARENT = new ColumnParent("vector", null)
val REF_COLUMN_PARENT = new ColumnParent("ref", null) val REF_COLUMN_PARENT = new ColumnParent("ref", null)
val REF_KEY = "item".getBytes("UTF-8") 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_HOSTNAME = config.getString("akka.storage.cassandra.hostname", "127.0.0.1")
val CASSANDRA_SERVER_PORT = config.getInt("akka.storage.cassandra.port", 9160) 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 { val column: Option[ColumnOrSuperColumn] = sessions.withSession {
_ | (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index))) _ | (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 + "]") else throw new NoSuchElementException("No element for vector [" + name + "] and index [" + index + "]")
} }
@ -191,16 +192,16 @@ object CassandraStorage extends MapStorage
} }
def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = { def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = {
throw new UnsupportedOperationException val size = getMapStorageSizeFor(name)
/* sessions.withSession { session =>
val columns = server.get_columns_since(name, MAP_COLUMN_FAMILY, -1) val columns = session / (name, MAP_COLUMN_PARENT, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, true, size, CONSISTENCY_LEVEL)
.toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]]
for { for {
column <- columns columnOrSuperColumn <- columns
col = (column.columnName, column.value) entry = (serializer.in(columnOrSuperColumn.column.name, None), serializer.in(columnOrSuperColumn.column.value, None))
} yield col } yield entry
*/
} }
}
def getMapStorageSizeFor(name: String): Int = { def getMapStorageSizeFor(name: String): Int = {
sessions.withSession { sessions.withSession {

View file

@ -116,7 +116,7 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
} catch { case e: Exception => false } } catch { case e: Exception => false }
override def size: Int = try { override def size: Int = try {
storage.getMapStorageSizeFor(uuid) + newAndUpdatedEntries.size storage.getMapStorageSizeFor(uuid)
} catch { case e: Exception => 0 } } catch { case e: Exception => 0 }
override def get(key: AnyRef): Option[AnyRef] = { override def get(key: AnyRef): Option[AnyRef] = {
@ -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> * @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 java.util.concurrent.TimeUnit
import junit.framework.TestCase import junit.framework.TestCase
import reactor._ import dispatch._
import org.junit.{Test, Before} import org.junit.{Test, Before}
import org.junit.Assert._ import org.junit.Assert._

View file

@ -1,11 +1,11 @@
package se.scalablesolutions.akka.state package se.scalablesolutions.akka.state
import akka.actor.Actor import se.scalablesolutions.akka.actor.Actor
import junit.framework.TestCase import junit.framework.TestCase
import org.junit.{Test, Before} import org.junit.{Test, Before}
import org.junit.Assert._ import org.junit.Assert._
import dispatch.json._ import _root_.dispatch.json._
import dispatch.json.Js._ import _root_.dispatch.json.Js._
/** /**
* A persistent actor based on MongoDB storage. * 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.{Test, Before}
import org.junit.Assert._ import org.junit.Assert._
import dispatch.json._ import _root_.dispatch.json._
import dispatch.json.Js._ import _root_.dispatch.json.Js._
class MongoStorageSpec extends TestCase { class MongoStorageSpec extends TestCase {
@ -81,8 +81,6 @@ class MongoStorageSpec extends TestCase {
val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString] val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString]
assertEquals("debasish", str) assertEquals("debasish", str)
import dispatch.json.Js._
val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue] val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue]
val num_list = list ! num val num_list = list ! num
val num_list(l0) = l val num_list(l0) = l

View file

@ -1,5 +1,6 @@
package se.scalablesolutions.akka.stm; package se.scalablesolutions.akka.stm;
import org.multiverse.api.Stm;
import static org.multiverse.api.StmUtils.retry; import static org.multiverse.api.StmUtils.retry;
import org.multiverse.api.Transaction; import org.multiverse.api.Transaction;
import org.multiverse.api.exceptions.LoadUncommittedException; 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.datastructures.refs.ManagedRef;
import org.multiverse.stms.alpha.*; import org.multiverse.stms.alpha.*;
import org.multiverse.stms.alpha.mixins.FastAtomicObjectMixin; 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 org.multiverse.utils.TransactionThreadLocal.getThreadLocalTransaction;
import static java.lang.String.format; 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 { 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() { public Ref() {
Transaction tx = getThreadLocalTransaction(); Transaction tx = getThreadLocalTransaction();
if (tx == null) throw new NoTransactionInScopeException(); if (tx == null) throw new NoTransactionInScopeException();

View file

@ -6,7 +6,7 @@ package se.scalablesolutions.akka
import util.Logging 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> * @author <a href="http://jonasboner.com">Jonas Bon&#233;r</a>
@ -31,6 +31,14 @@ object Config extends Logging {
} catch { } 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.") 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 { } else {
try { try {
Configgy.configureFromResource("akka.conf", getClass.getClassLoader) 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!/" /> <root url="jar://$MAVEN_REPOSITORY$/com/mongodb/mongo/0.6/mongo-0.6-sources.jar!/" />
</SOURCES> </SOURCES>
</library> </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"> <library name="Maven: com.facebook:thrift:1.0">
<CLASSES> <CLASSES>
<root url="jar://$MAVEN_REPOSITORY$/com/facebook/thrift/1.0/thrift-1.0.jar!/" /> <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"> <component name="ChangeListManager" verified="true">
<list default="true" readonly="true" id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment=""> <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/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$/config/akka-reference.conf" afterPath="$PROJECT_DIR$/config/akka-reference.conf" />
<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="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/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-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.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-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-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/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/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-persistence/src/main/scala/CassandraStorage.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.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-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-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-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" /> <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> </list>
<ignored path="akka.iws" /> <ignored path="akka.iws" />
@ -37,6 +57,34 @@
<disable_hints /> <disable_hints />
</component> </component>
<component name="DebuggerManager"> <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_any>
<breakpoint> <breakpoint>
<option name="NOTIFY_CAUGHT" value="true" /> <option name="NOTIFY_CAUGHT" value="true" />
@ -78,82 +126,37 @@
<component name="FileColors" enabled="false" enabledForTabs="false" /> <component name="FileColors" enabled="false" enabledForTabs="false" />
<component name="FileEditorManager"> <component name="FileEditorManager">
<leaf> <leaf>
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="AMQP.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala"> <entry file="file://$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala">
<provider selected="true" editor-type-id="text-editor"> <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 /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="RemoteServer.scala" pinned="false" current="true" current-in-tab="true"> <file leaf-file-name="Ref.java" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala"> <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"> <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 /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="TransactionManagement.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="MongoStorageSpec.scala" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala"> <entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala">
<provider selected="true" editor-type-id="text-editor"> <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 /> <folding />
</state> </state>
</provider> </provider>
</entry> </entry>
</file> </file>
<file leaf-file-name="Scheduler.scala" pinned="false" current="false" current-in-tab="false"> <file leaf-file-name="AkkaServlet.scala" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Scheduler.scala"> <entry file="file://$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala">
<provider selected="true" editor-type-id="text-editor"> <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="41" column="70" selection-start="1514" selection-end="1514" vertical-scroll-proportion="1.3117155">
<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">
<folding /> <folding />
</state> </state>
</provider> </provider>
@ -174,22 +177,22 @@
<component name="IdeDocumentHistory"> <component name="IdeDocumentHistory">
<option name="changedFiles"> <option name="changedFiles">
<list> <list>
<option value="$PROJECT_DIR$/config/storage-conf.xml" /> <option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" /> <option value="$PROJECT_DIR$/akka-actors/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/test/scala/EventBasedSingleThreadDispatcherTest.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/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-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/test/scala/ThreadBasedDispatcherTest.scala" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" /> <option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" /> <option value="$PROJECT_DIR$/akka-persistence/logs/akka.log" />
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" /> <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-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> </list>
</option> </option>
</component> </component>
@ -245,6 +248,9 @@
<sortByType /> <sortByType />
</navigator> </navigator>
<panes> <panes>
<pane id="PackagesPane">
<subPane />
</pane>
<pane id="Scope"> <pane id="Scope">
<subPane subId="Problems"> <subPane subId="Problems">
<PATH> <PATH>
@ -272,10 +278,64 @@
</subPane> </subPane>
</pane> </pane>
<pane id="ProjectPane"> <pane id="ProjectPane">
<subPane /> <subPane>
</pane> <PATH>
<pane id="PackagesPane"> <PATH_ELEMENT>
<subPane /> <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>
<pane id="Favorites" /> <pane id="Favorites" />
</panes> </panes>
@ -300,7 +360,7 @@
<property name="project.structure.side.proportion" value="0.2" /> <property name="project.structure.side.proportion" value="0.2" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="124" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="124" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" /> <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="GoToClass.toSaveIncludeLibraries" value="false" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" /> <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_flatWidth1" value="166" />
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" /> <property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
</component> </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"> <configuration default="false" name="InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
<pattern> <pattern>
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" /> <option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
@ -349,6 +409,39 @@
<option name="Make" enabled="false" /> <option name="Make" enabled="false" />
</method> </method>
</configuration> </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"> <configuration default="true" type="Remote" factoryName="Remote">
<option name="USE_SOCKET_TRANSPORT" value="true" /> <option name="USE_SOCKET_TRANSPORT" value="true" />
<option name="SERVER_MODE" value="false" /> <option name="SERVER_MODE" value="false" />
@ -585,7 +678,7 @@
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" /> <option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" />
<option name="METHOD_NAME" value="" /> <option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="class" /> <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="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" /> <option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
<option name="ENV_VARIABLES" /> <option name="ENV_VARIABLES" />
@ -606,12 +699,13 @@
<option name="Make" enabled="false" /> <option name="Make" enabled="false" />
</method> </method>
</configuration> </configuration>
<list size="5"> <list size="6">
<item index="0" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" /> <item index="0" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
<item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" /> <item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" />
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" /> <item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" />
<item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryStateTest" /> <item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryStateTest" />
<item index="4" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest" /> <item index="4" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest" />
<item index="5" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
</list> </list>
<configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false"> <configuration name="&lt;template&gt;" type="WebApp" default="true" selected="false">
<Host>localhost</Host> <Host>localhost</Host>
@ -652,29 +746,29 @@
</option> </option>
</component> </component>
<component name="ToolWindowManager"> <component name="ToolWindowManager">
<frame x="4" y="22" width="1916" height="1178" extended-state="0" /> <frame x="4" y="22" width="1436" height="878" extended-state="6" />
<editor active="true" /> <editor active="false" />
<layout> <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="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="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="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.18542568" sideWeight="0.6645408" 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="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="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="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="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="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="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="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="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="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="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" /> <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> </layout>
@ -711,86 +805,116 @@
<option name="FILTER_TARGETS" value="false" /> <option name="FILTER_TARGETS" value="false" />
</component> </component>
<component name="editorHistoryManager"> <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"> <provider selected="true" editor-type-id="text-editor">
<state line="118" column="0" selection-start="4515" selection-end="4515" vertical-scroll-proportion="0.0" /> <state line="8" column="33" selection-start="173" selection-end="173" 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">
<folding /> <folding />
</state> </state>
</provider> </provider>
</entry> </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"> <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> </provider>
</entry> </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"> <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> </provider>
</entry> </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"> <provider selected="true" editor-type-id="text-editor">
<state line="126" column="0" selection-start="4172" selection-end="4172" vertical-scroll-proportion="0.0" /> <state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
</provider> <folding />
</entry> </state>
<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" />
</provider> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala"> <entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
<provider selected="true" editor-type-id="text-editor"> <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> </provider>
</entry> </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"> <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> </provider>
</entry> </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"> <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> </provider>
</entry> </entry>
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala"> <entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
<provider selected="true" editor-type-id="text-editor"> <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 /> <folding />
</state> </state>
</provider> </provider>

View file

@ -19,7 +19,8 @@
# FQN to the class doing initial active object/actor # FQN to the class doing initial active object/actor
# supervisor bootstrap, should be defined in default constructor # 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> <actor>
timeout = 5000 # default timeout for future based invocations timeout = 5000 # default timeout for future based invocations
@ -30,7 +31,7 @@
service = on service = on
restart-on-collision = off # (not implemented yet) if 'on' then it reschedules the transaction, 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 # 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 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 distributed = off # not implemented yet
</stm> </stm>
@ -57,7 +58,7 @@
service = on service = on
hostname = "127.0.0.1" # IP address or hostname of one of the Cassandra cluster's seeds hostname = "127.0.0.1" # IP address or hostname of one of the Cassandra cluster's seeds
port = 9160 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 consistency-level = 1
</cassandra> </cassandra>

Binary file not shown.