Um tópico um pouco avançado, sobre como funciona o BlazeDS, esta semana tive a necessidade no trabalho de efetuar o monitoramento de uma aplicação em produção que usa o BlazeDS, porém os parâmetros de monitoramento são definidos através de URLs, então como saber como definir o monitoramento para uma aplicação que usa o BlazeDS, por isto a necessidade de compreender como funciona internamento o BlazeDS.
Acredito que por curiosidade ou precisou por algum motivo compreender o funcionamento segue as minhas considerações.
Visão geral da comunicação:

Perspectiva 1

Perspectva 2
Então temos o seguinte fluxo, executado pelo BlazeDS até que ele chegue a minha respectiva classe e método a ser executado:
Descrição:
1 – flex.messaging.MessageBrokerServlet.service(HttpServletRequest,HttpServletResponse)
2 – flex.messaging.endpoints.BaseHTTPEndpoint.service(HttpServletRequest,HttpServletResponse)
3 – flex.messaging.endpoints.amf.SerializationFilter.invoke(ActionContext)
é nesse filtro que é recuperado do InputStream do objeto Request, o objeto AMF para deserializar
o qual carrega um objeto ActionMessage
4 – flex.messaging.endpoints.amf.BatchProcessFilter.invoke(ActionContext)
5 – flex.messaging.endpoints.amf.SessionFilter.invoke(ActionContext)
6 – flex.messaging.endpoints.amf.LegacyFilter.invoke(ActionContext)
7 – flex.messaging.endpoints.amf.MessageBrokerFilter.invoke(ActionContext)
8 – flex.messaging.endpoints.AbstractEndpoint.serviceMessage(Message)
9 – flex.messaging.MessageBroker.routeMessageToService(Message,Endpoint)
10 - flex.messaging.services.RemotingService.serviceMessage(Message)
11 – flex.messaging.services.remoting.adapters.JavaAdapter.invoke(Message)
chama a respectiva classe e método solicitadas pelo RemoteObject no Flex
12 – com.cwbfx.locadora.dao.FilmeDAO.list()
finalmente executa a classe do serviço e respectivo método solicitado lá do Flex, através do RemoteObject
Nota: A aplicação Adobe Flex que utiliza Remote Object efetua uma request para o servidor, e anexa o objeto da requisitação no Post da request, sendo esta com cabeçalho content-type:application/x-amf, o objeto recebido pelo BlazeDS inicialmente deserializado é um flex.messaging.messages.RemotingMessage, o qual possui os atributos:
- destination :: indica qual classe de serviço o BlazeDS deve usar
- operation :: indica qual método da classe de serviço que o BlazeDS deve chamar
- body :: caso a requisição tenha enviado algum objeto para o método a ser executado
espero que esta informação seja útil para mais alguém =]









Pingback: Flex + BlazeDS : como o BlazeDS sabe o que executar?