Atualizar aplicação FLEX no browser

Quando eu faço uma atualização dos arquivos gerados pelo Flex no servidor Web muitas vezes os browsers dos clientes continuam utilizando a versão anterior (porque esta ficou na cache), existe alguma forma de forçar essa atualização sem que cada usuário precise saber?

Eugenio,

Acho que existem várias maneiras de resolver isso, mas uma bem fácil seria criar no HTML que o cara vai utilizar para abrir sua aplicação, uma parametro que será passado para o SWF com a versão. Ex: index.swf?version=1.3

Aí garantir que o HTML não faça cache e provavelmente o browser vai baixar novamente sempre que você alterar esse parâmetro.

[]s

O que geralmente faço, é no arquivo AC_OETags.js trocar a função:

function AC_FL_RunContent(){ var ret = AC_GetArgs ( arguments, ".swf", "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" , "application/x-shockwave-flash" ); AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs); }

por:

function AC_FL_RunContent(){
  var ret = 
    AC_GetArgs
    (  arguments, ".swf?avoidCache=" + new Date(), "movie", "clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
     , "application/x-shockwave-flash"
    );
  AC_Generateobj(ret.objAttrs, ret.params, ret.embedAttrs);
}

Não esquece também de setar no HEAD do HTML o No-CACHE.

Realmente Rafael, é uma possibilidade. Mas temos que tomar cuidado pois, dessa maneira, você irá fazer com que os usuários baixem o SWF novamente a cada acesso. Talvez seja mais interessante manter um parâmetro e alterar ele quando precisar, pois assim você força os usuários a atualizarem quando realmente for necessário.

[]s

Certo. Bom ponto.
Poderia substituir o avoidCache=new Date() por um version=x modificando só a versão quando precisar.

Isso mesmo, acho que com uma variável de versão seria melhor. Só tome cuidado com o arquivo JavaScript, pois o browser geralmente faz cache dele também. Talvez tenha que fazer o esquema no HTML (ou JSP, sei lá) mesmo.

[]s

E os módulos da aplicação???
Geralmente o nome dos módulos é fixo dentro da aplicação e eles também são cacheados não são?

Humm, verdade. Acredito que sejam sim. Precisaria fazer uns testes depois para ver se o Flex consegue gerenciar isso bem ou teriamos que implementar algo a parte. Particularmente, não gosto muito de trabalhar com módulos, por causa de vários problemas que já tivemos com eles. Acho que devem ser usados com muita cautela.

[]s

Tem um outro caso extremo também que é meu cenário atual…
O usuário começa a utilizar a aplicação, ou seja ela é cacheada no browser.
Neste meio tempo o sistema sofre uma manutenção e o swf é alterado.
O usuário que não fechou o browser utilizará uma versão antiga do swf… pior, se os métodos do backend não mudarem significativamente ele pode ficar com aquela versão cacheada eqto estiver com o browser aberto e não dará erro…
Existe alguma maneira de detectar isso e forçar o usuário a atualizar a versão???

Nossa, isso é realmente um problema. Mas seria o mesmo se fosse com Ajax, por exemplo. Você teria uma página aberta sempre e as páginas de requisições em background poderiam já ter sido atualizadas e quebraria a aplicação toda.

Acho que se realmente existe essa necessidade, você teria que chamar um método a cada X minutos e, caso ele retorne uma versão diferente, forçar o usuário a atualizar a aplicação. Mas acho que é algo que você precisa pensar bem antes de fazer, pois é algo que é bem dficil de acontecer. Geralmente os deploys são feitos em horários em que ninguém está trabalhando com a aplicação.

Uma outra solução seria trabalhar com mensageria (<mx: Producer/> e <mx: Consumer/> ) e “avisar” a aplicação de quem estiver usando que ela precisa atualizar, sempre que você fizer deploy.

[]s

Pois é, infelizmente minha aplicação é pra um negócio que funciona 24/7 :frowning:
Bom as idéias para isso foram legais, obrigado André!

É, ai complica um pouco mesmo. Mas o problema não é exclusivo do Flex, de muitas outras maneiras o mesmo problema existiria. Até se fosse um HTML com 20 campos, por exemplo. O cara demora 2 horas pra preencher tudo e, enquanto isso, você mudou a página que recebe o POST para uma esperando 30 parametros e abreviou o nome dos que já tinham. O exemplo é bem forçado, claro, mas também aconteceria o mesmo problema.

Se existe realmente essa necessidade, acho que mensageria seria legal pois você pode “se comunicar” com quem está usando sua aplicação no momento e travar até que o cara dê um refresh nela.

[]s