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

sexta-feira, 17/07/2009 3:35 pm  

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:

Comunicacao FlexBlazeDS 1

Perspectiva 1

Comunicacao FlexBlazeDS 2

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:

processamentoBlazeDS


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

, , , ,

Este post foi escrito por:

- que escreveu 499 post(s).


Entre em contato

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

  • http://twitter.com/maiconpinto Maicon Pinto

    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…

  • http://intensedebate.com/people/erko erko

    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]

  • http://twitter.com/maiconpinto Maicon Pinto

    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… :D

  • http://twitter.com/eduarmstrong @eduarmstrong

    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()

    • http://twitter.com/maiconpinto Maicon Pinto

      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…

  • http://twitter.com/maiconpinto Maicon Pinto

    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!

    • http://intensedebate.com/people/erko erko

      opa legal, vlw por compartilhar o/