Skip to content

Commit 0f38a0c

Browse files
committed
add req-resp (ch14) and move to Akka 2.4.0
1 parent 0009e32 commit 0f38a0c

File tree

6 files changed

+148
-4
lines changed

6 files changed

+148
-4
lines changed

build.sbt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ lazy val chapter07 = project dependsOn (common)
1313
lazy val chapter12 = project dependsOn (common)
1414

1515
lazy val chapter13 = project dependsOn (common)
16+
17+
lazy val chapter14 = project dependsOn (common)

chapter14/build.sbt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Build._
2+
3+
libraryDependencies ++= Seq(akkaActor, akkaTyped, junit)
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/**
2+
* Copyright (C) 2015 Roland Kuhn <http://rolandkuhn.com>
3+
*/
4+
package com.reactivedesignpatterns.chapter14;
5+
6+
import java.io.IOException;
7+
import java.net.DatagramPacket;
8+
import java.net.DatagramSocket;
9+
import java.net.InetSocketAddress;
10+
import java.net.SocketAddress;
11+
12+
public class RequestResponse {
13+
private static final int SERVER_PORT = 8888;
14+
15+
static public class Server {
16+
static public void main(String[] args) throws IOException {
17+
// bind a socket for receiving packets
18+
try (final DatagramSocket socket = new DatagramSocket(SERVER_PORT)) {
19+
20+
// receive one packet
21+
final byte[] buffer = new byte[1500];
22+
final DatagramPacket packet1 = new DatagramPacket(buffer, buffer.length);
23+
socket.receive(packet1);
24+
25+
final SocketAddress sender = packet1.getSocketAddress();
26+
System.out.println("server: received " + new String(packet1.getData()));
27+
System.out.println("server: sender was " + sender);
28+
29+
// send response back
30+
final byte[] response = "got it!".getBytes();
31+
final DatagramPacket packet2 = new DatagramPacket(response, response.length, sender);
32+
socket.send(packet2);
33+
}
34+
}
35+
}
36+
37+
static public class Client {
38+
static public void main(String[] args) throws IOException {
39+
// get local socket with random port
40+
try (final DatagramSocket socket = new DatagramSocket()) {
41+
42+
// send message to server
43+
final byte[] request = "hello".getBytes();
44+
final DatagramPacket packet1 = new DatagramPacket(request, request.length,
45+
new InetSocketAddress("localhost", SERVER_PORT));
46+
socket.send(packet1);
47+
48+
// receive one packet
49+
final byte[] buffer = new byte[1500];
50+
final DatagramPacket packet2 = new DatagramPacket(buffer, buffer.length);
51+
socket.receive(packet2);
52+
53+
final SocketAddress sender = packet2.getSocketAddress();
54+
System.out.println("client: received " + new String(packet2.getData()));
55+
System.out.println("client: sender was " + sender);
56+
}
57+
}
58+
}
59+
60+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/**
2+
* Copyright (C) 2015 Roland Kuhn <http://rolandkuhn.com>
3+
*/
4+
package com.reactivedesignpatterns.chapter14
5+
6+
import akka.actor._
7+
8+
object RequestResponseActors {
9+
10+
case class Request(msg: String)
11+
case class Response(msg: String)
12+
13+
class Requester(responder: ActorRef) extends Actor {
14+
responder ! Request("hello")
15+
16+
def receive = {
17+
case Response(msg) =>
18+
println(s"got response: $msg")
19+
context.system.terminate()
20+
}
21+
}
22+
23+
class Responder extends Actor {
24+
def receive = {
25+
case Request(msg) =>
26+
println(s"got request: $msg")
27+
sender() ! Response("got it!")
28+
}
29+
}
30+
31+
def main(args: Array[String]): Unit = {
32+
val sys = ActorSystem("ReqRes")
33+
val responder = sys.actorOf(Props[Responder], "responder")
34+
val requester = sys.actorOf(Props(new Requester(responder)), "requester")
35+
}
36+
37+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* Copyright (C) 2015 Roland Kuhn <http://rolandkuhn.com>
3+
*/
4+
package com.reactivedesignpatterns.chapter14
5+
6+
import akka.typed._
7+
import akka.typed.ScalaDSL._
8+
import com.typesafe.config.ConfigFactory
9+
10+
object RequestResponseTypedActors {
11+
12+
case class Request(msg: String, replyTo: ActorRef[Response])
13+
case class Response(msg: String)
14+
15+
val responder: Behavior[Request] =
16+
Static {
17+
case Request(msg, replyTo) =>
18+
println(s"got request: $msg")
19+
replyTo ! Response("got it!")
20+
}
21+
22+
def requester(responder: ActorRef[Request]): Behavior[Response] =
23+
SelfAware { self =>
24+
responder ! Request("hello", self)
25+
Total {
26+
case Response(msg) =>
27+
println(s"got response: $msg")
28+
Stopped
29+
}
30+
}
31+
32+
def main(args: Array[String]): Unit = {
33+
ActorSystem("ReqResTyped", Props(ContextAware[Unit] { ctx =>
34+
val res = ctx.spawn(Props(responder), "responder")
35+
val req = ctx.watch(ctx.spawn(Props(requester(res)), "requester"))
36+
Full {
37+
case Sig(ctx, Terminated(`req`)) => Stopped
38+
}
39+
}))
40+
}
41+
}

project/Build.scala

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import sbt._
22

33
object Build {
4-
val akkaVersion = "2.4-M2"
4+
val akkaVersion = "2.4.0"
55

6-
val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion
6+
val akkaActor = "com.typesafe.akka" %% "akka-actor" % akkaVersion
77
val akkaTestkit = "com.typesafe.akka" %% "akka-testkit" % akkaVersion % "test"
88
val akkaContrib = "com.typesafe.akka" %% "akka-contrib" % akkaVersion
9-
val akkaDData = "com.typesafe.akka" %% "akka-distributed-data-experimental" % akkaVersion
10-
val akkaStream = "com.typesafe.akka" %% "akka-stream-experimental" % "1.0"
9+
val akkaDData = "com.typesafe.akka" %% "akka-distributed-data-experimental" % akkaVersion
10+
val akkaStream = "com.typesafe.akka" %% "akka-stream-experimental" % "1.0"
11+
val akkaTyped = "com.typesafe.akka" %% "akka-typed-experimental" % akkaVersion
1112

1213
val amazonAWS = "com.amazonaws" % "aws-java-sdk" % "1.10.14"
1314

0 commit comments

Comments
 (0)