Dúvida de como recuperar uma msg no akka

9 views
Skip to first unread message

Rodrigo

unread,
May 22, 2012, 10:01:15 AM5/22/12
to scal...@googlegroups.com
Pessoal bom dia,

Estou com uma dúvida de como fazer um processo no akka, atualmente preciso quebrar o processamento em diversos atores e recuperar o dados assim que ele terminar o processamento.

Para isso eu fiz um send message para o ator supervisor (Pai). Funciona perfeitamente, mas cai em um problema que é receber o retorno no cara que iniciou o processo: 

Segue abaixo o exemplo do meu teste.

Ex: 

object MinhaApp extends App {

val system = ActorSystem("ContadorActorSystem")
val actor = system.actorOf(Props[ContadorActor])
// 
(1 to 30).toList foreach( i => 
     actor ! CONTAR
)
}


case class ContadorActor extends Actor {

var contador : Int = 0
val actorPar = context.actorOf(Props[ContadorParActor])
val actorImpar = context.actorOf(Props[ContadorImparActor])


override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {

case _: RuntimeException => Resume
}

def receive = {
case CONTAR => {
contador += 1
sender ! "Retornando  CONTAR  "   
}
case MOSTRAR_CONTA => {
println("Geral: " + contador)
sender ! "Retornando  MOSTRAR_CONTA  "
}
case message => {
sender ! message
}

}
}


Como recupero a msg retornada dentro da MinhaApp ? 

Alguem saberia me ajudar ???? 

Obrigado pessoal.

abss,

Gilberto Garcia

unread,
May 22, 2012, 11:08:51 AM5/22/12
to scal...@googlegroups.com
É passado para os atores uma instância especial chamada sender (que é
o pai), você pode passar uma mensagem para o pai utilizando essa
instância

sender ! resposta , por exemplo...

basta que o pai entenda a mensagem enviada.

aqui tem um exemplo:

http://doc.akka.io/docs/akka/2.0.1/intro/getting-started-first-scala.html



2012/5/22 Rodrigo <dgro...@gmail.com>:

Felipe Hummel

unread,
May 22, 2012, 11:36:58 AM5/22/12
to scal...@googlegroups.com
Ao invés de mandar da "main()" crie um Actor "Main" ou "Master" ou algo do tipo e faça ele mandar as mensagens para ContadorActor.
Posso estar errado, mas acho que mandando mensagens de "fora de um Actor" não é possível capturar mensagens de 'resposta' (no caso mandadas usando o "sender ! ....")

Felipe Hummel

2012/5/22 Gilberto Garcia <giba...@gmail.com>

Rodrigo Almeida

unread,
May 22, 2012, 11:43:41 AM5/22/12
to scal...@googlegroups.com

Puts aí complicou porque eu preciso fazer um processamento X e retornar um xml para o cliente via SOA.

Será que realmente não existe como ? Estou procurando se eu achar qualquer coisa eu posto.

Absss e obrigado

Felipe Hummel

unread,
May 22, 2012, 11:49:31 AM5/22/12
to scal...@googlegroups.com
Ok. Acho que você pode usar o "ask" ao invés do "tell":
Na seção: 

Ask: Send-And-Receive-Future




2012/5/22 Rodrigo Almeida <dgro...@gmail.com>

Gilberto Garcia

unread,
May 22, 2012, 12:28:17 PM5/22/12
to scal...@googlegroups.com

Você pode criar um ator que recebe a resposta e faz a comunicação com o serviço soa.

Paulo "JCranky" Siqueira

unread,
May 22, 2012, 6:17:27 PM5/22/12
to scal...@googlegroups.com

A sugestão do Gilberto faz bastante sentido: um ator cuja responsabilidade é fazer a comunicação via soa.

Outra opção é enviar a msg com '?' ao invés de '!' - você receberá um Future. Dê uma olhada no scaladoc dele que pode te dar algumas idéias. Esse link também pode ajudar: http://doc.akka.io/docs/akka/2.0/scala/futures.html

[]s,

Paulo "JCranky" Siqueira
http://jcranky.com

Rodrigo Almeida

unread,
May 22, 2012, 6:28:56 PM5/22/12
to scal...@googlegroups.com
Pessoal consegui resolver segue minha solução muito obrigado pela ajuda.

val future = actor ? filtro

val result = Await.result(future, timeout.duration).asInstanceOf[ListBuffer[Hotel]]

Agora preciso de uma sugestão: 

Tenho 2 atores onde quebro o processamento, fazendo um testes com 99000 atores o tempo de processamento no router padrão foi de 97 millisegundos e quando adicionar o router de RoundRobinRouter(3) por exemplo o tempo de processamento foi para 773. 

Como posso melhorar o tempo de 97 millisegundos.

Abrigado.

abs.
Reply all
Reply to author
Forward
0 new messages