Use the target actor name in the temporary ask actor name (#29245)
* Allows specifying the large message channel for the response using wildcard patterns in config * Makes debugging asks somewhat easier
This commit is contained in:
parent
2f424b13dd
commit
df995fe7bd
16 changed files with 101 additions and 35 deletions
|
|
@ -4,19 +4,19 @@
|
|||
|
||||
package akka.pattern
|
||||
|
||||
import java.net.URLEncoder
|
||||
import java.util.concurrent.TimeoutException
|
||||
|
||||
import scala.annotation.tailrec
|
||||
import scala.concurrent.{ Future, Promise }
|
||||
import scala.language.implicitConversions
|
||||
import scala.util.{ Failure, Success }
|
||||
|
||||
import com.github.ghik.silencer.silent
|
||||
|
||||
import akka.actor._
|
||||
import akka.annotation.{ InternalApi, InternalStableApi }
|
||||
import akka.dispatch.ExecutionContexts
|
||||
import akka.dispatch.sysmsg._
|
||||
import akka.util.ByteString
|
||||
import akka.util.{ Timeout, Unsafe }
|
||||
import akka.util.unused
|
||||
|
||||
|
|
@ -340,7 +340,7 @@ final class AskableActorRef(val actorRef: ActorRef) extends AnyVal {
|
|||
if (timeout.duration.length <= 0)
|
||||
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorRef, message, sender))
|
||||
else {
|
||||
PromiseActorRef(ref.provider, timeout, targetName = actorRef, message.getClass.getName, sender)
|
||||
PromiseActorRef(ref.provider, timeout, targetName = actorRef, message.getClass.getName, ref.path.name, sender)
|
||||
.ask(actorRef, message, timeout)
|
||||
}
|
||||
case _ => Future.failed[Any](AskableActorRef.unsupportedRecipientType(actorRef, message, sender))
|
||||
|
|
@ -373,7 +373,7 @@ final class ExplicitlyAskableActorRef(val actorRef: ActorRef) extends AnyVal {
|
|||
val message = messageFactory(ref.provider.deadLetters)
|
||||
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorRef, message, sender))
|
||||
} else {
|
||||
val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef, "unknown", sender)
|
||||
val a = PromiseActorRef(ref.provider, timeout, targetName = actorRef, "unknown", ref.path.name, sender)
|
||||
val message = messageFactory(a)
|
||||
a.messageClassName = message.getClass.getName
|
||||
a.ask(actorRef, message, timeout)
|
||||
|
|
@ -422,7 +422,8 @@ final class AskableActorSelection(val actorSel: ActorSelection) extends AnyVal {
|
|||
if (timeout.duration.length <= 0)
|
||||
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorSel, message, sender))
|
||||
else {
|
||||
PromiseActorRef(ref.provider, timeout, targetName = actorSel, message.getClass.getName, sender)
|
||||
val refPrefix = URLEncoder.encode(actorSel.pathString.replace("/", "_"), ByteString.UTF_8)
|
||||
PromiseActorRef(ref.provider, timeout, targetName = actorSel, message.getClass.getName, refPrefix, sender)
|
||||
.ask(actorSel, message, timeout)
|
||||
}
|
||||
case _ => Future.failed[Any](AskableActorRef.unsupportedRecipientType(actorSel, message, sender))
|
||||
|
|
@ -450,7 +451,8 @@ final class ExplicitlyAskableActorSelection(val actorSel: ActorSelection) extend
|
|||
val message = messageFactory(ref.provider.deadLetters)
|
||||
Future.failed[Any](AskableActorRef.negativeTimeoutException(actorSel, message, sender))
|
||||
} else {
|
||||
val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel, "unknown", sender)
|
||||
val refPrefix = URLEncoder.encode(actorSel.pathString.replace("/", "_"), ByteString.UTF_8)
|
||||
val a = PromiseActorRef(ref.provider, timeout, targetName = actorSel, "unknown", refPrefix, sender)
|
||||
val message = messageFactory(a)
|
||||
a.messageClassName = message.getClass.getName
|
||||
a.ask(actorSel, message, timeout)
|
||||
|
|
@ -476,7 +478,8 @@ final class ExplicitlyAskableActorSelection(val actorSel: ActorSelection) extend
|
|||
private[akka] final class PromiseActorRef private (
|
||||
val provider: ActorRefProvider,
|
||||
val result: Promise[Any],
|
||||
_mcn: String)
|
||||
_mcn: String,
|
||||
refPathPrefix: String)
|
||||
extends MinimalActorRef {
|
||||
import AbstractPromiseActorRef.{ stateOffset, watchedByOffset }
|
||||
import PromiseActorRef._
|
||||
|
|
@ -553,7 +556,7 @@ private[akka] final class PromiseActorRef private (
|
|||
if (updateState(null, Registering)) {
|
||||
var p: ActorPath = null
|
||||
try {
|
||||
p = provider.tempPath()
|
||||
p = provider.tempPath(refPathPrefix)
|
||||
provider.registerTempActor(this, p)
|
||||
p
|
||||
} finally {
|
||||
|
|
@ -670,11 +673,14 @@ private[akka] object PromiseActorRef {
|
|||
timeout: Timeout,
|
||||
targetName: Any,
|
||||
messageClassName: String,
|
||||
refPathPrefix: String,
|
||||
sender: ActorRef = Actor.noSender,
|
||||
onTimeout: String => Throwable = defaultOnTimeout): PromiseActorRef = {
|
||||
if (refPathPrefix.indexOf('/') > -1)
|
||||
throw new IllegalArgumentException(s"refPathPrefix must not contain slash, was: $refPathPrefix")
|
||||
val result = Promise[Any]()
|
||||
val scheduler = provider.guardian.underlying.system.scheduler
|
||||
val a = new PromiseActorRef(provider, result, messageClassName)
|
||||
val a = new PromiseActorRef(provider, result, messageClassName, refPathPrefix)
|
||||
implicit val ec = ExecutionContexts.parasitic
|
||||
val f = scheduler.scheduleOnce(timeout.duration) {
|
||||
val timedOut = result.tryComplete {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue