Sink inside Actor invoked during prod, but not during test Announcing the arrival of Valued Associate #679: Cesar Manara Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern) Data science time! April 2019 and salary with experience The Ask Question Wizard is Live!Using ScalaTest to test akka actorsHow to test that Akka actor was created in ScalaTesting Actors in AkkaAkka: testing actor got messageUnit test async scala codeTest actors creation in akka hooks (preStart)How do I test an Akka actor that sends a message to another actor?How to deal with future inside a customized akka Sink?How to wait for Akka actor to start during tests?Actors as sink and source for Akka websockets
Is there a verb for listening stealthily?
Assertions In A Mock Callout Test
Who can become a wight?
How can I introduce the names of fantasy creatures to the reader?
Salesforce - multiple pre production environments
2 sample t test for sample sizes - 30,000 and 150,000
Does the universe have a fixed centre of mass?
Lights are flickering on and off after accidentally bumping into light switch
Why not use the yoke to control yaw, as well as pitch and roll?
Why these surprising proportionalities of integrals involving odd zeta values?
What's the connection between Mr. Nancy and fried chicken?
"Destructive force" carried by a B-52?
Why doesn't the university give past final exams' answers?
Trying to enter the Fox's den
“Since the train was delayed for more than an hour, passengers were given a full refund.” – Why is there no article before “passengers”?
Determine the generator of an ideal of ring of integers
Short story about an alien named Ushtu(?) coming from a future Earth, when ours was destroyed by a nuclear explosion
When speaking, how do you change your mind mid-sentence?
Are Flameskulls resistant to magical piercing damage?
Married in secret, can marital status in passport be changed at a later date?
Can I take recommendation from someone I met at a conference?
Do chord progressions usually move by fifths?
Does traveling In The United States require a passport or can I use my green card if not a US citizen?
Weaponising the Grasp-at-a-Distance spell
Sink inside Actor invoked during prod, but not during test
Announcing the arrival of Valued Associate #679: Cesar Manara
Planned maintenance scheduled April 23, 2019 at 23:30 UTC (7:30pm US/Eastern)
Data science time! April 2019 and salary with experience
The Ask Question Wizard is Live!Using ScalaTest to test akka actorsHow to test that Akka actor was created in ScalaTesting Actors in AkkaAkka: testing actor got messageUnit test async scala codeTest actors creation in akka hooks (preStart)How do I test an Akka actor that sends a message to another actor?How to deal with future inside a customized akka Sink?How to wait for Akka actor to start during tests?Actors as sink and source for Akka websockets
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty height:90px;width:728px;box-sizing:border-box;
I have an actor that invokes a stream. At runtime this works as intended, but when tested the stream is not invoked.
The Actor (abbreviated)
class PaymentProcessorActor(repo: PaymentRepo, accountCache: AccountCache, config: AppConfig) extends Actor {
implicit private val materializer: ActorMaterializer = ActorMaterializer()
implicit private val network: Network = config.network
private implicit val ec: ExecutionContextExecutor = context.dispatcher
val paymentSink: Sink[(Seq[Payment], Account), NotUsed] =
Flow[(Seq[Payment], Account)].map case (ps, account) =>
println("inside flow")
// ... block of type Future[(TransactionResponse, Seq[Payment], Account)] here
.mapAsync(parallelism = config.accounts.size)(_.map
case ((_: TransactionApproved, ps), account) =>
// handle approval
case ((x: TransactionRejected, ps), account) =>
// handle rejection
)
.to(Sink.ignore)
override def receive: Receive = state(nextKnownPaymentDate = None)
private def state(nextKnownPaymentDate: Option[ZonedDateTime]): Receive =
processPayments(nextKnownPaymentDate) orElse
updateNextPaymentTime orElse
confirmPayments orElse
rejectPayments orElse
rejectTransaction orElse
retryPayments orElse
updateAccount orElse
registerAccount
// If there are payments due, find and pay them
def processPayments(nextKnownPaymentDate: Option[ZonedDateTime]): PartialFunction[Any, Unit] =
case ProcessPayments if nextKnownPaymentDate.exists(_.isBefore(ZonedDateTime.now())) =>
val readyAccounts = accountCache.readyCount
if (readyAccounts > 0)
val payments = repo.due(readyAccounts * 100)
if (payments.isEmpty)
logger.debug("No more payments due.")
context.become(state(repo.earliestTimeDue))
else
val submittingPaymentsWithAccounts: Seq[(Seq[Payment], Account)] =
payments.grouped(100).flatMap(ps => accountCache.borrowAccount.map(ps -> _)).toSeq
val submittingPayments: Seq[Payment] = submittingPaymentsWithAccounts.flatMap(_._1)
repo.submit(submittingPayments.flatMap(_.id), ZonedDateTime.now)
Source.fromIterator(() => submittingPaymentsWithAccounts.iterator).to(paymentSink).run()
println("post source run")
The spec. (sampleOf
just creates a random instance and is not pertinent to the problem).
"the payment sink" should
"submit to the network" in
val (network, conf, repo, cache) = setup
val account = sampleOf(genAccount)
val payments = sampleOf(Gen.listOfN(3, genPayment))
when(repo.earliestTimeDue).thenReturn(Some(ZonedDateTime.now()))
when(repo.due(100)).thenReturn(payments)
val actor = system.actorOf(Props(new PaymentProcessorActor(repo, cache, conf)))
// these two calls set up the actor state so that payments will be processed
actor ! UpdateNextPaymentTime
actor ! UpdateAccount(account)
// this invokes the stream under test
actor ! ProcessPayments
eventually(timeout(5 seconds))
assert(network.posted.size == 1)
private def setup: (StubNetwork, AppConfig, PaymentRepo, AccountCache) =
val n = StubNetwork()
val conf = new AppConfig
val network: Network = n
val accounts: Map[String, KeyPair] = Map.empty
val repo = mock[PaymentRepo]
(n, conf, repo, new AccountCache)
At runtime, I see the stdout messages:
post source run
inside flow
But during test I only see
post source run
With debugging, I see that all values are correct and the source .run
is called. But somehow it does not run.
scala akka scalatest akka-stream
add a comment |
I have an actor that invokes a stream. At runtime this works as intended, but when tested the stream is not invoked.
The Actor (abbreviated)
class PaymentProcessorActor(repo: PaymentRepo, accountCache: AccountCache, config: AppConfig) extends Actor {
implicit private val materializer: ActorMaterializer = ActorMaterializer()
implicit private val network: Network = config.network
private implicit val ec: ExecutionContextExecutor = context.dispatcher
val paymentSink: Sink[(Seq[Payment], Account), NotUsed] =
Flow[(Seq[Payment], Account)].map case (ps, account) =>
println("inside flow")
// ... block of type Future[(TransactionResponse, Seq[Payment], Account)] here
.mapAsync(parallelism = config.accounts.size)(_.map
case ((_: TransactionApproved, ps), account) =>
// handle approval
case ((x: TransactionRejected, ps), account) =>
// handle rejection
)
.to(Sink.ignore)
override def receive: Receive = state(nextKnownPaymentDate = None)
private def state(nextKnownPaymentDate: Option[ZonedDateTime]): Receive =
processPayments(nextKnownPaymentDate) orElse
updateNextPaymentTime orElse
confirmPayments orElse
rejectPayments orElse
rejectTransaction orElse
retryPayments orElse
updateAccount orElse
registerAccount
// If there are payments due, find and pay them
def processPayments(nextKnownPaymentDate: Option[ZonedDateTime]): PartialFunction[Any, Unit] =
case ProcessPayments if nextKnownPaymentDate.exists(_.isBefore(ZonedDateTime.now())) =>
val readyAccounts = accountCache.readyCount
if (readyAccounts > 0)
val payments = repo.due(readyAccounts * 100)
if (payments.isEmpty)
logger.debug("No more payments due.")
context.become(state(repo.earliestTimeDue))
else
val submittingPaymentsWithAccounts: Seq[(Seq[Payment], Account)] =
payments.grouped(100).flatMap(ps => accountCache.borrowAccount.map(ps -> _)).toSeq
val submittingPayments: Seq[Payment] = submittingPaymentsWithAccounts.flatMap(_._1)
repo.submit(submittingPayments.flatMap(_.id), ZonedDateTime.now)
Source.fromIterator(() => submittingPaymentsWithAccounts.iterator).to(paymentSink).run()
println("post source run")
The spec. (sampleOf
just creates a random instance and is not pertinent to the problem).
"the payment sink" should
"submit to the network" in
val (network, conf, repo, cache) = setup
val account = sampleOf(genAccount)
val payments = sampleOf(Gen.listOfN(3, genPayment))
when(repo.earliestTimeDue).thenReturn(Some(ZonedDateTime.now()))
when(repo.due(100)).thenReturn(payments)
val actor = system.actorOf(Props(new PaymentProcessorActor(repo, cache, conf)))
// these two calls set up the actor state so that payments will be processed
actor ! UpdateNextPaymentTime
actor ! UpdateAccount(account)
// this invokes the stream under test
actor ! ProcessPayments
eventually(timeout(5 seconds))
assert(network.posted.size == 1)
private def setup: (StubNetwork, AppConfig, PaymentRepo, AccountCache) =
val n = StubNetwork()
val conf = new AppConfig
val network: Network = n
val accounts: Map[String, KeyPair] = Map.empty
val repo = mock[PaymentRepo]
(n, conf, repo, new AccountCache)
At runtime, I see the stdout messages:
post source run
inside flow
But during test I only see
post source run
With debugging, I see that all values are correct and the source .run
is called. But somehow it does not run.
scala akka scalatest akka-stream
Not directly related to your question, but at "inside flow" why would you create aFuture
in amap
rather than doing amapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.
– Arnout Engelen
Mar 9 at 8:40
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns aFuture
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?
– Synesso
Mar 11 at 4:51
add a comment |
I have an actor that invokes a stream. At runtime this works as intended, but when tested the stream is not invoked.
The Actor (abbreviated)
class PaymentProcessorActor(repo: PaymentRepo, accountCache: AccountCache, config: AppConfig) extends Actor {
implicit private val materializer: ActorMaterializer = ActorMaterializer()
implicit private val network: Network = config.network
private implicit val ec: ExecutionContextExecutor = context.dispatcher
val paymentSink: Sink[(Seq[Payment], Account), NotUsed] =
Flow[(Seq[Payment], Account)].map case (ps, account) =>
println("inside flow")
// ... block of type Future[(TransactionResponse, Seq[Payment], Account)] here
.mapAsync(parallelism = config.accounts.size)(_.map
case ((_: TransactionApproved, ps), account) =>
// handle approval
case ((x: TransactionRejected, ps), account) =>
// handle rejection
)
.to(Sink.ignore)
override def receive: Receive = state(nextKnownPaymentDate = None)
private def state(nextKnownPaymentDate: Option[ZonedDateTime]): Receive =
processPayments(nextKnownPaymentDate) orElse
updateNextPaymentTime orElse
confirmPayments orElse
rejectPayments orElse
rejectTransaction orElse
retryPayments orElse
updateAccount orElse
registerAccount
// If there are payments due, find and pay them
def processPayments(nextKnownPaymentDate: Option[ZonedDateTime]): PartialFunction[Any, Unit] =
case ProcessPayments if nextKnownPaymentDate.exists(_.isBefore(ZonedDateTime.now())) =>
val readyAccounts = accountCache.readyCount
if (readyAccounts > 0)
val payments = repo.due(readyAccounts * 100)
if (payments.isEmpty)
logger.debug("No more payments due.")
context.become(state(repo.earliestTimeDue))
else
val submittingPaymentsWithAccounts: Seq[(Seq[Payment], Account)] =
payments.grouped(100).flatMap(ps => accountCache.borrowAccount.map(ps -> _)).toSeq
val submittingPayments: Seq[Payment] = submittingPaymentsWithAccounts.flatMap(_._1)
repo.submit(submittingPayments.flatMap(_.id), ZonedDateTime.now)
Source.fromIterator(() => submittingPaymentsWithAccounts.iterator).to(paymentSink).run()
println("post source run")
The spec. (sampleOf
just creates a random instance and is not pertinent to the problem).
"the payment sink" should
"submit to the network" in
val (network, conf, repo, cache) = setup
val account = sampleOf(genAccount)
val payments = sampleOf(Gen.listOfN(3, genPayment))
when(repo.earliestTimeDue).thenReturn(Some(ZonedDateTime.now()))
when(repo.due(100)).thenReturn(payments)
val actor = system.actorOf(Props(new PaymentProcessorActor(repo, cache, conf)))
// these two calls set up the actor state so that payments will be processed
actor ! UpdateNextPaymentTime
actor ! UpdateAccount(account)
// this invokes the stream under test
actor ! ProcessPayments
eventually(timeout(5 seconds))
assert(network.posted.size == 1)
private def setup: (StubNetwork, AppConfig, PaymentRepo, AccountCache) =
val n = StubNetwork()
val conf = new AppConfig
val network: Network = n
val accounts: Map[String, KeyPair] = Map.empty
val repo = mock[PaymentRepo]
(n, conf, repo, new AccountCache)
At runtime, I see the stdout messages:
post source run
inside flow
But during test I only see
post source run
With debugging, I see that all values are correct and the source .run
is called. But somehow it does not run.
scala akka scalatest akka-stream
I have an actor that invokes a stream. At runtime this works as intended, but when tested the stream is not invoked.
The Actor (abbreviated)
class PaymentProcessorActor(repo: PaymentRepo, accountCache: AccountCache, config: AppConfig) extends Actor {
implicit private val materializer: ActorMaterializer = ActorMaterializer()
implicit private val network: Network = config.network
private implicit val ec: ExecutionContextExecutor = context.dispatcher
val paymentSink: Sink[(Seq[Payment], Account), NotUsed] =
Flow[(Seq[Payment], Account)].map case (ps, account) =>
println("inside flow")
// ... block of type Future[(TransactionResponse, Seq[Payment], Account)] here
.mapAsync(parallelism = config.accounts.size)(_.map
case ((_: TransactionApproved, ps), account) =>
// handle approval
case ((x: TransactionRejected, ps), account) =>
// handle rejection
)
.to(Sink.ignore)
override def receive: Receive = state(nextKnownPaymentDate = None)
private def state(nextKnownPaymentDate: Option[ZonedDateTime]): Receive =
processPayments(nextKnownPaymentDate) orElse
updateNextPaymentTime orElse
confirmPayments orElse
rejectPayments orElse
rejectTransaction orElse
retryPayments orElse
updateAccount orElse
registerAccount
// If there are payments due, find and pay them
def processPayments(nextKnownPaymentDate: Option[ZonedDateTime]): PartialFunction[Any, Unit] =
case ProcessPayments if nextKnownPaymentDate.exists(_.isBefore(ZonedDateTime.now())) =>
val readyAccounts = accountCache.readyCount
if (readyAccounts > 0)
val payments = repo.due(readyAccounts * 100)
if (payments.isEmpty)
logger.debug("No more payments due.")
context.become(state(repo.earliestTimeDue))
else
val submittingPaymentsWithAccounts: Seq[(Seq[Payment], Account)] =
payments.grouped(100).flatMap(ps => accountCache.borrowAccount.map(ps -> _)).toSeq
val submittingPayments: Seq[Payment] = submittingPaymentsWithAccounts.flatMap(_._1)
repo.submit(submittingPayments.flatMap(_.id), ZonedDateTime.now)
Source.fromIterator(() => submittingPaymentsWithAccounts.iterator).to(paymentSink).run()
println("post source run")
The spec. (sampleOf
just creates a random instance and is not pertinent to the problem).
"the payment sink" should
"submit to the network" in
val (network, conf, repo, cache) = setup
val account = sampleOf(genAccount)
val payments = sampleOf(Gen.listOfN(3, genPayment))
when(repo.earliestTimeDue).thenReturn(Some(ZonedDateTime.now()))
when(repo.due(100)).thenReturn(payments)
val actor = system.actorOf(Props(new PaymentProcessorActor(repo, cache, conf)))
// these two calls set up the actor state so that payments will be processed
actor ! UpdateNextPaymentTime
actor ! UpdateAccount(account)
// this invokes the stream under test
actor ! ProcessPayments
eventually(timeout(5 seconds))
assert(network.posted.size == 1)
private def setup: (StubNetwork, AppConfig, PaymentRepo, AccountCache) =
val n = StubNetwork()
val conf = new AppConfig
val network: Network = n
val accounts: Map[String, KeyPair] = Map.empty
val repo = mock[PaymentRepo]
(n, conf, repo, new AccountCache)
At runtime, I see the stdout messages:
post source run
inside flow
But during test I only see
post source run
With debugging, I see that all values are correct and the source .run
is called. But somehow it does not run.
scala akka scalatest akka-stream
scala akka scalatest akka-stream
edited Mar 9 at 2:45
Synesso
asked Mar 8 at 22:19
SynessoSynesso
20.7k27109170
20.7k27109170
Not directly related to your question, but at "inside flow" why would you create aFuture
in amap
rather than doing amapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.
– Arnout Engelen
Mar 9 at 8:40
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns aFuture
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?
– Synesso
Mar 11 at 4:51
add a comment |
Not directly related to your question, but at "inside flow" why would you create aFuture
in amap
rather than doing amapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.
– Arnout Engelen
Mar 9 at 8:40
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns aFuture
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?
– Synesso
Mar 11 at 4:51
Not directly related to your question, but at "inside flow" why would you create a
Future
in a map
rather than doing a mapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.– Arnout Engelen
Mar 9 at 8:40
Not directly related to your question, but at "inside flow" why would you create a
Future
in a map
rather than doing a mapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.– Arnout Engelen
Mar 9 at 8:40
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns a
Future
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?– Synesso
Mar 11 at 4:51
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns a
Future
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?– Synesso
Mar 11 at 4:51
add a comment |
1 Answer
1
active
oldest
votes
In the line .mapAsync(parallelism = config.accounts.size)
, the value was zero, which is an error condition. The Flow
never initialised. This failure does not propagate to the main thread.
Additionally, I had turned off Akka logging for tests in the configuration, so this failure was not logged.
1
Just add a supervision strategy while creating a materializer to log the errors, like:ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be:decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")`Supervision.Stop
` `
– Explorer
Mar 12 at 20:35
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55071791%2fsink-inside-actor-invoked-during-prod-but-not-during-test%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
In the line .mapAsync(parallelism = config.accounts.size)
, the value was zero, which is an error condition. The Flow
never initialised. This failure does not propagate to the main thread.
Additionally, I had turned off Akka logging for tests in the configuration, so this failure was not logged.
1
Just add a supervision strategy while creating a materializer to log the errors, like:ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be:decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")`Supervision.Stop
` `
– Explorer
Mar 12 at 20:35
add a comment |
In the line .mapAsync(parallelism = config.accounts.size)
, the value was zero, which is an error condition. The Flow
never initialised. This failure does not propagate to the main thread.
Additionally, I had turned off Akka logging for tests in the configuration, so this failure was not logged.
1
Just add a supervision strategy while creating a materializer to log the errors, like:ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be:decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")`Supervision.Stop
` `
– Explorer
Mar 12 at 20:35
add a comment |
In the line .mapAsync(parallelism = config.accounts.size)
, the value was zero, which is an error condition. The Flow
never initialised. This failure does not propagate to the main thread.
Additionally, I had turned off Akka logging for tests in the configuration, so this failure was not logged.
In the line .mapAsync(parallelism = config.accounts.size)
, the value was zero, which is an error condition. The Flow
never initialised. This failure does not propagate to the main thread.
Additionally, I had turned off Akka logging for tests in the configuration, so this failure was not logged.
answered Mar 11 at 5:24
SynessoSynesso
20.7k27109170
20.7k27109170
1
Just add a supervision strategy while creating a materializer to log the errors, like:ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be:decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")`Supervision.Stop
` `
– Explorer
Mar 12 at 20:35
add a comment |
1
Just add a supervision strategy while creating a materializer to log the errors, like:ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be:decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")`Supervision.Stop
` `
– Explorer
Mar 12 at 20:35
1
1
Just add a supervision strategy while creating a materializer to log the errors, like:
ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be: decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")` Supervision.Stop
` `– Explorer
Mar 12 at 20:35
Just add a supervision strategy while creating a materializer to log the errors, like:
ActorMaterializerSettings(actorSystem).withSupervisionStrategy(decider)
and decider will be: decider: Supervision.Decider = case ex: Exception =>
` logger.error(s"Unhandled exception in stream: $ex")` Supervision.Stop
` `– Explorer
Mar 12 at 20:35
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f55071791%2fsink-inside-actor-invoked-during-prod-but-not-during-test%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Not directly related to your question, but at "inside flow" why would you create a
Future
in amap
rather than doing amapAsync
here? I sort of suspect there's blocking on the dispatcher somewhere, but don't see it here directly.– Arnout Engelen
Mar 9 at 8:40
Thanks for your comment @ArnoutEngelen. I call out to a library function which returns a
Future
. The full block being github.com/0rora/0rora/blob/ba373e/app/models/… Does that look problematic?– Synesso
Mar 11 at 4:51