2015-04-04 5 views
2

У меня есть существующее приложение Spray, использующее Spray Routing, и недавно я добавил актера загрузки файлов в файл based on the example.Spray Routing with File Upload Actor

То, что я не могу понять, состоит в том, как объединить мой существующий актер HttpService с моим файловым исполнителем, который не расширяет HttpService.

Мой существующий корень службы актер выглядит следующим образом:

class RootService extends Actor with HttpService with Routes with ActorLogging { 
    def receive = runRoute { 
     routes 
    } 
} 

И мой загрузить файл актер, как это:

class FileUploadService extends Actor with Logging { 
    def receive = { 
    case part @ HttpRequest(POST, Uri.Path("/upload"), headers, entity: HttpEntity.NonEmpty, protocol) => { 
     val parts = part.asPartStream() 
     val client = sender 
     val handler = context.actorOf(Props(new FileUploadHandler(client, parts.head.asInstanceOf[ChunkedRequestStart]))) 
     parts.tail.foreach(handler !) 
    } 
    case start @ ChunkedRequestStart(HttpRequest(POST, Uri.Path("/upload"), _, _, _)) => { 
     val client = sender 
     val handler = context.actorOf(Props(new FileUploadHandler(client, start))) 
     sender ! RegisterChunkHandler(handler) 
    } 
    } 
} 

Я попытался модифицировать свой корень службы актера следующим образом:

class RootService extends Actor with HttpService with Routes with ActorLogging { 
    val fileUploadActor = context.actorOf(Props[FileUploadService], "fileUploadActor") 
    def receive = runRoute { 
    pathPrefix("upload") { 
     fileUploadActor ! _.request 
    } ~ { 
     route 
    } 
    } 
} 

Но это не работает должным образом. В конечном итоге ответ никогда не возвращает его клиенту (даже если я укажу ask vs tell).

Любые предложения по выполнению работы?

Спасибо!

ответ

3

В RootService, отправьте RequestContext актера загрузки:

def receive = runRoute { 
pathPrefix("upload") { 
    ctx => fileUploadActor ! ctx 
} 
} 

Затем в службе загрузки файла, вы можете использовать runRoute таким же образом, как RootService и выполнить запрос в рамках этой службы. Если у вас есть ссылка на RequestContext, нет необходимости отвечать на RootService.