2013-12-10 7 views
1

Итак, в Spray, после основного примера, я хотел расширить его, чтобы делать больше вещей. Это мой маршрут:Как перенаправить запрос другому актеру в Spray?

val API_ROUTING_TREE: Route = pathPrefix("api") { 

    pathPrefix("content") { 

     pathPrefix("rendered"/Segment) { 

     pageName => { 

      /*Matches /block/{template}/{blockName}*/ 
      pathPrefix("block"/Segment) { 

      templateName => { 

       path(Segment) { 

       blockName => (get | post) { 
        ??????????WHAT DOES GO HERE??????????????? 
       } 

       } 
      } 
      } 
     } 
     } 
    } ~ 
     path("structured") { 
     failWith(new RuntimeException("Not Implemented")) 
     } 
    } 

Конечно, это не скомпилировано из-за недостающей части. Я хотел бы просто отправить запрос (или, возможно, запрос, инкапсулированный с уже извлеченными параметрами) другому актеру, например myActor! запрос ... Это не работает. Я не могу найти примеров для этого или они действительно не подходят.

+1

Это зависит от того, что другой актер должен делать с запрос? Есть ли у другого актера также маршруты? Или это просто дает результат для этого точного запроса? – jrudolph

+0

Это должно привести к результату, но мне все еще нужен объект Request. Таким образом, будет нормально иметь весь запрос или иметь возможность отправлять класс, содержащий его, а также другие данные. – gotch4

+0

Просто чтобы показать, что это можно сделать, ознакомьтесь с этим парнем код: https://github.com/mhamrah/spray-sample/blob/master/src/main/scala/basic/BasicSample.scala – byrnedo

ответ

3

Вы можете сослаться на этот замечательный пример и посмотреть на код - Akka and Spray Вы увидите, что этот пример показывает, как можно делегировать обработку от маршрута к другому актеру. Если вы последуете за ним, вы должны решить проблему компиляции, с которой, похоже, сталкиваетесь с использованием «?» как я сделал ...

2

насчет

complete { 
    actor ? request 
} 
+0

Является ли это завершение запроса асинхронно – gotch4

+0

@ gotch4 да, это – 1esha

+0

Он не компилируется, поскольку объект запроса не входит в область – gotch4

0

Когда супервизор игрок вызван, например:

TemplateActors.templateSupervisor ! new TemplateMessage("***POST***", 1) 

Следующий код выполняется (принадлежит к тому же классу):

import akka.actor.{ Actor, Props, ActorLogging } 

/** 
* Actor TemplateSupervisor 
*/ 
class TemplateSupervisor extends Actor with ActorLogging { 
    import scala.concurrent.duration._ 
    import akka.actor.SupervisorStrategy._ 
    import akka.actor.OneForOneStrategy 

Создание нового Актеры

val templateActor = context.actorOf(Props[ TemplateActor ], "TemplateActor")) 
    val templateActor2 = context.actorOf(Props[ TemplateActorJuan ], "juan_carlos_actor") 

путь запроса от Actor templateActor

//log.info("path templateActor2: " + templateActor2.path) 
    //log.info("path templateActor: " + templateActor.path  

Мы послали сообщение Актер:

// sent message 
    def receive = { 
    // Forward message to templateActor 
    case message: TemplateMessage => templateActor forward message 
    } 

    override val supervisorStrategy = OneForOneStrategy() { 
    case exception: Exception => 
     exception.printStackTrace() 
     log.error(exception, exception.getMessage()) 
     Restart 
    } 
} 

/** 
* TemplateActor 
*/ 
class TemplateActor extends Actor with ActorLogging { 

    import akka.pattern._ 
    import scala.concurrent.{Future, ExecutionContext} 

    implicit val _: ExecutionContext = context.dispatcher 
    val actor = context.actorSelection("//ms-service-executor/user/TemplateSupervisor/juan_carlos_actor") 
    def receive = { 
    case message: TemplateMessage => 
     log.info("************Realizando PING from TemplateActor") 
     actor ! new PING("PING") 
    case message: PONG => 
     log.info("************PONG make in TemplateActor") 
    } 
} 

/** 
* TemplateActorJuan 
*/ 
class TemplateActorJuan extends Actor with ActorLogging { 

    import akka.pattern._ 
    import scala.concurrent.{Future, ExecutionContext} 
    implicit val _: ExecutionContext = context.dispatcher 
    val actor = context.actorSelection("//ms-service-executor/user/TemplateSupervisor/TemplateActor") 
    def receive = { 
    case message: PING => 
     log.info("************make PONG from TemplateActorJuan") 
     actor ! new PONG("PONG") 
    } 
} 

case class PING(val id: String) 
case class PONG(val id: String) 

TemplateActors Класс

import akka.actor.{ Props, ActorSystem } 
import TemplateSupervisor 

/** 
* Method override for the unique ActorSystem instance 
*/ 
trait Core { 
    implicit def system: ActorSystem 
} 

/** 
* Definition of the ActorSystem and the ExecutionContext 
*/ 
trait BootedCore extends Core { 
    import scala.concurrent.ExecutionContext 

    implicit lazy val system = ActorSystem("ms-service-executor") 
    implicit lazy val ex: ExecutionContext = system.dispatcher 
    sys.addShutdownHook(system.shutdown()) 
} 

/** 
* Template project actors instantiation 
*/ 
trait CoreActors { this: Core => 
    /* 
    * Creacion del actor "TemplateSupervisor" 
    * Props: configuracion del actor 
    * system: unico actor existente 
    */ 
    val templateSupervisor = system.actorOf(Props[ TemplateSupervisor ], "TemplateSupervisor") 
} 

/** 
* Template actor references 
*/ 
object TemplateActors extends BootedCore with CoreActors 
0

Минимальный рабочий пример может быть следующим:

Сначала вы определяете актер:

class MiningActor extends Actor { 
    private val timeRemaining = 10 

    override def receive = { 
     case RemainingMiningTime => sender ! timeRemaining 
    } 
} 

object RemainingMiningTime 

Затем, вы можете связать его с вашим любимым маршрут Спрей

lazy val miningRoute = { 
get { 
    path("mining"/"remaining") { 
    complete { 
     (miningActor ? RemainingMiningTime).mapTo[Int] 
     .map(s => s"Your amber will be mined in $s") 
    } 
    } 
} 

}

Ссылка:

 Смежные вопросы

  • Нет связанных вопросов^_^