1
+ package com .anistal .cluster .actors
2
+
3
+ import akka .actor ._
4
+ import akka .cluster .ClusterEvent ._
5
+ import akka .cluster ._
6
+ import akka .cluster .pubsub .DistributedPubSub
7
+ import akka .cluster .pubsub .DistributedPubSubMediator .Put
8
+ import com .anistal .cluster .actors .BackendMessages .{BackendMessageGet , BackendMessagePut , BackendMessageStart }
9
+ import com .anistal .cluster .actors .FrontendMessages .FrontendMessageQuery
10
+ import com .anistal .cluster .constants .ClusterConstants
11
+ import com .anistal .cluster .helpers .SocialHelper
12
+ import com .anistal .cluster .models .{GithubItem , TwitterModel }
13
+ import com .redis .RedisClient
14
+ import com .typesafe .config .Config
15
+ import org .json4s .DefaultFormats
16
+ import org .json4s .native .Serialization ._
17
+
18
+ import scala .collection .mutable .Queue
19
+
20
+ class BackendActor (config : Config ) extends Actor with ActorLogging {
21
+
22
+ implicit val formats = DefaultFormats
23
+
24
+ val cluster = Cluster (context.system)
25
+ var messages = Queue [Seq [GithubItem ]]()
26
+
27
+ lazy val socialHelper = new SocialHelper (config)
28
+ lazy val redisClient = new RedisClient (" 172.19.1.170" , 6379 )
29
+
30
+ val mediator = DistributedPubSub (context.system).mediator
31
+ mediator ! Put (self)
32
+
33
+ override def preStart (): Unit =
34
+ cluster.subscribe(
35
+ subscriber = self,
36
+ initialStateMode = InitialStateAsEvents ,
37
+ classOf [MemberEvent ], classOf [UnreachableMember ])
38
+
39
+ override def postStop (): Unit = cluster.unsubscribe(self)
40
+
41
+ def receive = {
42
+ case BackendMessageStart =>
43
+ if (messages.isEmpty)
44
+ (1 to ClusterConstants .GithubMaxNumberOfQueries ).foreach(x => {
45
+ log.info(" Received BackendMessageStart" )
46
+ val githubProjects = socialHelper.githubQuery(
47
+ ClusterConstants .GithubEndpoint ,
48
+ ClusterConstants .GithubParams + (" page" -> x.toString),
49
+ ClusterConstants .GithubNumberOfElements )
50
+ (messages ++= githubProjects.items.grouped(10 ))
51
+ })
52
+ else log.info(" The queue is not empty yet" )
53
+
54
+
55
+ case BackendMessageGet =>
56
+ if (messages.nonEmpty) {
57
+ log.info(s " Message requested from ${sender()}" )
58
+ sender() ! FrontendMessageQuery (messages.dequeue())
59
+ }
60
+
61
+ case BackendMessagePut (twitterModel) =>
62
+ val twitterModelJson = write[TwitterModel ](twitterModel)
63
+
64
+ if (redisClient.exists(s " ${twitterModel.id}: ${twitterModel.keyword}" ) == false ) {
65
+ redisClient.lpush(" main:timeline" , twitterModelJson)
66
+ redisClient.lpush(s " ${twitterModel.keyword}:timeline " , twitterModelJson)
67
+ redisClient.publish(" main:timeline" , twitterModelJson)
68
+ redisClient.publish(s " ${twitterModel.keyword}:timeline " , twitterModelJson)
69
+ }
70
+ }
71
+ }
72
+
73
+ case object BackendMessages {
74
+
75
+ case object BackendMessageStart
76
+ case object BackendMessageGet
77
+ case class BackendMessagePut (twitterModel : TwitterModel )
78
+ }
0 commit comments