Skip to content

Instantly share code, notes, and snippets.

▶ curl --silent http://127.0.0.1:8083/stats | python -m json.tool
{
"rollsCounts": [
{
"rolledNumber": 2,
"rollsCount": 5
},
{
"rolledNumber": 1,
"rollsCount": 5
curl http://127.0.0.1:8083/stats
// Output:
{"rollsCounts":[]}
docker run -d -p 5672:5672 -p 15672:15672 dockerfile/rabbitmq
sbt "project game" run
sbt "project webapp" run
sbt "project statistics" run
case class RollCount(rolledNumber: Int, rollsCount: Int)
case class StatsResponseData(rollsCounts: Seq[RollCount])
class GetStatsRequestActor(
ctx: RequestContext,
statsActor: ActorRef)(implicit override val json4sFormats: Formats)
extends Actor
with Json4sSupport {
statsActor ! StatsActor.GetState
context.setReceiveTimeout(2.seconds)
val statsRoute = (path("stats") & get)(handleGetStats)
private def handleGetStats: Route = { ctx =>
actorRefFactory.actorOf(GetStatsRequestActor.props(ctx, statsActor))
}
case class Stats(rollsCounts: Map[Int, Int]) {
def incRollsCount(rolledNumber: Int) = {
val currentCount = rollsCounts.getOrElse(rolledNumber, 0)
copy(rollsCounts = rollsCounts + (rolledNumber -> (currentCount + 1)))
}
}
case class IncRollsCount(rolledNumber: Int) extends Command
case class RollsCountIncreased(rolledNumber: Int) extends Event
case object GetState extends Command
class StatsActor extends PersistentActor {
override val persistenceId = "rolls_stats"
var state: Stats = Stats(Map.empty)
class SubscriberActor(statsActor: ActorRef) extends ActorSubscriber {
override def receive = {
case OnNext(message: Message) =>
for {
eventType <- message.headers.get("type") if eventType == "DiceRolled"
content <- parseOpt(message.body.decodeString("UTF-8"))
JInt(rolledNumber) <- content \ "rolledNumber"
} statsActor ! StatsActor.IncRollsCount(rolledNumber.toInt)
case OnComplete =>
implicit val connection = Connection()
val queue = Queue(queueName, durable = false, autoDelete = true)
val bindArgs = Map("x-match" -> "all", "type" -> "DiceRolled")
val resultFuture = for {
_ <- connection.queueDeclare(queue)
_ <- connection.queueBind(queueName, exchangeName, "", bindArgs)
} yield ()
resultFuture onComplete {