segunda-feira, 11 de junho de 2012

Endpoint só com o contexto

Quando se cria uma aplicação Flex + Java + BlazeDS o services-config.xml é criado dessa forma:
<endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>

E na hora da compilação este arquivo é lido e o compilador no lugar de server.name coloca localhost e em server.port coloca 8080 e context.root é colocado como está configurado no Flash Builder que normalmente é o nome da aplicação.

Enquanto estivermos trabalhando local, tudo funciona beleza, mas quando passamos a nossa aplicação para um servidor de produção, as requisições AMF simplesmente deixam de funcionar porque estão tentando acessar localhost e não o ip ou nome do servidor onde hospedamos, e por segurança o Flash Player não permite acessar algo externo ao servidor.

Para resolver isso eu altero meu endpoint removendo server.name e server.port ficando como abaixo:
<endpoint url="{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/> 

Com isso não me preocupo mais com servidor onde hospedo minha aplicação, só preciso manter o mesmo contexto.

Pode-se mudar também messagebroker/amf, mas para isso será necessário alterar também o web.xml para que o MessageBrokerServlet "saiba" qual url deve interceptar.

Uma outra dica é digitar no navegador: {server.name}/{context.root}/messagebroker/amf se a aplicação foi startada corretamente então irá aparecer uma tela em branco.

Veja também:
Externalizing Service Configuration using BlazeDS and LCDS

5 comentários:

  1. Tem uma forma beeeem simples de alterar esse endereço em runtime, sem nem mesmo precisar criar um novo ChannelSet... dê uma olhada na documentação da classe ServerConfig.as (nao me melbro o pacote dela agora). Mas é essa classe que o compilador cria (em tempo de compilação) e guarda o xml dentro (num atributo static xml:XML). Basta acessar o valor que quiser via e4x e alterar para qualquer atributo, ou usar um método que retorna os ChannelSets. Por ser bindable, todos os remoteObjects irão refletir a mudança.

    Mais info:
    1) http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/mx/messaging/config/ServerConfig.html

    2) http://ria-coder.com/blog/accessing-services-config-values-with-flex

    []'s

    ResponderExcluir
    Respostas
    1. Mário, muito obrigado pelo comentário, lembro vagamente de já ter visto esta ServerConfig, imagino q deve ter sido em algum post seu em algum forum q participamos.

      Vou dar uma estudada no q passou.

      []s

      Excluir
  2. Quais alterações devo fazer no web.xml?

    ResponderExcluir
    Respostas
    1. Gustavo,
      No web.xml vc só altera se vc quiser mudar o caminho do messagebroker para algo diferente do default:
      <servlet-mapping>
      <servlet-name>MessageBrokerServlet</servlet-name>
      <url-pattern>/messagebroker/*</url-pattern>
      </servlet-mapping>

      Mas o url-pattern tem q ser igual ao endpoint url do services-config.xml

      A ideia básica é alterar o endpoint url para ser independente de servidor.

      []s

      Excluir
    2. Entendi.
      Poderia me enviar seu e-mail para goust_arcari@yahoo.com.br

      Gostaria de uma opinião em um problema que estou tendo.

      estou tentando resolver pelo GUJ sem sucesso.
      Será que pode dar uma ajuda?

      Segue o link
      http://www.guj.com.br/java/303125-erro-em-conexoes-remotas


      Excluir