diff --git a/akka-actor-tests/src/test/java/akka/actor/ActorCreationTest.java b/akka-actor-tests/src/test/java/akka/actor/ActorCreationTest.java index 744b71be73..fef5f04389 100644 --- a/akka-actor-tests/src/test/java/akka/actor/ActorCreationTest.java +++ b/akka-actor-tests/src/test/java/akka/actor/ActorCreationTest.java @@ -201,7 +201,7 @@ public class ActorCreationTest extends JUnitSuite { Props.create(new G()); assert false; } catch (IllegalArgumentException e) { - assertEquals("erased Creator types are unsupported, use Props.create(actorClass, creator) instead", e.getMessage()); + assertEquals("erased Creator types (e.g. lambdas) are unsupported, use Props.create(actorClass, creator) instead", e.getMessage()); } Props.create(AbstractActor.class, new G()); } @@ -305,7 +305,7 @@ public class ActorCreationTest extends JUnitSuite { TestActor.propsUsingLamdaWithoutClass(17); org.junit.Assert.fail("Should have detected lambda erasure, and thrown"); } catch (IllegalArgumentException e) { - assertEquals("erased Creator types are unsupported, use Props.create(actorClass, creator) instead", + assertEquals("erased Creator types (e.g. lambdas) are unsupported, use Props.create(actorClass, creator) instead", e.getMessage()); } } diff --git a/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java b/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java index 58cedcfb9a..1ed1088ad5 100644 --- a/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java +++ b/akka-actor-tests/src/test/java/akka/actor/JavaAPI.java @@ -60,14 +60,6 @@ public class JavaAPI extends JUnitSuite { assertNotNull(ref); } - public static Props mkProps() { - return Props.create(new Creator() { - public Actor create() { - return new JavaAPITestActor(); - } - }); - } - @SuppressWarnings("unchecked") public static Props mkErasedProps() { return Props.create(JavaAPITestActor.class, new Creator() { @@ -77,9 +69,13 @@ public class JavaAPI extends JUnitSuite { }); } + public static Props mkPropsWithLambda() { + return Props.create(JavaAPITestActor.class, JavaAPITestActor::new); + } + @Test public void mustBeAbleToCreateActorRefFromFactory() { - ActorRef ref = system.actorOf(mkProps()); + ActorRef ref = system.actorOf(mkPropsWithLambda()); assertNotNull(ref); } diff --git a/akka-actor/src/main/scala/akka/actor/AbstractProps.scala b/akka-actor/src/main/scala/akka/actor/AbstractProps.scala index e1cc2d1485..3c147ef97d 100644 --- a/akka-actor/src/main/scala/akka/actor/AbstractProps.scala +++ b/akka-actor/src/main/scala/akka/actor/AbstractProps.scala @@ -38,6 +38,7 @@ private[akka] trait AbstractProps { * * Use the Props.create(actorClass, creator) instead. */ + @deprecated("Use Props.create(actorClass, creator) instead, since this can't be used with Java 8 lambda.", "2.5.18") def create[T <: Actor](creator: Creator[T]): Props = { val cc = creator.getClass checkCreatorClosingOver(cc) @@ -53,7 +54,7 @@ private[akka] trait AbstractProps { case x ⇒ throw new IllegalArgumentException(s"unsupported type found in Creator argument [$x]") } case c: Class[_] if (c == coc) ⇒ - throw new IllegalArgumentException(s"erased Creator types are unsupported, use Props.create(actorClass, creator) instead") + throw new IllegalArgumentException("erased Creator types (e.g. lambdas) are unsupported, use Props.create(actorClass, creator) instead") } create(classOf[CreatorConsumer], actorClass, creator) } diff --git a/akka-docs/src/test/java/jdocs/persistence/query/MyEventsByTagJavaPublisher.java b/akka-docs/src/test/java/jdocs/persistence/query/MyEventsByTagJavaPublisher.java index f076ea7760..5d37ba24f9 100644 --- a/akka-docs/src/test/java/jdocs/persistence/query/MyEventsByTagJavaPublisher.java +++ b/akka-docs/src/test/java/jdocs/persistence/query/MyEventsByTagJavaPublisher.java @@ -72,7 +72,7 @@ class MyEventsByTagJavaPublisher extends AbstractActorPublisher { public static Props props(Connection conn, String tag, Long offset, Duration refreshInterval) { - return Props.create(() -> + return Props.create(MyEventsByTagJavaPublisher.class, () -> new MyEventsByTagJavaPublisher(conn, tag, offset, refreshInterval)); } diff --git a/akka-docs/src/test/java/jdocs/testkit/ParentChildTest.java b/akka-docs/src/test/java/jdocs/testkit/ParentChildTest.java index 2de65d31e5..07691d45a6 100644 --- a/akka-docs/src/test/java/jdocs/testkit/ParentChildTest.java +++ b/akka-docs/src/test/java/jdocs/testkit/ParentChildTest.java @@ -195,7 +195,7 @@ public class ParentChildTest extends AbstractJavaTest { // didn't put final on these in order to make the parent fit in one line in the html docs //#test-fabricated-parent TestProbe proxy = new TestProbe(system); - ActorRef parent = system.actorOf(Props.create(new FabricatedParentCreator(proxy))); + ActorRef parent = system.actorOf(Props.create(Actor.class, new FabricatedParentCreator(proxy))); proxy.send(parent, "ping"); proxy.expectMsg("pong"); diff --git a/akka-docs/src/test/java/jdocs/tutorial_1/ActorHierarchyExperiments.java b/akka-docs/src/test/java/jdocs/tutorial_1/ActorHierarchyExperiments.java index 4a8f1dee19..93082f832d 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_1/ActorHierarchyExperiments.java +++ b/akka-docs/src/test/java/jdocs/tutorial_1/ActorHierarchyExperiments.java @@ -21,6 +21,10 @@ import akka.actor.ActorSystem; import akka.actor.Props; class PrintMyActorRefActor extends AbstractActor { + static Props props() { + return Props.create(PrintMyActorRefActor.class, PrintMyActorRefActor::new); + } + @Override public Receive createReceive() { return receiveBuilder() @@ -35,10 +39,14 @@ class PrintMyActorRefActor extends AbstractActor { //#start-stop class StartStopActor1 extends AbstractActor { + static Props props() { + return Props.create(StartStopActor1.class, StartStopActor1::new); + } + @Override public void preStart() { System.out.println("first started"); - getContext().actorOf(Props.create(StartStopActor2.class), "second"); + getContext().actorOf(StartStopActor2.props(), "second"); } @Override @@ -57,6 +65,11 @@ class StartStopActor1 extends AbstractActor { } class StartStopActor2 extends AbstractActor { + + static Props props() { + return Props.create(StartStopActor2.class, StartStopActor2::new); + } + @Override public void preStart() { System.out.println("second started"); @@ -79,7 +92,11 @@ class StartStopActor2 extends AbstractActor { //#supervise class SupervisingActor extends AbstractActor { - ActorRef child = getContext().actorOf(Props.create(SupervisedActor.class), "supervised-actor"); + static Props props() { + return Props.create(SupervisingActor.class, SupervisingActor::new); + } + + ActorRef child = getContext().actorOf(SupervisedActor.props(), "supervised-actor"); @Override public Receive createReceive() { @@ -92,6 +109,10 @@ class SupervisingActor extends AbstractActor { } class SupervisedActor extends AbstractActor { + static Props props() { + return Props.create(SupervisedActor.class, SupervisedActor::new); + } + @Override public void preStart() { System.out.println("supervised actor started"); @@ -119,7 +140,7 @@ public class ActorHierarchyExperiments { public static void main(String[] args) throws java.io.IOException { ActorSystem system = ActorSystem.create("testSystem"); - ActorRef firstRef = system.actorOf(Props.create(PrintMyActorRefActor.class), "first-actor"); + ActorRef firstRef = system.actorOf(PrintMyActorRefActor.props(), "first-actor"); System.out.println("First: " + firstRef); firstRef.tell("printit", ActorRef.noSender()); @@ -151,7 +172,7 @@ class ActorHierarchyExperimentsTest extends JUnitSuite { @Test public void testStartAndStopActors() { //#start-stop-main - ActorRef first = system.actorOf(Props.create(StartStopActor1.class), "first"); + ActorRef first = system.actorOf(StartStopActor1.props(), "first"); first.tell("stop", ActorRef.noSender()); //#start-stop-main } @@ -159,7 +180,7 @@ class ActorHierarchyExperimentsTest extends JUnitSuite { @Test public void testSuperviseActors() { //#supervise-main - ActorRef supervisingActor = system.actorOf(Props.create(SupervisingActor.class), "supervising-actor"); + ActorRef supervisingActor = system.actorOf(SupervisingActor.props(), "supervising-actor"); supervisingActor.tell("failChild", ActorRef.noSender()); //#supervise-main } diff --git a/akka-docs/src/test/java/jdocs/tutorial_2/IotSupervisor.java b/akka-docs/src/test/java/jdocs/tutorial_2/IotSupervisor.java index 0dc9070511..50562795b2 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_2/IotSupervisor.java +++ b/akka-docs/src/test/java/jdocs/tutorial_2/IotSupervisor.java @@ -15,7 +15,7 @@ public class IotSupervisor extends AbstractActor { private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); public static Props props() { - return Props.create(IotSupervisor.class); + return Props.create(IotSupervisor.class, IotSupervisor::new); } @Override diff --git a/akka-docs/src/test/java/jdocs/tutorial_3/Device.java b/akka-docs/src/test/java/jdocs/tutorial_3/Device.java index 404e5d0964..ed7417aa52 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_3/Device.java +++ b/akka-docs/src/test/java/jdocs/tutorial_3/Device.java @@ -27,7 +27,7 @@ public class Device extends AbstractActor { } public static Props props(String groupId, String deviceId) { - return Props.create(Device.class, groupId, deviceId); + return Props.create(Device.class, () -> new Device(groupId, deviceId)); } public static final class RecordTemperature { diff --git a/akka-docs/src/test/java/jdocs/tutorial_3/inprogress2/DeviceInProgress2.java b/akka-docs/src/test/java/jdocs/tutorial_3/inprogress2/DeviceInProgress2.java index 161993d819..5ccfe25cc1 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_3/inprogress2/DeviceInProgress2.java +++ b/akka-docs/src/test/java/jdocs/tutorial_3/inprogress2/DeviceInProgress2.java @@ -26,7 +26,7 @@ class Device extends AbstractActor { } public static Props props(String groupId, String deviceId) { - return Props.create(Device.class, groupId, deviceId); + return Props.create(Device.class, () -> new Device(groupId, deviceId)); } //#read-protocol-2 diff --git a/akka-docs/src/test/java/jdocs/tutorial_4/Device.java b/akka-docs/src/test/java/jdocs/tutorial_4/Device.java index a3bc53d683..ed5877692a 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_4/Device.java +++ b/akka-docs/src/test/java/jdocs/tutorial_4/Device.java @@ -29,7 +29,7 @@ public class Device extends AbstractActor { } public static Props props(String groupId, String deviceId) { - return Props.create(Device.class, groupId, deviceId); + return Props.create(Device.class, () -> new Device(groupId, deviceId)); } public static final class RecordTemperature { diff --git a/akka-docs/src/test/java/jdocs/tutorial_4/DeviceGroup.java b/akka-docs/src/test/java/jdocs/tutorial_4/DeviceGroup.java index 954734bd69..cbb5cc37fe 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_4/DeviceGroup.java +++ b/akka-docs/src/test/java/jdocs/tutorial_4/DeviceGroup.java @@ -31,7 +31,7 @@ public class DeviceGroup extends AbstractActor { } public static Props props(String groupId) { - return Props.create(DeviceGroup.class, groupId); + return Props.create(DeviceGroup.class, () -> new DeviceGroup(groupId)); } //#device-group-register //#device-group-remove diff --git a/akka-docs/src/test/java/jdocs/tutorial_4/DeviceManager.java b/akka-docs/src/test/java/jdocs/tutorial_4/DeviceManager.java index 6782030364..98350c2cf7 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_4/DeviceManager.java +++ b/akka-docs/src/test/java/jdocs/tutorial_4/DeviceManager.java @@ -19,7 +19,7 @@ public class DeviceManager extends AbstractActor { private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); public static Props props() { - return Props.create(DeviceManager.class); + return Props.create(DeviceManager.class, DeviceManager::new); } //#device-manager-msgs diff --git a/akka-docs/src/test/java/jdocs/tutorial_5/Device.java b/akka-docs/src/test/java/jdocs/tutorial_5/Device.java index 93235c4ba1..9390d1afca 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_5/Device.java +++ b/akka-docs/src/test/java/jdocs/tutorial_5/Device.java @@ -27,7 +27,7 @@ public class Device extends AbstractActor { } public static Props props(String groupId, String deviceId) { - return Props.create(Device.class, groupId, deviceId); + return Props.create(Device.class, () -> new Device(groupId, deviceId)); } public static final class RecordTemperature { diff --git a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroup.java b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroup.java index ff3459aaf1..3a6bd527e6 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroup.java +++ b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroup.java @@ -28,7 +28,7 @@ public class DeviceGroup extends AbstractActor { } public static Props props(String groupId) { - return Props.create(DeviceGroup.class, groupId); + return Props.create(DeviceGroup.class, () -> new DeviceGroup(groupId)); } public static final class RequestDeviceList { diff --git a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroupQuery.java b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroupQuery.java index 0de878d056..f3fc0584b9 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroupQuery.java +++ b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceGroupQuery.java @@ -45,7 +45,7 @@ public class DeviceGroupQuery extends AbstractActor { } public static Props props(Map actorToDeviceId, long requestId, ActorRef requester, FiniteDuration timeout) { - return Props.create(DeviceGroupQuery.class, actorToDeviceId, requestId, requester, timeout); + return Props.create(DeviceGroupQuery.class, () -> new DeviceGroupQuery(actorToDeviceId, requestId, requester, timeout)); } @Override diff --git a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceManager.java b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceManager.java index 6cd29a9954..d3426d5160 100644 --- a/akka-docs/src/test/java/jdocs/tutorial_5/DeviceManager.java +++ b/akka-docs/src/test/java/jdocs/tutorial_5/DeviceManager.java @@ -18,7 +18,7 @@ public class DeviceManager extends AbstractActor { private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); public static Props props() { - return Props.create(DeviceManager.class); + return Props.create(DeviceManager.class, DeviceManager::new); } public static final class RequestTrackDevice { diff --git a/akka-docs/src/test/scala/tutorial_1/ActorHierarchyExperiments.scala b/akka-docs/src/test/scala/tutorial_1/ActorHierarchyExperiments.scala index 9564ccd9ac..ba340a0ec4 100644 --- a/akka-docs/src/test/scala/tutorial_1/ActorHierarchyExperiments.scala +++ b/akka-docs/src/test/scala/tutorial_1/ActorHierarchyExperiments.scala @@ -11,6 +11,11 @@ package com.lightbend.akka.sample import akka.actor.{ Actor, Props, ActorSystem } import scala.io.StdIn +object PrintMyActorRefActor { + def props: Props = + Props(new PrintMyActorRefActor) +} + class PrintMyActorRefActor extends Actor { override def receive: Receive = { case "printit" ⇒ @@ -22,11 +27,16 @@ class PrintMyActorRefActor extends Actor { import akka.testkit.AkkaSpec +object StartStopActor1 { + def props: Props = + Props(new StartStopActor1) +} + //#start-stop class StartStopActor1 extends Actor { override def preStart(): Unit = { println("first started") - context.actorOf(Props[StartStopActor2], "second") + context.actorOf(StartStopActor2.props, "second") } override def postStop(): Unit = println("first stopped") @@ -35,6 +45,11 @@ class StartStopActor1 extends Actor { } } +object StartStopActor2 { + def props: Props = + Props(new StartStopActor2) +} + class StartStopActor2 extends Actor { override def preStart(): Unit = println("second started") override def postStop(): Unit = println("second stopped") @@ -45,15 +60,25 @@ class StartStopActor2 extends Actor { } //#start-stop +object SupervisingActor { + def props: Props = + Props(new SupervisingActor) +} + //#supervise class SupervisingActor extends Actor { - val child = context.actorOf(Props[SupervisedActor], "supervised-actor") + val child = context.actorOf(SupervisedActor.props, "supervised-actor") override def receive: Receive = { case "failChild" ⇒ child ! "fail" } } +object SupervisedActor { + def props: Props = + Props(new SupervisedActor) +} + class SupervisedActor extends Actor { override def preStart(): Unit = println("supervised actor started") override def postStop(): Unit = println("supervised actor stopped") @@ -74,7 +99,7 @@ class ActorHierarchyExperiments extends AkkaSpec { object ActorHierarchyExperiments extends App { val system = ActorSystem("testSystem") - val firstRef = system.actorOf(Props[PrintMyActorRefActor], "first-actor") + val firstRef = system.actorOf(PrintMyActorRefActor.props, "first-actor") println(s"First: $firstRef") firstRef ! "printit" @@ -90,7 +115,7 @@ object ActorHierarchyExperiments extends App { // format: OFF //#start-stop-main -val first = system.actorOf(Props[StartStopActor1], "first") +val first = system.actorOf(StartStopActor1.props, "first") first ! "stop" //#start-stop-main // format: ON @@ -100,7 +125,7 @@ first ! "stop" // format: OFF //#supervise-main -val supervisingActor = system.actorOf(Props[SupervisingActor], "supervising-actor") +val supervisingActor = system.actorOf(SupervisingActor.props, "supervising-actor") supervisingActor ! "failChild" //#supervise-main // format: ON