44
55package akka .actor .typed .eventstream ;
66
7- // #imports
7+ import static akka .actor .typed .javadsl .Adapter .spawn ;
8+ import static akka .actor .typed .javadsl .Adapter .toClassic ;
9+
10+ import akka .actor .Actor ;
811import akka .actor .AllDeadLetters ;
912import akka .actor .SuppressedDeadLetter ;
13+ import akka .actor .Terminated ;
1014import akka .actor .testkit .typed .javadsl .ActorTestKit ;
1115import akka .actor .testkit .typed .javadsl .TestProbe ;
1216import akka .actor .typed .Behavior ;
1317import akka .actor .typed .Props ;
1418import akka .actor .typed .SpawnProtocol ;
1519import akka .actor .typed .SpawnProtocol .Spawn ;
1620import akka .actor .typed .eventstream .EventStream .Publish ;
17- import akka .actor .typed .eventstream .EventStream .Subscribe ;
18- import akka .actor .typed .javadsl .AbstractBehavior ;
19- import akka .actor .typed .javadsl .ActorContext ;
2021import akka .actor .typed .javadsl .AskPattern ;
21- import akka .actor .typed .javadsl .Behaviors ;
22- import akka .actor .typed .javadsl .Receive ;
23- import akka .testkit .javadsl .TestKit ;
2422import java .time .Duration ;
2523import java .util .concurrent .CompletionStage ;
24+ import org .junit .Assert ;
2625import org .junit .Test ;
2726import org .scalatestplus .junit .JUnitSuite ;
2827// #imports-deadletter
2928import akka .actor .DeadLetter ;
3029import akka .actor .typed .ActorRef ;
3130import akka .actor .typed .ActorSystem ;
31+ import akka .actor .typed .eventstream .EventStream .Subscribe ;
32+ import akka .actor .typed .javadsl .AbstractBehavior ;
33+ import akka .actor .typed .javadsl .ActorContext ;
34+ import akka .actor .typed .javadsl .Behaviors ;
35+ import akka .actor .typed .javadsl .Receive ;
36+ import org .slf4j .Logger ;
3237// #imports-deadletter
3338
3439public class LoggingDocTest extends JUnitSuite {
3540
3641 @ Test
3742 public void subscribeToDeadLetters () {
38- // #deadletters
39- ActorSystem <DeadLetter > system = ActorSystem .create (Behaviors .empty (), "DeadLetters" );
40- system .eventStream ().tell (new Subscribe <>(DeadLetter .class , system ));
41- // #deadletters
43+ ActorSystem <SpawnProtocol .Command > system = ActorSystem .create (SpawnProtocol .create (),
44+ "DeadLettersSystem" );
45+ // #subscribe-deadletter
46+ ActorRef <DeadLetter > deadLetters = spawn (toClassic (system ), DeadLetterActor .create (),
47+ "DeadLetters" );
48+ system .eventStream ().tell (new Subscribe <>(DeadLetter .class , deadLetters ));
49+ // #subscribe-deadletter
4250 ActorTestKit .shutdown (system );
4351 }
4452
4553 public
4654 // #deadletter-actor
47- static class DeadLetterActor extends AbstractBehavior <String > {
55+ static class DeadLetterActor extends AbstractBehavior <DeadLetter > {
56+
57+ final Logger log = getContext ().getLog ();
4858
49- public static Behavior <String > create () {
59+ public static Behavior <DeadLetter > create () {
5060 return Behaviors .setup (DeadLetterActor ::new );
5161 }
5262
53- public DeadLetterActor (ActorContext <String > context ) {
63+ public DeadLetterActor (ActorContext <DeadLetter > context ) {
5464 super (context );
5565 ActorRef <DeadLetter > messageAdapter = context .messageAdapter (
5666 DeadLetter .class ,
57- d -> d . message (). toString ()
67+ d -> d
5868 );
69+ // subscribe DeadLetter at start up.
5970 context .getSystem ().eventStream ()
6071 .tell (new Subscribe <>(DeadLetter .class , messageAdapter ));
6172 }
6273
6374 @ Override
64- public Receive <String > createReceive () {
65- return newReceiveBuilder ().onMessage (String .class , msg -> {
66- System .out .println (msg );
75+ public Receive <DeadLetter > createReceive () {
76+ return newReceiveBuilder ().onMessage (DeadLetter .class , msg -> {
77+ log .info ("receive dead letter: {} from <{}> to <{}>" , msg , msg .sender (),
78+ msg .recipient ());
6779 return Behaviors .same ();
6880 }).build ();
6981 }
@@ -95,6 +107,8 @@ public Electronic(String artist) {
95107
96108 static class Listener extends AbstractBehavior <AllKindsOfMusic > {
97109
110+ final Logger log = getContext ().getLog ();
111+
98112 public static Behavior <AllKindsOfMusic > create () {
99113 return Behaviors .setup (Listener ::new );
100114 }
@@ -108,15 +122,13 @@ public Listener(ActorContext<AllKindsOfMusic> context) {
108122 public Receive <AllKindsOfMusic > createReceive () {
109123 return newReceiveBuilder ()
110124 .onMessage (Jazz .class , msg -> {
111- System .out .printf ("%s is listening to: %s%n" ,
112- getContext ().getSelf ().path ().name (),
125+ log .info ("{} is listening to Jazz: {}" , getContext ().getSelf ().path ().name (),
113126 msg );
114127 return Behaviors .same ();
115128 })
116129 .onMessage (Electronic .class , msg -> {
117- System .out .printf ("%s is listening to: %s%n" ,
118- getContext ().getSelf ().path ().name (),
119- msg );
130+ log .info ("{} is listening to Electronic: {}" ,
131+ getContext ().getSelf ().path ().name (), msg );
120132 return Behaviors .same ();
121133 }).build ();
122134 }
@@ -168,6 +180,15 @@ public void subscribeToSuppressedDeadLetters() {
168180 // #suppressed-deadletters
169181 system .eventStream ().tell (new Subscribe <>(SuppressedDeadLetter .class , actor ));
170182 // #suppressed-deadletters
183+ Terminated suppression = Terminated .apply (Actor .noSender (), false , false );
184+ SuppressedDeadLetter deadLetter = SuppressedDeadLetter .apply (suppression , Actor .noSender (),
185+ Actor .noSender ());
186+ system .eventStream ().tell (new Publish <>(deadLetter ));
187+
188+ SuppressedDeadLetter suppressedDeadLetter = probe .expectMessageClass (
189+ SuppressedDeadLetter .class );
190+ Assert .assertNotNull (suppressedDeadLetter );
191+ Assert .assertNotEquals (suppression , suppressedDeadLetter .message ());
171192
172193 ActorTestKit .shutdown (system );
173194 }
@@ -181,6 +202,23 @@ public void subscribeToAllDeadLetters() {
181202 system .eventStream ().tell (new Subscribe <>(AllDeadLetters .class , actor ));
182203 // #all-deadletters
183204
205+ Terminated suppression = Terminated .apply (Actor .noSender (), false , false );
206+ SuppressedDeadLetter suppressedDeadLetter = SuppressedDeadLetter .apply (suppression ,
207+ Actor .noSender (),
208+ Actor .noSender ());
209+ system .eventStream ().tell (new Publish <>(suppressedDeadLetter ));
210+ DeadLetter deadLetter = DeadLetter .apply ("deadLetter" , Actor .noSender (), Actor .noSender ());
211+ system .eventStream ().tell (new Publish <>(deadLetter ));
212+
213+ // both of the following messages will be received by the subscription actor
214+ SuppressedDeadLetter receiveSuppressed = probe .expectMessageClass (
215+ SuppressedDeadLetter .class );
216+ Assert .assertNotNull (receiveSuppressed );
217+ Assert .assertNotEquals (suppression , receiveSuppressed .message ());
218+ DeadLetter receiveDeadLetter = probe .expectMessageClass (DeadLetter .class );
219+ Assert .assertNotNull (receiveDeadLetter );
220+ Assert .assertNotEquals (deadLetter .message (), receiveDeadLetter .message ());
221+
184222 ActorTestKit .shutdown (system );
185223 }
186224}
0 commit comments