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:
parent
059502b463
commit
c073c2bb2f
37 changed files with 572 additions and 338 deletions
|
|
@ -7,11 +7,11 @@ package se.scalablesolutions.akka.actor
|
|||
import java.lang.reflect.{InvocationTargetException, Method}
|
||||
import java.net.InetSocketAddress
|
||||
|
||||
import reactor.{MessageDispatcher, FutureResult}
|
||||
import nio.protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
||||
import nio.{RemoteProtocolBuilder, RemoteClient, RemoteServer, RemoteRequestIdFactory}
|
||||
import config.ScalaConfig._
|
||||
import util._
|
||||
import se.scalablesolutions.akka.dispatch.{MessageDispatcher, FutureResult}
|
||||
import se.scalablesolutions.akka.nio.protobuf.RemoteProtocol.RemoteRequest
|
||||
import se.scalablesolutions.akka.nio.{RemoteProtocolBuilder, RemoteClient, RemoteRequestIdFactory}
|
||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||
import se.scalablesolutions.akka.util._
|
||||
|
||||
import org.codehaus.aspectwerkz.joinpoint.{MethodRtti, JoinPoint}
|
||||
import org.codehaus.aspectwerkz.proxy.Proxy
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import java.net.InetSocketAddress
|
|||
import java.util.HashSet
|
||||
|
||||
import se.scalablesolutions.akka.Config._
|
||||
import se.scalablesolutions.akka.reactor._
|
||||
import se.scalablesolutions.akka.dispatch._
|
||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||
import se.scalablesolutions.akka.stm.TransactionManagement._
|
||||
import se.scalablesolutions.akka.stm.TransactionManagement
|
||||
|
|
@ -514,10 +514,10 @@ trait Actor extends Logging with TransactionManagement {
|
|||
try {
|
||||
tryToCommitTransactions
|
||||
|
||||
if (currentTransaction.get.isDefined && !currentTransaction.get.get.isActive) {
|
||||
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
|
||||
setThreadLocalTransaction(null)
|
||||
}
|
||||
//if (currentTransaction.get.isDefined && !currentTransaction.get.get.isActive) {
|
||||
// currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
|
||||
// setThreadLocalTransaction(null)
|
||||
//}
|
||||
|
||||
if (isInExistingTransaction) joinExistingTransaction
|
||||
else if (isTransactional) startNewTransaction(messageHandle)
|
||||
|
|
@ -535,16 +535,15 @@ trait Actor extends Logging with TransactionManagement {
|
|||
val tx = currentTransaction.get
|
||||
rollback(tx)
|
||||
|
||||
if (!(tx.isDefined && tx.get.isTopLevel)) {
|
||||
if (tx.isDefined && tx.get.isTopLevel) {
|
||||
val done = tx.get.retry
|
||||
if (done) {
|
||||
if (future.isDefined) future.get.completeWithException(this, e)
|
||||
else e.printStackTrace
|
||||
}
|
||||
}
|
||||
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
|
||||
setThreadLocalTransaction(null)
|
||||
|
||||
clearTransaction
|
||||
|
||||
case e =>
|
||||
e.printStackTrace
|
||||
decrementTransaction
|
||||
|
|
@ -555,8 +554,7 @@ trait Actor extends Logging with TransactionManagement {
|
|||
if (future.isDefined) future.get.completeWithException(this, e)
|
||||
else e.printStackTrace
|
||||
|
||||
currentTransaction.set(None) // need to clear currentTransaction before call to supervisor
|
||||
setThreadLocalTransaction(null)
|
||||
clearTransaction // need to clear currentTransaction before call to supervisor
|
||||
|
||||
// FIXME to fix supervisor restart of remote actor for oneway calls, inject a supervisor proxy that can send notification back to client
|
||||
if (supervisor.isDefined) supervisor.get ! Exit(this, e)
|
||||
|
|
@ -564,8 +562,7 @@ trait Actor extends Logging with TransactionManagement {
|
|||
} finally {
|
||||
if (currentTransaction.get.isDefined && currentTransaction.get.get.isAborted) removeTransactionIfTopLevel(currentTransaction.get.get)
|
||||
else tryToPrecommitTransactions
|
||||
currentTransaction.set(None)
|
||||
setThreadLocalTransaction(null)
|
||||
clearTransaction
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -7,8 +7,8 @@ package se.scalablesolutions.akka.config
|
|||
import com.google.inject._
|
||||
|
||||
import ScalaConfig._
|
||||
import akka.actor.{Supervisor, ActiveObjectFactory, Dispatcher}
|
||||
import akka.util.Logging
|
||||
import se.scalablesolutions.akka.actor.{Supervisor, ActiveObjectFactory, Dispatcher}
|
||||
import se.scalablesolutions.akka.util.Logging
|
||||
|
||||
//import org.apache.camel.impl.{DefaultCamelContext}
|
||||
//import org.apache.camel.{CamelContext, Endpoint, Routes}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ package se.scalablesolutions.akka.config
|
|||
import reflect.BeanProperty
|
||||
|
||||
import actor.Actor
|
||||
import reactor.MessageDispatcher
|
||||
import dispatch.MessageDispatcher
|
||||
|
||||
/**
|
||||
* Configuration classes - not to be used as messages.
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
* Copyright (C) 2009 Scalable Solutions.
|
||||
*/
|
||||
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import actor.Actor
|
||||
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
*
|
||||
* Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/].
|
||||
*/
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.{LinkedList, List}
|
||||
|
||||
|
|
@ -2,19 +2,21 @@
|
|||
* Copyright (C) 2009 Scalable Solutions.
|
||||
*/
|
||||
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent._
|
||||
import locks.ReentrantLock
|
||||
import atomic.{AtomicLong, AtomicInteger}
|
||||
import ThreadPoolExecutor.CallerRunsPolicy
|
||||
|
||||
import java.util.{Collection, HashSet, HashMap, LinkedList, List}
|
||||
|
||||
/**
|
||||
* Implements the Reactor pattern as defined in: [http://www.cs.wustl.edu/~schmidt/PDF/reactor-siemens.pdf].<br/>
|
||||
* See also this article: [http://today.java.net/cs/user/print/a/350].
|
||||
* <p/>
|
||||
* Default thread pool settings are:
|
||||
*
|
||||
* Default settings are:
|
||||
* <pre/>
|
||||
* - withNewThreadPoolWithLinkedBlockingQueueWithUnboundedCapacity
|
||||
* - NR_START_THREADS = 16
|
||||
|
|
@ -22,14 +24,16 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
|
|||
* - KEEP_ALIVE_TIME = 60000L // one minute
|
||||
* </pre>
|
||||
* <p/>
|
||||
*
|
||||
* The dispatcher has a fluent builder interface to build up a thread pool to suite your use-case.
|
||||
* There is a default thread pool defined but make use of the builder if you need it. Here are some examples.
|
||||
* <p/>
|
||||
*
|
||||
* Scala API.
|
||||
* <p/>
|
||||
* Example usage:
|
||||
* <pre/>
|
||||
* val dispatcher = EventBasedThreadPoolDispatcher
|
||||
* val dispatcher = new EventBasedThreadPoolDispatcher
|
||||
* dispatcher
|
||||
* .withNewThreadPoolWithBoundedBlockingQueue(100)
|
||||
* .setCorePoolSize(16)
|
||||
|
|
@ -53,7 +57,11 @@ import java.util.{Collection, HashSet, HashMap, LinkedList, List}
|
|||
* .setRejectionPolicy(new CallerRunsPolicy())
|
||||
* .buildThreadPool();
|
||||
* </pre>
|
||||
* <p/>
|
||||
*
|
||||
* But the preferred way of creating dispatchers is to use
|
||||
* the {@link se.scalablesolutions.akka.dispatch.Dispatchers} factory object.
|
||||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class EventBasedThreadPoolDispatcher(name: String, private val concurrentMode: Boolean) extends MessageDispatcherBase(name) {
|
||||
|
|
@ -340,6 +348,7 @@ object MonitorableThread {
|
|||
@volatile val debugLifecycle = false
|
||||
}
|
||||
|
||||
// FIXME fix the issues with using the monitoring in MonitorableThread
|
||||
/**
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
|
|
@ -5,7 +5,7 @@
|
|||
/**
|
||||
* Based on code from the actorom actor framework by Sergio Bossa [http://code.google.com/p/actorom/].
|
||||
*/
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent.locks.{Lock, Condition, ReentrantLock}
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
* Copyright (C) 2009 Scalable Solutions.
|
||||
*/
|
||||
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.{LinkedList, Queue, List}
|
||||
import java.util.concurrent.{TimeUnit, BlockingQueue}
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
* Copyright (C) 2009 Scalable Solutions.
|
||||
*/
|
||||
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.List
|
||||
|
||||
|
|
@ -2,7 +2,7 @@
|
|||
* Copyright (C) 2009 Scalable Solutions.
|
||||
*/
|
||||
|
||||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent.LinkedBlockingQueue
|
||||
import java.util.Queue
|
||||
|
|
@ -11,9 +11,12 @@ import actor.{Actor, ActorMessageInvoker}
|
|||
|
||||
/**
|
||||
* Dedicates a unique thread for each actor passed in as reference. Served through its messageQueue.
|
||||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler: MessageInvoker) extends MessageDispatcher {
|
||||
class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler: MessageInvoker)
|
||||
extends MessageDispatcher {
|
||||
|
||||
def this(actor: Actor) = this(actor.getClass.getName, new ActorMessageInvoker(actor))
|
||||
|
||||
private val queue = new BlockingMessageQueue(name)
|
||||
|
|
@ -46,7 +49,7 @@ class ThreadBasedDispatcher private[akka] (val name: String, val messageHandler:
|
|||
}
|
||||
|
||||
class BlockingMessageQueue(name: String) extends MessageQueue {
|
||||
// FIXME: configure the LBQ
|
||||
// FIXME: configure the LinkedBlockingQueue in BlockingMessageQueue, use a Builder like in the EventBasedThreadPoolDispatcher
|
||||
private val queue = new LinkedBlockingQueue[MessageInvocation]
|
||||
def append(handle: MessageInvocation) = queue.put(handle)
|
||||
def prepend(handle: MessageInvocation) = queue.add(handle) // FIXME is add prepend???
|
||||
|
|
@ -9,7 +9,7 @@ import java.util.concurrent.{Executors, ConcurrentMap, ConcurrentHashMap}
|
|||
|
||||
import protobuf.RemoteProtocol.{RemoteRequest, RemoteReply}
|
||||
import actor.{Exit, Actor}
|
||||
import reactor.{DefaultCompletableFutureResult, CompletableFutureResult}
|
||||
import dispatch.{DefaultCompletableFutureResult, CompletableFutureResult}
|
||||
import serialization.{Serializer, Serializable, SerializationProtocol}
|
||||
import util.Logging
|
||||
|
||||
|
|
|
|||
|
|
@ -47,10 +47,14 @@ object RemoteServer extends Logging {
|
|||
|
||||
private val bootstrap = new ServerBootstrap(factory)
|
||||
|
||||
def start(loader: Option[ClassLoader]) = synchronized {
|
||||
def start: Unit = start(None)
|
||||
def start(loader: Option[ClassLoader]): Unit = start(HOSTNAME, PORT)
|
||||
def start(hostname: String, port: Int): Unit = start(hostname, port, None)
|
||||
def start(hostname: String, port: Int, loader: Option[ClassLoader]): Unit = synchronized {
|
||||
if (!isRunning) {
|
||||
log.info("Starting remote server at [%s:%s]", HOSTNAME, PORT)
|
||||
bootstrap.setPipelineFactory(new RemoteServerPipelineFactory(name, loader))
|
||||
// FIXME make these RemoteServer options configurable
|
||||
bootstrap.setOption("child.tcpNoDelay", true)
|
||||
bootstrap.setOption("child.keepAlive", true)
|
||||
bootstrap.setOption("child.reuseAddress", true)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ package se.scalablesolutions.akka.stm
|
|||
import java.util.concurrent.atomic.AtomicLong
|
||||
import java.util.concurrent.atomic.AtomicInteger
|
||||
|
||||
import se.scalablesolutions.akka.reactor.MessageInvocation
|
||||
import se.scalablesolutions.akka.dispatch.MessageInvocation
|
||||
import se.scalablesolutions.akka.util.Logging
|
||||
import se.scalablesolutions.akka.state.Committable
|
||||
|
||||
|
|
@ -71,6 +71,7 @@ object Transaction {
|
|||
}.execute()
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
|
|
@ -114,9 +115,8 @@ object Transaction {
|
|||
}
|
||||
|
||||
def commit(participant: String): Boolean = synchronized {
|
||||
log.debug("TX COMMIT - Trying to commit transaction [%s] for server with UUID [%s]", toString, participant)
|
||||
setThreadLocalTransaction(transaction)
|
||||
if (status == TransactionStatus.Active) {
|
||||
log.debug("TX COMMIT - Trying to commit transaction [%s] for server with UUID [%s]", toString, participant)
|
||||
val haveAllPreCommitted =
|
||||
if (participants.size == precommitted.size) {{
|
||||
for (part <- participants) yield {
|
||||
|
|
@ -125,6 +125,7 @@ object Transaction {
|
|||
}}.exists(_ == true)
|
||||
} else false
|
||||
if (haveAllPreCommitted && transaction != null) {
|
||||
setThreadLocalTransaction(transaction)
|
||||
log.debug("TX COMMIT - Committing transaction [%s] for server with UUID [%s]", toString, participant)
|
||||
transaction.commit
|
||||
reset
|
||||
|
|
@ -132,6 +133,7 @@ object Transaction {
|
|||
Transaction.Atomic {
|
||||
persistentStateMap.values.foreach(_.commit)
|
||||
}
|
||||
setThreadLocalTransaction(null)
|
||||
true
|
||||
} else false
|
||||
} else {
|
||||
|
|
@ -146,14 +148,7 @@ object Transaction {
|
|||
transaction.abort
|
||||
reset
|
||||
}
|
||||
|
||||
def rollbackForRescheduling(participant: String) = synchronized {
|
||||
ensureIsActiveOrAborted
|
||||
log.debug("TX ROLLBACK for recheduling - Actor with UUID [%s] has initiated transaction rollback for [%s]", participant, toString)
|
||||
transaction.abort
|
||||
reset
|
||||
}
|
||||
|
||||
|
||||
def join(participant: String) = synchronized {
|
||||
ensureIsActive
|
||||
log.debug("TX JOIN - Actor with UUID [%s] is joining transaction [%s]" , participant, toString)
|
||||
|
|
@ -176,6 +171,7 @@ object Transaction {
|
|||
precommitted = Nil
|
||||
}
|
||||
|
||||
def status_? = status
|
||||
def isNew = synchronized { status == TransactionStatus.New }
|
||||
def isActive = synchronized { status == TransactionStatus.Active }
|
||||
def isCompleted = synchronized { status == TransactionStatus.Completed }
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ package se.scalablesolutions.akka.stm
|
|||
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
|
||||
import se.scalablesolutions.akka.reactor.MessageInvocation
|
||||
import se.scalablesolutions.akka.dispatch.MessageInvocation
|
||||
import se.scalablesolutions.akka.util.Logging
|
||||
|
||||
import org.codehaus.aspectwerkz.proxy.Uuid
|
||||
|
|
@ -25,7 +25,7 @@ class TransactionAwareWrapperException(val cause: Throwable, val tx: Option[Tran
|
|||
|
||||
object TransactionManagement {
|
||||
import se.scalablesolutions.akka.Config._
|
||||
val TIME_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-for-completion", 100)
|
||||
val TIME_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-for-completion", 1000)
|
||||
val NR_OF_TIMES_WAITING_FOR_COMPLETION = config.getInt("akka.stm.wait-nr-of-times", 3)
|
||||
val MAX_NR_OF_RETRIES = config.getInt("akka.stm.max-nr-of-retries", 10)
|
||||
val TRANSACTION_ENABLED = new AtomicBoolean(config.getBool("akka.stm.service", false))
|
||||
|
|
@ -72,6 +72,11 @@ trait TransactionManagement extends Logging {
|
|||
println("------------ COULD NOT COMMIT -- WAITING OR TIMEOUT? ---------")
|
||||
//tx.retry
|
||||
} else {
|
||||
println("---------- tryToCommitTransactions ")
|
||||
println("---------- tryToCommitTransactions tx.isTopLevel " + tx.isTopLevel)
|
||||
println("---------- tryToCommitTransactions tx.depth.get " + tx.depth.get)
|
||||
println("---------- tryToCommitTransactions tx.status_? " + tx.status_?)
|
||||
rollback(Some(tx))
|
||||
// continue, try to commit on next received message
|
||||
// FIXME check if TX hase timed out => throw exception
|
||||
}
|
||||
|
|
@ -82,12 +87,17 @@ trait TransactionManagement extends Logging {
|
|||
case None => {} // no tx; nothing to do
|
||||
case Some(tx) =>
|
||||
tx.rollback(uuid)
|
||||
activeTransactions -= tx
|
||||
}
|
||||
|
||||
protected def rollbackForRescheduling(tx: Option[Transaction]) = tx match {
|
||||
case None => {} // no tx; nothing to do
|
||||
case Some(tx) =>
|
||||
tx.rollbackForRescheduling(uuid)
|
||||
protected def setTransaction(transaction: Option[Transaction]) = if (transaction.isDefined) {
|
||||
currentTransaction.set(transaction)
|
||||
setThreadLocalTransaction(transaction.get.transaction)
|
||||
}
|
||||
|
||||
protected def clearTransaction = {
|
||||
currentTransaction.set(None)
|
||||
setThreadLocalTransaction(null)
|
||||
}
|
||||
|
||||
protected def isInExistingTransaction = currentTransaction.get.isDefined
|
||||
|
|
|
|||
|
|
@ -73,11 +73,18 @@ object TransactionalRef {
|
|||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class TransactionalRef[T] extends Transactional {
|
||||
private[this] val ref = new Ref[T]
|
||||
import org.multiverse.utils.TransactionThreadLocal._
|
||||
|
||||
def swap(elem: T) = ref.set(elem)
|
||||
println("---- create TX " + getThreadLocalTransaction)
|
||||
private[this] val ref: Ref[T] = new Ref[T]//Ref.createCommittedRef[T]
|
||||
|
||||
|
||||
def swap(elem: T) = {
|
||||
println("---- swap TX " + getThreadLocalTransaction)
|
||||
ref.set(elem)
|
||||
}
|
||||
def get: Option[T] = {
|
||||
println("---- get TX " + getThreadLocalTransaction)
|
||||
if (ref.isNull) None
|
||||
else Some(ref.get)
|
||||
}
|
||||
|
|
@ -89,8 +96,11 @@ class TransactionalRef[T] extends Transactional {
|
|||
else ref.get
|
||||
}
|
||||
|
||||
def isDefined: Boolean = !ref.isNull
|
||||
|
||||
def isDefined: Boolean = {
|
||||
println("---- isDefined TX " + getThreadLocalTransaction)
|
||||
!ref.isNull
|
||||
}
|
||||
|
||||
def isEmpty: Boolean = ref.isNull
|
||||
|
||||
def map[B](f: T => B): Option[B] = if (isEmpty) None else Some(f(ref.get))
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import junit.framework.TestCase
|
|||
import junit.framework.TestSuite
|
||||
|
||||
import actor.{ActorSpec, RemoteActorSpec, InMemoryActorSpec, SupervisorSpec, RemoteSupervisorSpec,SchedulerSpec}
|
||||
import reactor.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest}
|
||||
import dispatch.{EventBasedSingleThreadDispatcherTest, EventBasedThreadPoolDispatcherTest}
|
||||
|
||||
object AllTest extends TestCase {
|
||||
def suite(): Test = {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent.CountDownLatch
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy
|
||||
import java.util.concurrent.atomic.AtomicBoolean
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ case class FailureOneWay(key: String, value: String, failer: Actor)
|
|||
class InMemStatefulActor extends Actor {
|
||||
timeout = 100000
|
||||
makeTransactionRequired
|
||||
//dispatcher = se.scalablesolutions.akka.reactor.Dispatchers.newThreadBasedDispatcher(this)
|
||||
//dispatcher = se.scalablesolutions.akka.dispatch.Dispatchers.newThreadBasedDispatcher(this)
|
||||
private lazy val mapState: TransactionalMap[String, String] = TransactionalState.newMap[String, String]
|
||||
private lazy val vectorState: TransactionalVector[String] = TransactionalState.newVector[String]
|
||||
private lazy val refState: TransactionalRef[String] = TransactionalState.newRef[String]
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package se.scalablesolutions.akka.reactor
|
||||
package se.scalablesolutions.akka.dispatch
|
||||
|
||||
import java.util.concurrent.CountDownLatch
|
||||
import java.util.concurrent.TimeUnit
|
||||
|
|
|
|||
|
|
@ -7,10 +7,10 @@ package se.scalablesolutions.akka.amqp
|
|||
import com.rabbitmq.client.{AMQP => RabbitMQ, _}
|
||||
import com.rabbitmq.client.ConnectionFactory
|
||||
|
||||
import actor.{OneForOneStrategy, Actor}
|
||||
import config.ScalaConfig._
|
||||
import util.{HashCode, Logging}
|
||||
import serialization.Serializer
|
||||
import se.scalablesolutions.akka.actor.{OneForOneStrategy, Actor}
|
||||
import se.scalablesolutions.akka.config.ScalaConfig._
|
||||
import se.scalablesolutions.akka.util.{HashCode, Logging}
|
||||
import se.scalablesolutions.akka.serialization.Serializer
|
||||
|
||||
import scala.collection.mutable.HashMap
|
||||
|
||||
|
|
@ -21,19 +21,19 @@ import java.util.{Timer, TimerTask}
|
|||
import java.io.IOException
|
||||
|
||||
/**
|
||||
* AMQP Actor API. Implements Client and Endpoint materialized as Actors.
|
||||
* AMQP Actor API. Implements Producer and Consumer materialized as Actors.
|
||||
*
|
||||
* <pre>
|
||||
* val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, Serializer.Java, None, 100)
|
||||
* val endpoint = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, EXCHANGE, ExchangeType.Direct, Serializer.Java, None, 100)
|
||||
*
|
||||
* endpoint ! MessageConsumer(QUEUE, ROUTING_KEY, new Actor() {
|
||||
* endpoint ! MessageConsumerListener(QUEUE, ROUTING_KEY, new Actor() {
|
||||
* def receive: PartialFunction[Any, Unit] = {
|
||||
* case Message(payload, _, _, _, _) => log.debug("Received message: %s", payload)
|
||||
* }
|
||||
* })
|
||||
*
|
||||
* val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100)
|
||||
* client ! Message("Hi", ROUTING_KEY)
|
||||
* val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, EXCHANGE, Serializer.Java, None, None, 100)
|
||||
* producer ! Message("Hi", ROUTING_KEY)
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
|
|
@ -57,10 +57,10 @@ object AMQP extends Actor {
|
|||
new Message(payload, routingKey, false, false, null)
|
||||
}
|
||||
|
||||
case class MessageConsumer(queueName: String, routingKey: String, actor: Actor) {
|
||||
case class MessageConsumerListener(queueName: String, routingKey: String, actor: Actor) {
|
||||
var tag: Option[String] = None
|
||||
|
||||
override def toString(): String = "MessageConsumer[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey + "]"
|
||||
override def toString(): String = "MessageConsumerListener[actor=" + actor + ", queue=" + queueName + ", routingKey=" + routingKey + "]"
|
||||
|
||||
override def hashCode(): Int = synchronized {
|
||||
var result = HashCode.SEED
|
||||
|
|
@ -71,13 +71,13 @@ object AMQP extends Actor {
|
|||
|
||||
override def equals(that: Any): Boolean = synchronized {
|
||||
that != null &&
|
||||
that.isInstanceOf[MessageConsumer] &&
|
||||
that.asInstanceOf[MessageConsumer].queueName== queueName &&
|
||||
that.asInstanceOf[MessageConsumer].routingKey == routingKey
|
||||
that.isInstanceOf[MessageConsumerListener] &&
|
||||
that.asInstanceOf[MessageConsumerListener].queueName== queueName &&
|
||||
that.asInstanceOf[MessageConsumerListener].routingKey == routingKey
|
||||
}
|
||||
}
|
||||
|
||||
case class CancelMessageConsumer(consumer: MessageConsumer)
|
||||
case class CancelMessageConsumerListener(consumer: MessageConsumerListener)
|
||||
case class Reconnect(delay: Long)
|
||||
case class Failure(cause: Throwable)
|
||||
case object Stop
|
||||
|
|
@ -108,7 +108,7 @@ object AMQP extends Actor {
|
|||
}
|
||||
}
|
||||
|
||||
def newClient(
|
||||
def newProducer(
|
||||
config: ConnectionParameters,
|
||||
hostname: String,
|
||||
port: Int,
|
||||
|
|
@ -116,8 +116,8 @@ object AMQP extends Actor {
|
|||
serializer: Serializer,
|
||||
returnListener: Option[ReturnListener],
|
||||
shutdownListener: Option[ShutdownListener],
|
||||
initReconnectDelay: Long): Client = {
|
||||
val client = new Client(
|
||||
initReconnectDelay: Long): Producer = {
|
||||
val producer = new Producer(
|
||||
new ConnectionFactory(config),
|
||||
hostname, port,
|
||||
exchangeName,
|
||||
|
|
@ -125,11 +125,11 @@ object AMQP extends Actor {
|
|||
returnListener,
|
||||
shutdownListener,
|
||||
initReconnectDelay)
|
||||
startLink(client)
|
||||
client
|
||||
startLink(producer)
|
||||
producer
|
||||
}
|
||||
|
||||
def newEndpoint(
|
||||
def newConsumer(
|
||||
config: ConnectionParameters,
|
||||
hostname: String,
|
||||
port: Int,
|
||||
|
|
@ -137,15 +137,21 @@ object AMQP extends Actor {
|
|||
exchangeType: ExchangeType,
|
||||
serializer: Serializer,
|
||||
shutdownListener: Option[ShutdownListener],
|
||||
initReconnectDelay: Long): Endpoint = {
|
||||
val endpoint = new Endpoint(
|
||||
initReconnectDelay: Long,
|
||||
passive: Boolean,
|
||||
durable: Boolean,
|
||||
configurationArguments: Map[String, AnyRef]): Consumer = {
|
||||
val endpoint = new Consumer(
|
||||
new ConnectionFactory(config),
|
||||
hostname, port,
|
||||
exchangeName,
|
||||
exchangeType,
|
||||
serializer,
|
||||
shutdownListener,
|
||||
initReconnectDelay)
|
||||
initReconnectDelay,
|
||||
passive,
|
||||
durable,
|
||||
configurationArguments)
|
||||
startLink(endpoint)
|
||||
endpoint
|
||||
}
|
||||
|
|
@ -162,7 +168,7 @@ object AMQP extends Actor {
|
|||
}
|
||||
|
||||
/**
|
||||
* AMQP client actor.
|
||||
* AMQP producer actor.
|
||||
* Usage:
|
||||
* <pre>
|
||||
* val params = new ConnectionParameters
|
||||
|
|
@ -170,13 +176,13 @@ object AMQP extends Actor {
|
|||
* params.setPassword("obama")
|
||||
* params.setVirtualHost("/")
|
||||
* params.setRequestedHeartbeat(0)
|
||||
* val client = AMQP.newClient(params, "localhost", 5672, "exchangeName", Serializer.Java, None, None, 100)
|
||||
* client ! Message("hi")
|
||||
* val producer = AMQP.newProducer(params, "localhost", 5672, "exchangeName", Serializer.Java, None, None, 100)
|
||||
* producer ! Message("hi")
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class Client private[amqp] (
|
||||
class Producer private[amqp] (
|
||||
val connectionFactory: ConnectionFactory,
|
||||
val hostname: String,
|
||||
val port: Int,
|
||||
|
|
@ -189,14 +195,15 @@ object AMQP extends Actor {
|
|||
|
||||
setupChannel
|
||||
|
||||
log.info("AMQP.Client [%s] is started", toString)
|
||||
log.info("AMQP.Producer [%s] is started", toString)
|
||||
|
||||
def receive: PartialFunction[Any, Unit] = {
|
||||
case message @ Message(payload, routingKey, mandatory, immediate, properties) =>
|
||||
log.debug("Sending message [%s]", message)
|
||||
channel.basicPublish(exchangeName, routingKey, mandatory, immediate, properties, serializer.out(payload))
|
||||
case Stop =>
|
||||
disconnect; stop
|
||||
disconnect
|
||||
stop
|
||||
}
|
||||
|
||||
def setupChannel = {
|
||||
|
|
@ -225,96 +232,109 @@ object AMQP extends Actor {
|
|||
if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
|
||||
}
|
||||
|
||||
override def toString(): String = "AMQP.Client[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + "]"
|
||||
override def toString(): String =
|
||||
"AMQP.Producer[hostname=" + hostname +
|
||||
", port=" + port +
|
||||
", exchange=" + exchangeName + "]"
|
||||
}
|
||||
|
||||
/**
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
*/
|
||||
class Endpoint private[amqp] (
|
||||
class Consumer private[amqp] (
|
||||
val connectionFactory: ConnectionFactory,
|
||||
val hostname: String,
|
||||
val port: Int,
|
||||
exchangeName: String,
|
||||
exchangeType: ExchangeType,
|
||||
serializer: Serializer,
|
||||
shutdownListener: Option[ShutdownListener],
|
||||
val initReconnectDelay: Long)
|
||||
extends FaultTolerantConnectionActor {
|
||||
val exchangeName: String,
|
||||
val exchangeType: ExchangeType,
|
||||
val serializer: Serializer,
|
||||
val shutdownListener: Option[ShutdownListener],
|
||||
val initReconnectDelay: Long,
|
||||
val passive: Boolean,
|
||||
val durable: Boolean,
|
||||
val configurationArguments: Map[java.lang.String, Object])
|
||||
extends FaultTolerantConnectionActor { self: Consumer =>
|
||||
|
||||
faultHandler = Some(OneForOneStrategy(5, 5000))
|
||||
trapExit = true
|
||||
|
||||
val consumers = new HashMap[MessageConsumer, MessageConsumer]
|
||||
val endpoint = this
|
||||
val listeners = new HashMap[MessageConsumerListener, MessageConsumerListener]
|
||||
|
||||
setupChannel
|
||||
|
||||
log.info("AMQP.Endpoint [%s] is started", toString)
|
||||
log.info("AMQP.Consumer [%s] is started", toString)
|
||||
|
||||
def setupChannel = {
|
||||
connection = connectionFactory.newConnection(hostname, port)
|
||||
channel = connection.createChannel
|
||||
channel.exchangeDeclare(exchangeName, exchangeType.toString)
|
||||
consumers.elements.toList.map(_._2).foreach(setupConsumer)
|
||||
channel.exchangeDeclare(exchangeName.toString, exchangeType.toString,
|
||||
passive, durable,
|
||||
configurationArguments.asJava)
|
||||
listeners.elements.toList.map(_._2).foreach(setupConsumer)
|
||||
if (shutdownListener.isDefined) connection.addShutdownListener(shutdownListener.get)
|
||||
}
|
||||
|
||||
def setupConsumer(consumer: MessageConsumer) = {
|
||||
channel.queueDeclare(consumer.queueName)
|
||||
channel.queueBind(consumer.queueName, exchangeName, consumer.routingKey)
|
||||
def setupConsumer(listener: MessageConsumerListener) = {
|
||||
channel.queueDeclare(listener.queueName)
|
||||
channel.queueBind(listener.queueName, exchangeName, listener.routingKey)
|
||||
|
||||
val consumerTag = channel.basicConsume(consumer.queueName, false, new DefaultConsumer(channel) with Logging {
|
||||
val listenerTag = channel.basicConsume(listener.queueName, false, new DefaultConsumer(channel) with Logging {
|
||||
override def handleDelivery(tag: String, envelope: Envelope, properties: RabbitMQ.BasicProperties, payload: Array[Byte]) {
|
||||
try {
|
||||
consumer.actor ! Message(serializer.in(payload, None), envelope.getRoutingKey)
|
||||
listener.actor ! Message(serializer.in(payload, None), envelope.getRoutingKey)
|
||||
channel.basicAck(envelope.getDeliveryTag, false)
|
||||
} catch {
|
||||
case cause => endpoint ! Failure(cause) // pass on and rethrow exception in endpoint actor to trigger restart and reconnect
|
||||
case cause => self ! Failure(cause) // pass on and re-throw exception in endpoint actor to trigger restart and reconnect
|
||||
}
|
||||
}
|
||||
|
||||
override def handleShutdownSignal(consumerTag: String, signal: ShutdownSignalException) = {
|
||||
consumers.elements.toList.map(_._2).find(_.tag == consumerTag) match {
|
||||
case None => log.warning("Could not find message consumer for tag [%s]; can't shut consumer down", consumerTag)
|
||||
case Some(consumer) =>
|
||||
log.warning("Message consumer [%s] is being shutdown by [%s] due to [%s]", consumer, signal.getReference, signal.getReason)
|
||||
endpoint ! CancelMessageConsumer(consumer)
|
||||
override def handleShutdownSignal(listenerTag: String, signal: ShutdownSignalException) = {
|
||||
listeners.elements.toList.map(_._2).find(_.tag == listenerTag) match {
|
||||
case None => log.warning("Could not find message listener for tag [%s]; can't shut listener down", listenerTag)
|
||||
case Some(listener) =>
|
||||
log.warning("Message listener listener [%s] is being shutdown by [%s] due to [%s]", listener, signal.getReference, signal.getReason)
|
||||
self ! CancelMessageConsumerListener(listener)
|
||||
}
|
||||
}
|
||||
})
|
||||
consumer.tag = Some(consumerTag)
|
||||
listener.tag = Some(listenerTag)
|
||||
}
|
||||
|
||||
def receive: PartialFunction[Any, Unit] = {
|
||||
case consumer: MessageConsumer =>
|
||||
startLink(consumer.actor)
|
||||
consumers.put(consumer, consumer)
|
||||
setupConsumer(consumer)
|
||||
log.info("Message consumer is registered [%s]", consumer)
|
||||
case listener: MessageConsumerListener =>
|
||||
startLink(listener.actor)
|
||||
listeners.put(listener, listener)
|
||||
setupConsumer(listener)
|
||||
log.info("Message consumer listener is registered [%s]", listener)
|
||||
|
||||
case CancelMessageConsumer(hash) =>
|
||||
consumers.get(hash) match {
|
||||
case None => log.warning("Can't unregister message consumer [%s]; no such consumer", hash)
|
||||
case Some(consumer) =>
|
||||
consumers - consumer
|
||||
consumer.tag match {
|
||||
case None => log.warning("Can't unregister message consumer [%s]; no consumer tag", consumer)
|
||||
case CancelMessageConsumerListener(hash) =>
|
||||
listeners.get(hash) match {
|
||||
case None => log.warning("Can't unregister message consumer listener [%s]; no such listener", hash)
|
||||
case Some(listener) =>
|
||||
listeners - listener
|
||||
listener.tag match {
|
||||
case None => log.warning("Can't unregister message consumer listener [%s]; no listener tag", listener)
|
||||
case Some(tag) =>
|
||||
channel.basicCancel(tag)
|
||||
unlink(consumer.actor)
|
||||
consumer.actor.stop
|
||||
log.info("Message consumer is cancelled and shut down [%s]", consumer)
|
||||
unlink(listener.actor)
|
||||
listener.actor.stop
|
||||
log.info("Message consumer is cancelled and shut down [%s]", listener)
|
||||
}
|
||||
}
|
||||
|
||||
case Reconnect(delay) => reconnect(delay)
|
||||
case Failure(cause) => log.error(cause, ""); throw cause
|
||||
case Stop => disconnect; stop
|
||||
case unknown => throw new IllegalArgumentException("Unknown message [" + unknown + "] to AMQP Endpoint [" + this + "]")
|
||||
case unknown => throw new IllegalArgumentException("Unknown message [" + unknown + "] to AMQP Consumer [" + this + "]")
|
||||
}
|
||||
|
||||
override def toString(): String = "AMQP.Endpoint[hostname=" + hostname + ", port=" + port + ", exchange=" + exchangeName + ", type=" + exchangeType + "]"
|
||||
override def toString(): String =
|
||||
"AMQP.Consumer[hostname=" + hostname +
|
||||
", port=" + port +
|
||||
", exchange=" + exchangeName +
|
||||
", type=" + exchangeType +
|
||||
", passive=" + passive +
|
||||
", durable=" + durable + "]"
|
||||
}
|
||||
|
||||
trait FaultTolerantConnectionActor extends Actor {
|
||||
|
|
|
|||
|
|
@ -4,9 +4,10 @@
|
|||
|
||||
package se.scalablesolutions.akka.amqp
|
||||
|
||||
import akka.serialization.Serializer
|
||||
import se.scalablesolutions.akka.serialization.Serializer
|
||||
import se.scalablesolutions.akka.actor.Actor
|
||||
|
||||
import com.rabbitmq.client.ConnectionParameters
|
||||
import actor.Actor
|
||||
|
||||
object ExampleSession {
|
||||
import AMQP._
|
||||
|
|
@ -29,29 +30,29 @@ object ExampleSession {
|
|||
}
|
||||
|
||||
def direct = {
|
||||
val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100)
|
||||
endpoint ! MessageConsumer("@george_bush", "direct", new Actor() {
|
||||
val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, IM, ExchangeType.Direct, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
|
||||
consumer ! MessageConsumerListener("@george_bush", "direct", new Actor() {
|
||||
def receive: PartialFunction[Any, Unit] = {
|
||||
case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
|
||||
}
|
||||
})
|
||||
val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
|
||||
client ! Message("@jonas_boner: You sucked!!", "direct")
|
||||
val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, IM, SERIALIZER, None, None, 100)
|
||||
producer ! Message("@jonas_boner: You sucked!!", "direct")
|
||||
}
|
||||
|
||||
def fanout = {
|
||||
val endpoint = AMQP.newEndpoint(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100)
|
||||
endpoint ! MessageConsumer("@george_bush", "", new Actor() {
|
||||
val consumer = AMQP.newConsumer(CONFIG, HOSTNAME, PORT, CHAT, ExchangeType.Fanout, SERIALIZER, None, 100, false, false, Map[String, AnyRef]())
|
||||
consumer ! MessageConsumerListener("@george_bush", "", new Actor() {
|
||||
def receive: PartialFunction[Any, Unit] = {
|
||||
case Message(payload, _, _, _, _) => log.info("@george_bush received message from: %s", payload)
|
||||
}
|
||||
})
|
||||
endpoint ! MessageConsumer("@barack_obama", "", new Actor() {
|
||||
consumer ! MessageConsumerListener("@barack_obama", "", new Actor() {
|
||||
def receive: PartialFunction[Any, Unit] = {
|
||||
case Message(payload, _, _, _, _) => log.info("@barack_obama received message from: %s", payload)
|
||||
}
|
||||
})
|
||||
val client = AMQP.newClient(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
|
||||
client ! Message("@jonas_boner: I'm going surfing", "")
|
||||
val producer = AMQP.newProducer(CONFIG, HOSTNAME, PORT, CHAT, SERIALIZER, None, None, 100)
|
||||
producer ! Message("@jonas_boner: I'm going surfing", "")
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,7 @@ import com.google.inject.Scopes;
|
|||
import junit.framework.TestCase;
|
||||
|
||||
import se.scalablesolutions.akka.Config;
|
||||
import se.scalablesolutions.akka.reactor.EventBasedThreadPoolDispatcher;
|
||||
import se.scalablesolutions.akka.dispatch.EventBasedThreadPoolDispatcher;
|
||||
import static se.scalablesolutions.akka.config.JavaConfig.*;
|
||||
|
||||
import java.util.concurrent.ThreadPoolExecutor;
|
||||
|
|
@ -104,7 +104,7 @@ public class ActiveObjectGuiceConfiguratorTest extends TestCase {
|
|||
try {
|
||||
foo.longRunning();
|
||||
fail("exception should have been thrown");
|
||||
} catch (se.scalablesolutions.akka.reactor.FutureTimeoutException e) {
|
||||
} catch (se.scalablesolutions.akka.dispatch.FutureTimeoutException e) {
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,8 @@ public class InMemStateful {
|
|||
mapState.put(key, msg);
|
||||
vectorState.add(msg);
|
||||
refState.swap(msg);
|
||||
nested.success(key, msg);
|
||||
nested.success(key, msg);
|
||||
System.out.println("--- after success ");
|
||||
}
|
||||
|
||||
public String failure(String key, String msg, InMemFailer failer) {
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@
|
|||
|
||||
package se.scalablesolutions.akka.rest
|
||||
|
||||
import config.ConfiguratorRepository
|
||||
import util.Logging
|
||||
import se.scalablesolutions.akka.config.ConfiguratorRepository
|
||||
import se.scalablesolutions.akka.util.Logging
|
||||
|
||||
import com.sun.jersey.api.core.ResourceConfig
|
||||
import com.sun.jersey.spi.container.servlet.ServletContainer
|
||||
|
|
|
|||
|
|
@ -29,6 +29,7 @@ object CassandraStorage extends MapStorage
|
|||
val VECTOR_COLUMN_PARENT = new ColumnParent("vector", null)
|
||||
val REF_COLUMN_PARENT = new ColumnParent("ref", null)
|
||||
val REF_KEY = "item".getBytes("UTF-8")
|
||||
val EMPTY_BYTE_ARRAY = new Array[Byte](0)
|
||||
|
||||
val CASSANDRA_SERVER_HOSTNAME = config.getString("akka.storage.cassandra.hostname", "127.0.0.1")
|
||||
val CASSANDRA_SERVER_PORT = config.getInt("akka.storage.cassandra.port", 9160)
|
||||
|
|
@ -126,7 +127,7 @@ object CassandraStorage extends MapStorage
|
|||
val column: Option[ColumnOrSuperColumn] = sessions.withSession {
|
||||
_ | (name, new ColumnPath(VECTOR_COLUMN_PARENT.getColumn_family, null, intToBytes(index)))
|
||||
}
|
||||
if (column.isDefined) serializer.in(column.get.getColumn.value, None)
|
||||
if (column.isDefined) serializer.in(column.get.column.value, None)
|
||||
else throw new NoSuchElementException("No element for vector [" + name + "] and index [" + index + "]")
|
||||
}
|
||||
|
||||
|
|
@ -191,17 +192,17 @@ object CassandraStorage extends MapStorage
|
|||
}
|
||||
|
||||
def getMapStorageFor(name: String): List[Tuple2[AnyRef, AnyRef]] = {
|
||||
throw new UnsupportedOperationException
|
||||
/*
|
||||
val columns = server.get_columns_since(name, MAP_COLUMN_FAMILY, -1)
|
||||
.toArray.toList.asInstanceOf[List[org.apache.cassandra.service.column_t]]
|
||||
for {
|
||||
column <- columns
|
||||
col = (column.columnName, column.value)
|
||||
} yield col
|
||||
*/
|
||||
val size = getMapStorageSizeFor(name)
|
||||
sessions.withSession { session =>
|
||||
val columns = session / (name, MAP_COLUMN_PARENT, EMPTY_BYTE_ARRAY, EMPTY_BYTE_ARRAY, true, size, CONSISTENCY_LEVEL)
|
||||
for {
|
||||
columnOrSuperColumn <- columns
|
||||
entry = (serializer.in(columnOrSuperColumn.column.name, None), serializer.in(columnOrSuperColumn.column.value, None))
|
||||
} yield entry
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
def getMapStorageSizeFor(name: String): Int = {
|
||||
sessions.withSession {
|
||||
_ |# (name, MAP_COLUMN_PARENT)
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
|
|||
} catch { case e: Exception => false }
|
||||
|
||||
override def size: Int = try {
|
||||
storage.getMapStorageSizeFor(uuid) + newAndUpdatedEntries.size
|
||||
storage.getMapStorageSizeFor(uuid)
|
||||
} catch { case e: Exception => 0 }
|
||||
|
||||
override def get(key: AnyRef): Option[AnyRef] = {
|
||||
|
|
@ -137,7 +137,7 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
|
|||
private var elements = newAndUpdatedEntries.toList ::: originalList.reverse
|
||||
override def next: Tuple2[AnyRef, AnyRef]= synchronized {
|
||||
val element = elements.head
|
||||
elements = elements.tail
|
||||
elements = elements.tail
|
||||
element
|
||||
}
|
||||
override def hasNext: Boolean = synchronized { !elements.isEmpty }
|
||||
|
|
@ -151,7 +151,9 @@ trait PersistentMap extends scala.collection.mutable.Map[AnyRef, AnyRef] with Tr
|
|||
}
|
||||
|
||||
/**
|
||||
* Implements a persistent transactional map based on the Cassandra distributed P2P key-value storage.
|
||||
* Implements a persistent transaction
|
||||
|
||||
al map based on the Cassandra distributed P2P key-value storage.
|
||||
*
|
||||
* @author <a href="http://debasishg.blogspot.com">Debasish Ghosh</a>
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import java.util.concurrent.locks.ReentrantLock
|
|||
import java.util.concurrent.TimeUnit
|
||||
|
||||
import junit.framework.TestCase
|
||||
import reactor._
|
||||
import dispatch._
|
||||
|
||||
import org.junit.{Test, Before}
|
||||
import org.junit.Assert._
|
||||
|
|
|
|||
|
|
@ -1,11 +1,11 @@
|
|||
package se.scalablesolutions.akka.state
|
||||
|
||||
import akka.actor.Actor
|
||||
import se.scalablesolutions.akka.actor.Actor
|
||||
import junit.framework.TestCase
|
||||
import org.junit.{Test, Before}
|
||||
import org.junit.Assert._
|
||||
import dispatch.json._
|
||||
import dispatch.json.Js._
|
||||
import _root_.dispatch.json._
|
||||
import _root_.dispatch.json.Js._
|
||||
|
||||
/**
|
||||
* A persistent actor based on MongoDB storage.
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ import junit.framework.TestCase
|
|||
|
||||
import org.junit.{Test, Before}
|
||||
import org.junit.Assert._
|
||||
import dispatch.json._
|
||||
import dispatch.json.Js._
|
||||
import _root_.dispatch.json._
|
||||
import _root_.dispatch.json.Js._
|
||||
|
||||
class MongoStorageSpec extends TestCase {
|
||||
|
||||
|
|
@ -81,8 +81,6 @@ class MongoStorageSpec extends TestCase {
|
|||
val JsString(str) = MongoStorage.getVectorStorageEntryFor("U-A1", 0).asInstanceOf[JsString]
|
||||
assertEquals("debasish", str)
|
||||
|
||||
import dispatch.json.Js._
|
||||
|
||||
val l = MongoStorage.getVectorStorageEntryFor("U-A1", 1).asInstanceOf[JsValue]
|
||||
val num_list = list ! num
|
||||
val num_list(l0) = l
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package se.scalablesolutions.akka.stm;
|
||||
|
||||
import org.multiverse.api.Stm;
|
||||
import static org.multiverse.api.StmUtils.retry;
|
||||
import org.multiverse.api.Transaction;
|
||||
import org.multiverse.api.exceptions.LoadUncommittedException;
|
||||
|
|
@ -7,6 +8,8 @@ import org.multiverse.api.exceptions.ReadonlyException;
|
|||
import org.multiverse.datastructures.refs.ManagedRef;
|
||||
import org.multiverse.stms.alpha.*;
|
||||
import org.multiverse.stms.alpha.mixins.FastAtomicObjectMixin;
|
||||
import org.multiverse.templates.AtomicTemplate;
|
||||
import org.multiverse.utils.GlobalStmInstance;
|
||||
import static org.multiverse.utils.TransactionThreadLocal.getThreadLocalTransaction;
|
||||
|
||||
import static java.lang.String.format;
|
||||
|
|
@ -25,6 +28,63 @@ public final class Ref<E> extends FastAtomicObjectMixin implements ManagedRef<E>
|
|||
final public static class NoTransactionInScopeException extends RuntimeException {
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a committed ref with a null value using the Stm in the
|
||||
* {@link GlobalStmInstance}.
|
||||
*
|
||||
* @return the created ref.
|
||||
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
|
||||
*/
|
||||
public static <E> Ref<E> createCommittedRef() {
|
||||
return createCommittedRef(GlobalStmInstance.get(), null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a committed ref with a null value.
|
||||
*
|
||||
* @param stm the {@Stm} used for committing the ref.
|
||||
* @return the created ref.
|
||||
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
|
||||
*/
|
||||
public static <E> Ref<E> createCommittedRef(Stm stm) {
|
||||
return createCommittedRef(stm, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a committed ref with the given value using the Stm in the
|
||||
* {@link GlobalStmInstance}.
|
||||
*
|
||||
* @param value the initial value of the Ref.
|
||||
* @return the created ref.
|
||||
* @see #createCommittedRef(org.multiverse.api.Stm, Object)
|
||||
*/
|
||||
public static <E> Ref<E> createCommittedRef(E value) {
|
||||
return createCommittedRef(GlobalStmInstance.get(), value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a committed ref with the given value and using the given Stm.
|
||||
* <p/>
|
||||
* This factory method should be called when one doesn't want to lift on the current
|
||||
* transaction, but you want something to be committed whatever happens. In the future
|
||||
* behavior will be added propagation levels. But for the time being this is the 'expect_new'
|
||||
* implementation of this propagation level.
|
||||
* <p/>
|
||||
* If the value is an atomicobject or has a reference to it (perhaps indirectly), and
|
||||
* the transaction this atomicobject is created in is aborted (or hasn't committed) yet,
|
||||
* you will get the dreaded {@link org.multiverse.api.exceptions.LoadUncommittedException}.
|
||||
*
|
||||
* @param stm the {@Stm} used for committing the ref.
|
||||
* @param value the initial value of the ref. The value is allowed to be null.
|
||||
* @return the created ref.
|
||||
*/
|
||||
public static <E> Ref<E> createCommittedRef(Stm stm, E value) {
|
||||
Transaction t = stm.startUpdateTransaction("createRef");
|
||||
Ref<E> ref = new Ref<E>(t, value);
|
||||
t.commit();
|
||||
return ref;
|
||||
}
|
||||
|
||||
public Ref() {
|
||||
Transaction tx = getThreadLocalTransaction();
|
||||
if (tx == null) throw new NoTransactionInScopeException();
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ package se.scalablesolutions.akka
|
|||
|
||||
import util.Logging
|
||||
|
||||
import net.lag.configgy.{Config => ConfiggyConfig, Configgy, ParseException}
|
||||
import net.lag.configgy.{Configgy, ParseException}
|
||||
|
||||
/**
|
||||
* @author <a href="http://jonasboner.com">Jonas Bonér</a>
|
||||
|
|
@ -31,6 +31,14 @@ object Config extends Logging {
|
|||
} catch {
|
||||
case e: ParseException => throw new IllegalStateException("'akka.conf' config file can not be found in [" + HOME + "/config/akka.conf] - aborting. Either add it in the 'config' directory or add it to the classpath.")
|
||||
}
|
||||
} else if (System.getProperty("akka.config", "") != "") {
|
||||
val configFile = System.getProperty("akka.config", "")
|
||||
try {
|
||||
Configgy.configure(configFile)
|
||||
log.info("Config loaded from -Dakka.config=%s", configFile)
|
||||
} catch {
|
||||
case e: ParseException => throw new IllegalStateException("Config could not be loaded from -Dakka.config=" + configFile)
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
Configgy.configureFromResource("akka.conf", getClass.getClassLoader)
|
||||
|
|
|
|||
11
akka.ipr
11
akka.ipr
|
|
@ -776,17 +776,6 @@
|
|||
<root url="jar://$MAVEN_REPOSITORY$/com/mongodb/mongo/0.6/mongo-0.6-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
<library name="Maven: org.apache.cassandra:cassandra:0.4.0-trunk">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk.jar!/" />
|
||||
</CLASSES>
|
||||
<JAVADOC>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk-javadoc.jar!/" />
|
||||
</JAVADOC>
|
||||
<SOURCES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/org/apache/cassandra/cassandra/0.4.0-trunk/cassandra-0.4.0-trunk-sources.jar!/" />
|
||||
</SOURCES>
|
||||
</library>
|
||||
<library name="Maven: com.facebook:thrift:1.0">
|
||||
<CLASSES>
|
||||
<root url="jar://$MAVEN_REPOSITORY$/com/facebook/thrift/1.0/thrift-1.0.jar!/" />
|
||||
|
|
|
|||
430
akka.iws
430
akka.iws
|
|
@ -3,21 +3,41 @@
|
|||
<component name="ChangeListManager" verified="true">
|
||||
<list default="true" readonly="true" id="188c966f-a83c-4d3a-9128-54d5a2947a12" name="Default" comment="">
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/config/akka-reference.conf" afterPath="$PROJECT_DIR$/config/akka-reference.conf" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" afterPath="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-amqp/src/main/scala/ExampleSession.scala" afterPath="$PROJECT_DIR$/akka-amqp/src/main/scala/ExampleSession.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.ipr" afterPath="$PROJECT_DIR$/akka.ipr" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/config/ActiveObjectGuiceConfigurator.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionalState.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/config/Config.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/config/Config.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/PersistentState.scala" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/ThreadBasedDispatcher.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" afterPath="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteClient.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteClient.scala" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/main/scala/CassandraStorage.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-util/src/main/scala/Config.scala" afterPath="$PROJECT_DIR$/akka-util/src/main/scala/Config.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" afterPath="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar" afterPath="$PROJECT_DIR$/embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" afterPath="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka.iws" afterPath="$PROJECT_DIR$/akka.iws" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/MessageDispatcherBase.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" afterPath="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
|
||||
<change type="DELETED" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Dispatchers.scala" afterPath="" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" afterPath="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" />
|
||||
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" afterPath="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
|
||||
</list>
|
||||
<ignored path="akka.iws" />
|
||||
|
|
@ -37,6 +57,34 @@
|
|||
<disable_hints />
|
||||
</component>
|
||||
<component name="DebuggerManager">
|
||||
<line_breakpoints>
|
||||
<breakpoint url="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" line="53" class="se.scalablesolutions.akka.api.InMemStatefulNested" package="se.scalablesolutions.akka.api">
|
||||
<option name="ENABLED" value="true" />
|
||||
<option name="LOG_ENABLED" value="false" />
|
||||
<option name="LOG_EXPRESSION_ENABLED" value="false" />
|
||||
<option name="SUSPEND_POLICY" value="SuspendAll" />
|
||||
<option name="COUNT_FILTER_ENABLED" value="false" />
|
||||
<option name="COUNT_FILTER" value="0" />
|
||||
<option name="CONDITION_ENABLED" value="false" />
|
||||
<option name="CLASS_FILTERS_ENABLED" value="false" />
|
||||
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
|
||||
<option name="CONDITION" value="" />
|
||||
<option name="LOG_MESSAGE" value="" />
|
||||
</breakpoint>
|
||||
<breakpoint url="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStateful.java" line="55" class="se.scalablesolutions.akka.api.InMemStateful" package="se.scalablesolutions.akka.api">
|
||||
<option name="ENABLED" value="true" />
|
||||
<option name="LOG_ENABLED" value="false" />
|
||||
<option name="LOG_EXPRESSION_ENABLED" value="false" />
|
||||
<option name="SUSPEND_POLICY" value="SuspendAll" />
|
||||
<option name="COUNT_FILTER_ENABLED" value="false" />
|
||||
<option name="COUNT_FILTER" value="0" />
|
||||
<option name="CONDITION_ENABLED" value="false" />
|
||||
<option name="CLASS_FILTERS_ENABLED" value="false" />
|
||||
<option name="INSTANCE_FILTERS_ENABLED" value="false" />
|
||||
<option name="CONDITION" value="" />
|
||||
<option name="LOG_MESSAGE" value="" />
|
||||
</breakpoint>
|
||||
</line_breakpoints>
|
||||
<breakpoint_any>
|
||||
<breakpoint>
|
||||
<option name="NOTIFY_CAUGHT" value="true" />
|
||||
|
|
@ -78,82 +126,37 @@
|
|||
<component name="FileColors" enabled="false" enabledForTabs="false" />
|
||||
<component name="FileEditorManager">
|
||||
<leaf>
|
||||
<file leaf-file-name="Actor.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
|
||||
<file leaf-file-name="AMQP.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="111" column="36" selection-start="4409" selection-end="4409" vertical-scroll-proportion="0.0">
|
||||
<state line="295" column="18" selection-start="10898" selection-end="10898" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="RemoteServer.scala" pinned="false" current="true" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
|
||||
<file leaf-file-name="Ref.java" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="2" column="19" selection-start="49" selection-end="49" vertical-scroll-proportion="0.015429122">
|
||||
<state line="4" column="43" selection-start="158" selection-end="158" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="TransactionManagement.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
|
||||
<file leaf-file-name="MongoStorageSpec.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="87" column="30" selection-start="3169" selection-end="3169" vertical-scroll-proportion="0.0">
|
||||
<state line="6" column="22" selection-start="146" selection-end="154" vertical-scroll-proportion="-4.3846154">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Scheduler.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Scheduler.scala">
|
||||
<file leaf-file-name="AkkaServlet.scala" pinned="false" current="true" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="42" column="25" selection-start="1494" selection-end="1494" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Transaction.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="126" column="0" selection-start="4172" selection-end="4172" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="Future.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="59" column="50" selection-start="1822" selection-end="1822" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="InMemoryActorSpec.scala" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="111" column="6" selection-start="3960" selection-end="3960" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="InMemoryStateTest.java" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="20" column="23" selection-start="533" selection-end="533" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="InMemNestedStateTest.java" pinned="false" current="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="40" column="14" selection-start="1523" selection-end="1523" vertical-scroll-proportion="0.0">
|
||||
<state line="41" column="70" selection-start="1514" selection-end="1514" vertical-scroll-proportion="1.3117155">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
@ -174,22 +177,22 @@
|
|||
<component name="IdeDocumentHistory">
|
||||
<option name="changedFiles">
|
||||
<list>
|
||||
<option value="$PROJECT_DIR$/config/storage-conf.xml" />
|
||||
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemStatefulNested.java" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedSingleThreadDispatcher.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/EventBasedThreadPoolDispatcher.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Vector.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Reactor.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java" />
|
||||
<option value="$PROJECT_DIR$/akka-persistence/logs/akka.log" />
|
||||
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java" />
|
||||
<option value="$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala" />
|
||||
<option value="$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
|
|
@ -245,6 +248,9 @@
|
|||
<sortByType />
|
||||
</navigator>
|
||||
<panes>
|
||||
<pane id="PackagesPane">
|
||||
<subPane />
|
||||
</pane>
|
||||
<pane id="Scope">
|
||||
<subPane subId="Problems">
|
||||
<PATH>
|
||||
|
|
@ -272,10 +278,64 @@
|
|||
</subPane>
|
||||
</pane>
|
||||
<pane id="ProjectPane">
|
||||
<subPane />
|
||||
</pane>
|
||||
<pane id="PackagesPane">
|
||||
<subPane />
|
||||
<subPane>
|
||||
<PATH>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
<PATH>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
<PATH>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka-amqp" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
<PATH>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="akka-amqp" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="src" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="main" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="scala" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
</subPane>
|
||||
</pane>
|
||||
<pane id="Favorites" />
|
||||
</panes>
|
||||
|
|
@ -300,7 +360,7 @@
|
|||
<property name="project.structure.side.proportion" value="0.2" />
|
||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeWidth0" value="124" />
|
||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder3" value="3" />
|
||||
<property name="options.lastSelected" value="preferences.sourceCode.General" />
|
||||
<property name="options.lastSelected" value="reference.settingsdialog.IDE.editor.colors.Font" />
|
||||
<property name="GoToClass.toSaveIncludeLibraries" value="false" />
|
||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_treeOrder0" value="0" />
|
||||
<property name="RunManagerConfig.showSettingsBeforeRunnig" value="false" />
|
||||
|
|
@ -315,7 +375,7 @@
|
|||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatWidth1" value="166" />
|
||||
<property name="FileHistory.git4idea.history.GitHistoryProvider_flatOrder1" value="1" />
|
||||
</component>
|
||||
<component name="RunManager" selected="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess">
|
||||
<component name="RunManager" selected="JUnit.InMemNestedStateTest">
|
||||
<configuration default="false" name="InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
|
||||
|
|
@ -349,6 +409,39 @@
|
|||
<option name="Make" enabled="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="false" name="InMemNestedStateTest.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" type="JUnit" factoryName="JUnit" temporary="true" enabled="false" merge="false" sample_coverage="true" runner="emma">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="se.scalablesolutions.akka.api.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
<module name="akka-fun-test-java" />
|
||||
<option name="ALTERNATIVE_JRE_PATH_ENABLED" value="false" />
|
||||
<option name="ALTERNATIVE_JRE_PATH" value="" />
|
||||
<option name="PACKAGE_NAME" value="se.scalablesolutions.akka.api" />
|
||||
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" />
|
||||
<option name="METHOD_NAME" value="testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
|
||||
<option name="TEST_OBJECT" value="method" />
|
||||
<option name="VM_PARAMETERS" value="" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
|
||||
<option name="ENV_VARIABLES" />
|
||||
<option name="PASS_PARENT_ENVS" value="true" />
|
||||
<option name="TEST_SEARCH_SCOPE">
|
||||
<value defaultName="moduleWithDependencies" />
|
||||
</option>
|
||||
<envs />
|
||||
<RunnerSettings RunnerId="Debug">
|
||||
<option name="DEBUG_PORT" value="65130" />
|
||||
<option name="TRANSPORT" value="0" />
|
||||
<option name="LOCAL" value="true" />
|
||||
</RunnerSettings>
|
||||
<RunnerSettings RunnerId="Run" />
|
||||
<ConfigurationWrapper RunnerId="Debug" />
|
||||
<ConfigurationWrapper RunnerId="Run" />
|
||||
<method>
|
||||
<option name="Make" enabled="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<configuration default="true" type="Remote" factoryName="Remote">
|
||||
<option name="USE_SOCKET_TRANSPORT" value="true" />
|
||||
<option name="SERVER_MODE" value="false" />
|
||||
|
|
@ -585,7 +678,7 @@
|
|||
<option name="MAIN_CLASS_NAME" value="se.scalablesolutions.akka.api.InMemNestedStateTest" />
|
||||
<option name="METHOD_NAME" value="" />
|
||||
<option name="TEST_OBJECT" value="class" />
|
||||
<option name="VM_PARAMETERS" value="" />
|
||||
<option name="VM_PARAMETERS" value="-Dakka.config=./config/akka.conf" />
|
||||
<option name="PARAMETERS" value="" />
|
||||
<option name="WORKING_DIRECTORY" value="file://$PROJECT_DIR$" />
|
||||
<option name="ENV_VARIABLES" />
|
||||
|
|
@ -606,12 +699,13 @@
|
|||
<option name="Make" enabled="false" />
|
||||
</method>
|
||||
</configuration>
|
||||
<list size="5">
|
||||
<list size="6">
|
||||
<item index="0" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testMapShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
|
||||
<item index="1" class="java.lang.String" itemvalue="JUnit.RemoteInMemoryStateTest" />
|
||||
<item index="2" class="java.lang.String" itemvalue="JUnit.InMemoryActorSpec" />
|
||||
<item index="3" class="java.lang.String" itemvalue="JUnit.InMemoryStateTest" />
|
||||
<item index="4" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest" />
|
||||
<item index="5" class="java.lang.String" itemvalue="JUnit.InMemNestedStateTest.testRefShouldNotRollbackStateForStatefulServerInCaseOfSuccess" />
|
||||
</list>
|
||||
<configuration name="<template>" type="WebApp" default="true" selected="false">
|
||||
<Host>localhost</Host>
|
||||
|
|
@ -652,29 +746,29 @@
|
|||
</option>
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="4" y="22" width="1916" height="1178" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<frame x="4" y="22" width="1436" height="878" extended-state="6" />
|
||||
<editor active="false" />
|
||||
<layout>
|
||||
<window_info id="Maven Projects" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="3" side_tool="false" />
|
||||
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="8" side_tool="false" />
|
||||
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
|
||||
<window_info id="IDEtalk" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="5" side_tool="false" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.63745385" sideWeight="0.5" order="2" side_tool="false" />
|
||||
<window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="2" side_tool="true" />
|
||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" />
|
||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
|
||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18595926" sideWeight="0.51291513" order="0" side_tool="false" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4801444" sideWeight="0.5" order="3" side_tool="false" />
|
||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.18542568" sideWeight="0.6645408" order="0" side_tool="false" />
|
||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29209185" sideWeight="0.5" order="1" side_tool="false" />
|
||||
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="true" />
|
||||
<window_info id="Messages" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.3265306" sideWeight="0.5" order="12" side_tool="false" />
|
||||
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
|
||||
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
|
||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
|
||||
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="8" side_tool="false" />
|
||||
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.7397959" sideWeight="0.5" order="2" side_tool="false" />
|
||||
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.47959185" sideWeight="0.5" order="3" side_tool="false" />
|
||||
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" />
|
||||
<window_info id="IDEtalk Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="9" side_tool="false" />
|
||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32908162" sideWeight="0.5" order="11" side_tool="false" />
|
||||
<window_info id="Web Preview" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="10" side_tool="false" />
|
||||
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" side_tool="false" />
|
||||
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.29335794" sideWeight="0.5" order="1" side_tool="false" />
|
||||
<window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.32749078" sideWeight="0.5" order="12" side_tool="false" />
|
||||
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" />
|
||||
<window_info id="Dependency Viewer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" />
|
||||
<window_info id="Palette" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="4" side_tool="false" />
|
||||
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="1" side_tool="false" />
|
||||
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" />
|
||||
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" />
|
||||
</layout>
|
||||
|
|
@ -711,86 +805,116 @@
|
|||
<option name="FILTER_TARGETS" value="false" />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="118" column="0" selection-start="4515" selection-end="4515" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="159" column="0" selection-start="6245" selection-end="6245" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="12" column="50" selection-start="445" selection-end="445" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-samples-java/src/main/java/sample/java/SimpleService.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="12" column="34" selection-start="307" selection-end="307" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5-sources.jar!/scala/Option.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="38" column="0" selection-start="1292" selection-end="1292" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="jar://$MAVEN_REPOSITORY$/org/scala-lang/scala-library/2.7.5/scala-library-2.7.5.jar!/scala/Some.class">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/AllTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Actor.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="111" column="36" selection-start="4409" selection-end="4409" vertical-scroll-proportion="0.0">
|
||||
<state line="8" column="33" selection-start="173" selection-end="173" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/TransactionManagement.scala">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/AllTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="87" column="30" selection-start="3169" selection-end="3169" vertical-scroll-proportion="0.0" />
|
||||
<state line="7" column="7" selection-start="249" selection-end="249" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/Scheduler.scala">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedSingleThreadDispatcherTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="42" column="25" selection-start="1494" selection-end="1494" vertical-scroll-proportion="0.0" />
|
||||
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/stm/Transaction.scala">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/EventBasedThreadPoolDispatcherTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="126" column="0" selection-start="4172" selection-end="4172" vertical-scroll-proportion="0.0" />
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/reactor/Future.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="59" column="50" selection-start="1822" selection-end="1822" vertical-scroll-proportion="0.0" />
|
||||
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/InMemoryActorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="111" column="6" selection-start="3960" selection-end="3960" vertical-scroll-proportion="0.0" />
|
||||
<state line="28" column="43" selection-start="995" selection-end="995" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemoryStateTest.java">
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/test/scala/ThreadBasedDispatcherTest.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="20" column="23" selection-start="533" selection-end="533" vertical-scroll-proportion="0.0" />
|
||||
<state line="0" column="34" selection-start="34" selection-end="34" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/InMemNestedStateTest.java">
|
||||
<entry file="file://$PROJECT_DIR$/akka-fun-test-java/src/test/java/se/scalablesolutions/akka/api/ActiveObjectGuiceConfiguratorTest.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="40" column="14" selection-start="1523" selection-end="1523" vertical-scroll-proportion="0.0" />
|
||||
<state line="106" column="39" selection-start="3502" selection-end="3502" vertical-scroll-proportion="0.0">
|
||||
<folding>
|
||||
<element signature="imports" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/logs/akka.log">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="58" column="64" selection-start="6570" selection-end="6570" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/CassandraPersistentActorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="7" column="7" selection-start="190" selection-end="190" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/actor/ActiveObject.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="57" column="75" selection-start="2514" selection-end="2514" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-actors/src/main/scala/nio/RemoteServer.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="2" column="19" selection-start="49" selection-end="49" vertical-scroll-proportion="0.015429122">
|
||||
<state line="148" column="6" selection-start="6208" selection-end="6208" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoPersistentActorSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="34" column="44" selection-start="1224" selection-end="1224" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-amqp/src/main/scala/AMQP.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="295" column="18" selection-start="10898" selection-end="10898" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-util-java/src/main/java/se/scalablesolutions/akka/stm/Ref.java">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="4" column="43" selection-start="158" selection-end="158" vertical-scroll-proportion="0.0">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-persistence/src/test/scala/MongoStorageSpec.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="6" column="22" selection-start="146" selection-end="154" vertical-scroll-proportion="-4.3846154">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/akka-kernel/src/main/scala/AkkaServlet.scala">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state line="41" column="70" selection-start="1514" selection-end="1514" vertical-scroll-proportion="1.3117155">
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
|
|
|
|||
|
|
@ -19,7 +19,8 @@
|
|||
|
||||
# FQN to the class doing initial active object/actor
|
||||
# supervisor bootstrap, should be defined in default constructor
|
||||
boot = ["sample.java.Boot", "sample.scala.Boot", "sample.secure.Boot"]
|
||||
#boot = ["sample.java.Boot", "sample.scala.Boot", "sample.secure.Boot"]
|
||||
boot = ["training.ships.akka_persistence.Boot"]
|
||||
|
||||
<actor>
|
||||
timeout = 5000 # default timeout for future based invocations
|
||||
|
|
@ -30,7 +31,7 @@
|
|||
service = on
|
||||
restart-on-collision = off # (not implemented yet) if 'on' then it reschedules the transaction,
|
||||
# if 'off' then throws an exception or rollback for user to handle
|
||||
wait-for-completion = 100 # how long time in millis a transaction should be given time to complete when a collision is detected
|
||||
wait-for-completion = 1000 # how long time in millis a transaction should be given time to complete when a collision is detected
|
||||
wait-nr-of-times = 3 # the number of times it should check for completion of a pending transaction upon collision
|
||||
distributed = off # not implemented yet
|
||||
</stm>
|
||||
|
|
@ -57,7 +58,7 @@
|
|||
service = on
|
||||
hostname = "127.0.0.1" # IP address or hostname of one of the Cassandra cluster's seeds
|
||||
port = 9160
|
||||
storage-format = "java" # Options: java, scala-json, java-json, protobuf
|
||||
storage-format = "scala-json" # Options: java, scala-json, java-json, protobuf
|
||||
consistency-level = 1
|
||||
</cassandra>
|
||||
|
||||
|
|
|
|||
BIN
embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar
Executable file → Normal file
BIN
embedded-repo/org/multiverse/multiverse/0.3/multiverse-0.3.jar
Executable file → Normal file
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue