Java example code for Getting Started

* WiP on Java version of new Hello World

Done:
- implementation for first 3 sections
- tests for first 2 sections

To do:
- formatting
- tests for section 3
- section 4 and 5
- hooking the fragments into the docs themselves

* Finish tutorial_03 conversion

* Converted tutorial 04

* Convert step 5 scala->java

* Reformat Java code (thx IntelliJ IDEA)

* Format using 2 spaces

Really it'd be neat to have something like scalariform for the Java code, too

* Make fields 'private final'

* Make message classes 'public static final'

* Use primitive long/double where possible

* sender() -> getSender()

* Static import of org.junit.Assert....

* Final actor fields

* println() the instruction to hit ENTER to quit

* Use jdocs package for quickstart, too

* Use helper methods for message handling

* Compare doubles specifying a delta

* Keep tutorial steps independent
This commit is contained in:
Arnout Engelen 2017-05-10 02:24:11 -07:00 committed by Patrik Nordwall
parent 20b5e6b955
commit f064d1321a
30 changed files with 2848 additions and 0 deletions

View file

@ -0,0 +1,80 @@
/**
* Copyright (C) 2009-2017 Lightbend Inc. <http://www.lightbend.com>
*/
package jdocs.tutorial_4;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
import akka.actor.Terminated;
import akka.event.Logging;
import akka.event.LoggingAdapter;
import java.util.HashMap;
import java.util.Map;
public class DeviceManager extends AbstractActor {
private final LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this);
public static Props props() {
return Props.create(DeviceManager.class);
}
public static final class RequestTrackDevice {
public final String groupId;
public final String deviceId;
public RequestTrackDevice(String groupId, String deviceId) {
this.groupId = groupId;
this.deviceId = deviceId;
}
}
public static final class DeviceRegistered {
}
final Map<String, ActorRef> groupIdToActor = new HashMap<>();
final Map<ActorRef, String> actorToGroupId = new HashMap<>();
@Override
public void preStart() {
log.info("DeviceManager started");
}
@Override
public void postStop() {
log.info("DeviceManager stopped");
}
private void onTrackDevice(RequestTrackDevice trackMsg) {
String groupId = trackMsg.groupId;
ActorRef ref = groupIdToActor.get(groupId);
if (ref != null) {
ref.forward(trackMsg, getContext());
} else {
log.info("Creating device group actor for {}", groupId);
ActorRef groupActor = getContext().actorOf(DeviceGroup.props(groupId), "group-" + groupId);
getContext().watch(groupActor);
groupActor.forward(trackMsg, getContext());
groupIdToActor.put(groupId, groupActor);
actorToGroupId.put(groupActor, groupId);
}
}
private void onTerminated(Terminated t) {
ActorRef groupActor = t.getActor();
String groupId = actorToGroupId.get(groupActor);
log.info("Device group actor for {} has been terminated", groupId);
actorToGroupId.remove(groupActor);
groupIdToActor.remove(groupId);
}
public Receive createReceive() {
return receiveBuilder()
.match(RequestTrackDevice.class, this::onTrackDevice)
.match(Terminated.class, this::onTerminated)
.build();
}
}