=str #15608 Make sure ExposedPublisher is first
This commit is contained in:
parent
fedde06bec
commit
4be757e492
7 changed files with 47 additions and 13 deletions
|
|
@ -243,7 +243,8 @@ private[akka] abstract class ActorProcessorImpl(val settings: MaterializerSettin
|
||||||
extends Actor
|
extends Actor
|
||||||
with ActorLogging
|
with ActorLogging
|
||||||
with SoftShutdown
|
with SoftShutdown
|
||||||
with Pump {
|
with Pump
|
||||||
|
with Stash {
|
||||||
|
|
||||||
// FIXME: make pump a member
|
// FIXME: make pump a member
|
||||||
protected val primaryInputs: Inputs = new BatchingInputBuffer(settings.initialInputBufferSize, this) {
|
protected val primaryInputs: Inputs = new BatchingInputBuffer(settings.initialInputBufferSize, this) {
|
||||||
|
|
@ -258,7 +259,19 @@ private[akka] abstract class ActorProcessorImpl(val settings: MaterializerSettin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive = primaryInputs.subreceive orElse primaryOutputs.subreceive
|
/**
|
||||||
|
* Subclass may override [[#activeReceive]]
|
||||||
|
*/
|
||||||
|
final override def receive = {
|
||||||
|
// FIXME using Stash mailbox is not the best for performance, we probably want a better solution to this
|
||||||
|
case ep: ExposedPublisher ⇒
|
||||||
|
primaryOutputs.subreceive(ep)
|
||||||
|
context become activeReceive
|
||||||
|
unstashAll()
|
||||||
|
case _ ⇒ stash()
|
||||||
|
}
|
||||||
|
|
||||||
|
def activeReceive: Receive = primaryInputs.subreceive orElse primaryOutputs.subreceive
|
||||||
|
|
||||||
protected def onError(e: Throwable): Unit = fail(e)
|
protected def onError(e: Throwable): Unit = fail(e)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ private[akka] class MapFutureProcessorImpl(_settings: MaterializerSettings, f: A
|
||||||
// keep future results arriving too early in a buffer sorted by seqNo
|
// keep future results arriving too early in a buffer sorted by seqNo
|
||||||
var orderedBuffer = TreeSet.empty[FutureElement]
|
var orderedBuffer = TreeSet.empty[FutureElement]
|
||||||
|
|
||||||
override def receive = futureReceive orElse super.receive
|
override def activeReceive = futureReceive orElse super.activeReceive
|
||||||
|
|
||||||
def drainBuffer(): List[Any] = {
|
def drainBuffer(): List[Any] = {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ import akka.stream.MaterializerSettings
|
||||||
import akka.actor.{ Actor, Terminated, ActorRef }
|
import akka.actor.{ Actor, Terminated, ActorRef }
|
||||||
import org.reactivestreams.{ Publisher, Subscriber, Subscription }
|
import org.reactivestreams.{ Publisher, Subscriber, Subscription }
|
||||||
import akka.stream.actor.ActorSubscriber.{ OnNext, OnError, OnComplete, OnSubscribe }
|
import akka.stream.actor.ActorSubscriber.{ OnNext, OnError, OnComplete, OnSubscribe }
|
||||||
|
import akka.actor.Stash
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* INTERNAL API
|
* INTERNAL API
|
||||||
|
|
@ -111,7 +112,7 @@ private[akka] abstract class MultiStreamOutputProcessor(_settings: MaterializerS
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive = primaryInputs.subreceive orElse primaryOutputs.subreceive orElse substreamManagement
|
override def activeReceive = primaryInputs.subreceive orElse primaryOutputs.subreceive orElse substreamManagement
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -159,7 +160,8 @@ private[akka] abstract class TwoStreamInputProcessor(_settings: MaterializerSett
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive = secondaryInputs.subreceive orElse primaryInputs.subreceive orElse primaryOutputs.subreceive
|
override def activeReceive: Receive =
|
||||||
|
secondaryInputs.subreceive orElse primaryInputs.subreceive orElse primaryOutputs.subreceive
|
||||||
|
|
||||||
other.subscribe(new OtherActorSubscriber(self))
|
other.subscribe(new OtherActorSubscriber(self))
|
||||||
|
|
||||||
|
|
@ -248,5 +250,5 @@ private[akka] abstract class MultiStreamInputProcessor(_settings: MaterializerSe
|
||||||
super.shutdownHooks()
|
super.shutdownHooks()
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive = primaryInputs.subreceive orElse primaryOutputs.subreceive orElse substreamManagement
|
override def activeReceive = primaryInputs.subreceive orElse primaryOutputs.subreceive orElse substreamManagement
|
||||||
}
|
}
|
||||||
|
|
@ -48,7 +48,7 @@ private[akka] class TimerTransformerProcessorsImpl(
|
||||||
override def inputsAvailable: Boolean = !queue.isEmpty
|
override def inputsAvailable: Boolean = !queue.isEmpty
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive = super.receive orElse schedulerInputs.subreceive
|
override def activeReceive = super.activeReceive orElse schedulerInputs.subreceive
|
||||||
|
|
||||||
object RunningCondition extends TransferState {
|
object RunningCondition extends TransferState {
|
||||||
def isReady = {
|
def isReady = {
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ import akka.util.ByteString
|
||||||
import akka.io.Tcp._
|
import akka.io.Tcp._
|
||||||
import akka.stream.MaterializerSettings
|
import akka.stream.MaterializerSettings
|
||||||
import org.reactivestreams.Processor
|
import org.reactivestreams.Processor
|
||||||
|
import akka.actor.Stash
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* INTERNAL API
|
* INTERNAL API
|
||||||
|
|
@ -28,7 +29,7 @@ private[akka] object TcpStreamActor {
|
||||||
/**
|
/**
|
||||||
* INTERNAL API
|
* INTERNAL API
|
||||||
*/
|
*/
|
||||||
private[akka] abstract class TcpStreamActor(val settings: MaterializerSettings) extends Actor {
|
private[akka] abstract class TcpStreamActor(val settings: MaterializerSettings) extends Actor with Stash {
|
||||||
|
|
||||||
import TcpStreamActor._
|
import TcpStreamActor._
|
||||||
|
|
||||||
|
|
@ -166,7 +167,16 @@ private[akka] abstract class TcpStreamActor(val settings: MaterializerSettings)
|
||||||
override protected def pumpContext: ActorRefFactory = context
|
override protected def pumpContext: ActorRefFactory = context
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive =
|
final override def receive = {
|
||||||
|
// FIXME using Stash mailbox is not the best for performance, we probably want a better solution to this
|
||||||
|
case ep: ExposedPublisher ⇒
|
||||||
|
primaryOutputs.subreceive(ep)
|
||||||
|
context become activeReceive
|
||||||
|
unstashAll()
|
||||||
|
case _ ⇒ stash()
|
||||||
|
}
|
||||||
|
|
||||||
|
def activeReceive =
|
||||||
primaryInputs.subreceive orElse primaryOutputs.subreceive orElse tcpInputs.subreceive orElse tcpOutputs.subreceive
|
primaryInputs.subreceive orElse primaryOutputs.subreceive orElse tcpInputs.subreceive orElse tcpOutputs.subreceive
|
||||||
|
|
||||||
readPump.nextPhase(readPump.running)
|
readPump.nextPhase(readPump.running)
|
||||||
|
|
@ -205,7 +215,7 @@ private[akka] class OutboundTcpStreamActor(val connectCmd: Connect, val requeste
|
||||||
|
|
||||||
val initSteps = new SubReceive(waitingExposedProcessor)
|
val initSteps = new SubReceive(waitingExposedProcessor)
|
||||||
|
|
||||||
override def receive = initSteps orElse super.receive
|
override def activeReceive = initSteps orElse super.activeReceive
|
||||||
|
|
||||||
def waitingExposedProcessor: Receive = {
|
def waitingExposedProcessor: Receive = {
|
||||||
case StreamTcpManager.ExposedProcessor(processor) ⇒
|
case StreamTcpManager.ExposedProcessor(processor) ⇒
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ private[akka] object TcpListenStreamActor {
|
||||||
* INTERNAL API
|
* INTERNAL API
|
||||||
*/
|
*/
|
||||||
private[akka] class TcpListenStreamActor(bindCmd: Tcp.Bind, requester: ActorRef, val settings: MaterializerSettings) extends Actor
|
private[akka] class TcpListenStreamActor(bindCmd: Tcp.Bind, requester: ActorRef, val settings: MaterializerSettings) extends Actor
|
||||||
with Pump {
|
with Pump with Stash {
|
||||||
import akka.stream.io.TcpListenStreamActor._
|
import akka.stream.io.TcpListenStreamActor._
|
||||||
import context.system
|
import context.system
|
||||||
|
|
||||||
|
|
@ -101,7 +101,16 @@ private[akka] class TcpListenStreamActor(bindCmd: Tcp.Bind, requester: ActorRef,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override def receive: Actor.Receive = primaryOutputs.subreceive orElse incomingConnections.subreceive
|
final override def receive = {
|
||||||
|
// FIXME using Stash mailbox is not the best for performance, we probably want a better solution to this
|
||||||
|
case ep: ExposedPublisher ⇒
|
||||||
|
primaryOutputs.subreceive(ep)
|
||||||
|
context become activeReceive
|
||||||
|
unstashAll()
|
||||||
|
case _ ⇒ stash()
|
||||||
|
}
|
||||||
|
|
||||||
|
def activeReceive: Actor.Receive = primaryOutputs.subreceive orElse incomingConnections.subreceive
|
||||||
|
|
||||||
def runningPhase = TransferPhase(primaryOutputs.NeedsDemand && incomingConnections.NeedsInput) { () ⇒
|
def runningPhase = TransferPhase(primaryOutputs.NeedsDemand && incomingConnections.NeedsInput) { () ⇒
|
||||||
val (connected: Connected, connection: ActorRef) = incomingConnections.dequeueInputElement()
|
val (connected: Connected, connection: ActorRef) = incomingConnections.dequeueInputElement()
|
||||||
|
|
|
||||||
|
|
@ -208,7 +208,7 @@ class DuctSpec extends AkkaSpec {
|
||||||
val d1: Duct[String, Publisher[Fruit]] = Duct[String].map(_ ⇒ new Apple).splitWhen(_ ⇒ true)
|
val d1: Duct[String, Publisher[Fruit]] = Duct[String].map(_ ⇒ new Apple).splitWhen(_ ⇒ true)
|
||||||
val d2: Duct[String, (Boolean, Publisher[Fruit])] = Duct[String].map(_ ⇒ new Apple).groupBy(_ ⇒ true)
|
val d2: Duct[String, (Boolean, Publisher[Fruit])] = Duct[String].map(_ ⇒ new Apple).groupBy(_ ⇒ true)
|
||||||
val d3: Duct[String, (immutable.Seq[Apple], Publisher[Fruit])] = Duct[String].map(_ ⇒ new Apple).prefixAndTail(1)
|
val d3: Duct[String, (immutable.Seq[Apple], Publisher[Fruit])] = Duct[String].map(_ ⇒ new Apple).prefixAndTail(1)
|
||||||
val s1: Subscriber[Fruit] = null
|
val s1: Subscriber[Fruit] = StreamTestKit.SubscriberProbe[Fruit]()
|
||||||
val s2: Subscriber[String] = Duct[String].map(_ ⇒ new Apple).produceTo(s1, materializer)
|
val s2: Subscriber[String] = Duct[String].map(_ ⇒ new Apple).produceTo(s1, materializer)
|
||||||
val t: Tuple2[Subscriber[String], Publisher[Fruit]] = Duct[String].map(_ ⇒ new Apple).build(materializer)
|
val t: Tuple2[Subscriber[String], Publisher[Fruit]] = Duct[String].map(_ ⇒ new Apple).build(materializer)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue