diff --git a/akka-actor/src/main/mima-filters/2.5.11.backwards.excludes b/akka-actor/src/main/mima-filters/2.5.11.backwards.excludes new file mode 100644 index 0000000000..512079b488 --- /dev/null +++ b/akka-actor/src/main/mima-filters/2.5.11.backwards.excludes @@ -0,0 +1,3 @@ +# Internal API changes +ProblemFilters.exclude[IncompatibleResultTypeProblem]("akka.util.JavaDurationConverters#JavaDurationOps.asScala") +ProblemFilters.exclude[IncompatibleResultTypeProblem]("akka.util.JavaDurationConverters#JavaDurationOps.asScala$extension") diff --git a/akka-actor/src/main/scala/akka/util/JavaDurationConverters.scala b/akka-actor/src/main/scala/akka/util/JavaDurationConverters.scala index cf6deb244f..d873b1b4c7 100644 --- a/akka-actor/src/main/scala/akka/util/JavaDurationConverters.scala +++ b/akka-actor/src/main/scala/akka/util/JavaDurationConverters.scala @@ -3,13 +3,13 @@ */ package akka.util import java.time.{ Duration ⇒ JDuration } -import scala.concurrent.duration.Duration +import scala.concurrent.duration.{ Duration, FiniteDuration } /** * INTERNAL API */ private[akka] object JavaDurationConverters { final implicit class JavaDurationOps(val self: JDuration) extends AnyVal { - def asScala: Duration = Duration.fromNanos(self.toNanos) + def asScala: FiniteDuration = Duration.fromNanos(self.toNanos) } final implicit class ScalaDurationOps(val self: Duration) extends AnyVal { diff --git a/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java b/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java index 472501a89e..e5f7baddec 100644 --- a/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java +++ b/akka-stream-tests/src/test/java/akka/stream/javadsl/SourceTest.java @@ -430,7 +430,13 @@ public class SourceTest extends StreamTest { probe.expectNoMsg(FiniteDuration.create(200, TimeUnit.MILLISECONDS)); probe.expectMsgEquals("tick"); probe.expectNoMsg(FiniteDuration.create(200, TimeUnit.MILLISECONDS)); + } + @Test + @SuppressWarnings("unused") + public void mustCompileMethodsWithJavaDuration() { + Source tickSource = Source.tick(java.time.Duration.ofSeconds(1), + java.time.Duration.ofMillis(500), NotUsed.getInstance()); } @Test diff --git a/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala b/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala index b2b94f23d0..5323cd516b 100755 --- a/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala +++ b/akka-stream/src/main/scala/akka/stream/javadsl/Source.scala @@ -7,6 +7,7 @@ import java.util import java.util.Optional import akka.util.{ ConstantFun, Timeout } +import akka.util.JavaDurationConverters._ import akka.{ Done, NotUsed } import akka.actor.{ ActorRef, Cancellable, Props } import akka.event.LoggingAdapter @@ -209,6 +210,12 @@ object Source { def tick[O](initialDelay: FiniteDuration, interval: FiniteDuration, tick: O): javadsl.Source[O, Cancellable] = new Source(scaladsl.Source.tick(initialDelay, interval, tick)) + /** + * Same as [[tick]], but accepts Java [[java.time.Duration]] instead of Scala ones. + */ + def tick[O](initialDelay: java.time.Duration, interval: java.time.Duration, tick: O): javadsl.Source[O, Cancellable] = + Source.tick(initialDelay.asScala, interval.asScala, tick) + /** * Create a `Source` with one element. * Every connected `Sink` of this stream will see an individual stream consisting of one element.