+str #24229 remove protobuf changes, which do not need to be made in this PR docs moved things config object subscription timeout confifmed working, also, attributes document attributes for sub timeout tests for the source also failing when it should additional demand test implemented protection from materializing "in cycles"; would be nice in types but that breaks the niceness of use of the types SinkRef/SourceRef... cleanup no idle timeout built in, can use the Timeout stages more docs simplest change to prevent exposing SinkRef => SourceRef => SinkRef cycle Things to decide: * is it ok to require using `getSource` / `getSink` as Java API, is there better naming? * where should the constructors go? I'd say just in regular javadsl/scaladsl `Source`/ `Sink` objects move constructors to {javadsl,scaladsl}.{Source,Sink} companion objects Remove now useless "canMaterialize" field Separate stage (implementation) from ref (wrapped actor ref) to make it clearer what is serialized Clarify that partner refs are not optional in on-the-wire interfaces minor cleanup in SourceRefStage Renamed the stages but questionable if that really helps ;) cleanups, better docs cleanup, fix docs compilation fix mima got rid of Futures in the materialized values of stream refs
49 lines
2 KiB
Scala
49 lines
2 KiB
Scala
/**
|
|
* Copyright (C) 2018 Lightbend Inc. <http://www.lightbend.com>
|
|
*/
|
|
package akka.stream.impl.streamref
|
|
|
|
import akka.NotUsed
|
|
import akka.annotation.InternalApi
|
|
import akka.stream.scaladsl.Source
|
|
import akka.stream.{ SourceRef, javadsl }
|
|
|
|
import scala.concurrent.{ ExecutionContext, Future }
|
|
import scala.util.{ Failure, Success }
|
|
|
|
/**
|
|
* INTERNAL API
|
|
* Allows users to directly use the SourceRef, even though we do have to go through the Future in order to be able
|
|
* to materialize it. Since we initialize the ref from within the GraphStageLogic. See [[SourceRefStageImpl]] for usage.
|
|
*/
|
|
@InternalApi
|
|
private[akka] final case class MaterializedSourceRef[Out](futureSource: Future[SourceRefImpl[Out]]) extends SourceRef[Out] {
|
|
|
|
override def source: Source[Out, NotUsed] =
|
|
futureSource.value match {
|
|
|
|
case Some(Success(ready)) ⇒
|
|
// the normal case, since once materialization finishes, the future is guaranteed to have been completed
|
|
ready.source
|
|
|
|
case Some(Failure(cause)) ⇒
|
|
// materialization failed
|
|
Source.failed(cause).named("SourceRef")
|
|
|
|
case None ⇒
|
|
throw new Exception(s"This should not be possible! We guarantee to complete the materialized Future value when materialization finishes! Source was: $futureSource")
|
|
// // not yet materialized -- in reality this case should not happen, since once materialization is finished, this Future is already completed
|
|
// // this impl is kept in case materialization semantics would change for some reason
|
|
// Source.fromFutureSource(futureSource.map(ref => ref.source)(ex)).mapMaterializedValue(_ ⇒ NotUsed)
|
|
}
|
|
|
|
override def getSource: javadsl.Source[Out, NotUsed] = source.asJava
|
|
|
|
override def toString: String =
|
|
futureSource.value match {
|
|
case None ⇒ s"SourceRef(<materializing-source-ref>)"
|
|
case Some(Success(ready)) ⇒ ready.toString
|
|
case Some(Failure(ex)) ⇒ s"SourceRef(<failed:${ex.getMessage}>)"
|
|
}
|
|
|
|
}
|