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 =]








terça-feira, 23/03/2010 7:00 pm
Cara ótimo post….
Não consegui entender ainda o que está acontecendo na minha aplicação pois em alguns momentos ele não está enviando meu Cliente, pelo menos é isso que eu consigo ver no log:
Quando não dá erro é enviado assim:
…
[0] = (Typed Object #2 'br.com.empresa.bean.Cliente')
…
Quando dá erro ( qndo fecha e abre o módulo novamente ) é enviado assim:
…
[0] = (Object #2)
…
Bom de qualquer forma parabéns e de repente quando alguém chegar aqui e tiver alguma idéia ou alguma experiencia com o BlazeDS e puder ajudar agradeço….
Abraço aí Erko e + sucesso…
terça-feira, 23/03/2010 7:09 pm
por algum motivo que não sei te explicar o seu objeto não está mapeado com o RemoteClass com isso ele envia um objeto AS3 padrão…
a pergunta é a sua classe está dentro do módulo, ou na app que carrega o módulo? [apenas por curiosidade]
terça-feira, 23/03/2010 8:51 pm
Opa,
Erko a classe Cliente está dentro do pacote, dentro do meu projeto.
Ela é carregada quando chamo o modulo na aplicação.
Está declada como Bindable….
[Bindable]
private var cliente:Cliente = new Cliente;
e depois eu envio o 'cliente' com as informações necessárias….
meu Cliente tem o [RemoteClass(alias="br.com.empresa.bean.Cliente")]
Uma coisa que eu não entendo é que sempre quando eu inicio a aplicação chamo um modulo ( ex Cliente ) para inserir dados ele funciona de boa, porém se eu fechar o modulo e abrir e tentar de novo dá este tipo de erro. E aí não funciona mais, mesmo que feche e abra o modulo.
*isso acontece com todos os outros, então não deve ser algo estranho, é alguma coisa que eu tô deixando passar… mas oq?
vlw pela ajuda…
quinta-feira, 25/03/2010 2:55 pm
Você está "descarregando" o módulo quando fecha a janela? Já tive problema com módulos usando o ModuleLoader. Faça algo como idDoComponente.unloadModule()
quinta-feira, 25/03/2010 4:05 pm
Opa Eudardo…
Não tentei isso não… a princípio não acredito que seja isso, por que existe outra aplicação que esta rodando com o mesmo "padrão", hierarquia e aparentemente com a mesma configuração e não acontece isso…
no entando agradeço a dica, e vou testar assim que der eu digo como resolvi…
vlw abraços…
segunda-feira, 05/07/2010 7:47 pm
Erko consegui encontrar o erro da minha aplicação que estava dando aquele erro:
Para carregar o módulo eu usava:
private function loadModule($module:String):void {
_assetModule = ModuleManager.getModule($module);
_assetModule.addEventListener(ModuleEvent.PROGRESS, onProgress);
_assetModule.addEventListener(ModuleEvent.ERROR, moduleError, false, 0, true);
_assetModule.addEventListener(ModuleEvent.READY, moduleReady);
_assetModule.addEventListener(ModuleEvent.UNLOAD, onUnload);
_assetModule.load();
}
faltou no load "_assetModule.load(ApplicationDomain.currentDomain);"
Espero que ajude alguém se outra pessoa esqueça deste detalhe!
segunda-feira, 05/07/2010 7:51 pm
opa legal, vlw por compartilhar o/