2016-06-08 26 views
0

Ich versuche, einen Actor zu schreiben, der sich mit einem Amazon Kinesis-Stream verbindet und dann alle über Comet empfangenen Nachrichten an eine Web-Benutzerschnittstelle weiterleitet. Ich benutze Source.actorPublisher dafür und benutze die json-Methode mit Comet in Play beschrieben here. Ich habe die Ereignisse mit Source.tick() gut funktionieren, aber wenn ich versuchte, einen ActorPublisher zu verwenden, scheint der Actor nie gesendet werden Request Nachrichten wie erwartet. Wie werden Datenanfragen normalerweise in einen Akka-Fluss gesendet? Ich benutze v2.5 von Play Framework.ActorPublisher als Comet-Ereignisquelle in Play-Anwendung

Mein Controller-Code:

def subDeviceSeen(id: Id): Action[AnyContent] = Action { 
    val deviceSeenSource: Source[DeviceSeenMessage, ActorRef] = Source.actorPublisher(DeviceSeenEventActor.props) 
    Ok.chunked(deviceSeenSource 
    .filter(m => m.id == id) 
     .map(Json.toJson(_)) 
     via Comet.json("parent.deviceSeen")).as(ContentTypes.JSON) 
} 

Bin ich etwas offensichtlich falsch in der oben tun? Hier ist meine Schauspieler Code:

object DeviceSeenEventActor { 
    def props: Props = Props[DeviceSeenEventActor] 
} 

class DeviceSeenEventActor extends ActorPublisher[DeviceSeenMessage] { 

implicit val mat = ActorMaterializer()(context) 

val log = Logging(context.system, this) 

def receive: Receive = { 
    case Request => log.debug("Received request message") 
        initKinesis() 
        context.become(run) 
    case Cancel => context.stop(self) 
} 

def run: Receive = { 
    case vsm:DeviceSeenMessage => onNext(vsm) 
           log.debug("Received request message") 
           onCompleteThenStop() //we are currently only interested in one message 
    case _:Any     => log.warning("Unknown message received by event Actor") 
} 

private def initKinesis() = { 
    //init kinesis, a worker is created and given a reference to this Actor. 
    //The reference is used to send messages to the actor. 
} 

}

Die 'Received Anforderungsmeldung' Protokollzeile nie angezeigt wird. Fehle ich etwas implizit? In der Spielekonsole werden keine Warnungen oder andere offensichtliche Dinge angezeigt.

Antwort

0

Das Problem war, dass ich Mustervergleich auf case Request => ... statt case Request() => ... war. Da ich in meiner -Methode keinen Standardfall hatte, wurde die Nachricht einfach vom Actor gelöscht.