
1. Sequential processing of messages within an actor: this can be done using Executors.newSingleThreadExecutor
2. Ability to spawn large number of actors on top of a handful JVM threads: this can be done using virtual-threads from Loom.
Combining these two, we will show how to do the following:
• Implement a simple ActorRef (send and ask) and Actor (receive) api
• Handle Future callbacks from inside an actor without race conditions
• Use the same principles for local state management within non-actor Scala classes
• Port a few akka-actor examples and compare both approaches
akka-actors provides a lot more features like supervision, fault tolerance and so on. But, those features may not be essential for your app. If so, following the pattern we described will simplify your code without having to deal with the licensing dilemma.