Flex 1.5 no ColdFusion: cfchart, headless e múltiplas configurações da JVM

Assim como o ColdFusion, o Flex 1.5 também é uma aplicação Java, e digamos que você está desenvolvendo um projeto com ambas as tecnologias, normalmente iniciariamos duas instâncias – o ColdFusion standalone e o Flex standalone, ou a instância deles em um deploy num application server como o JRun ou TomCat. Mas o mundo Java é bem mais extensível do que isso e é possíval instalar as duas aplicações (ColdFusion e Flex) sob a mesma instância, iniciando portanto as duas ao mesmo tempo. Rodando as duas sob a mesma instância, sob os mesmos parâmetros de JVM, etc. A Macromedia disponibilizou um technote, há muito tempo atrás, de como instalar o Flex 1.5 no ColdFusion.

Porém, infelizmente isso pode trazer um notório problema que enfretei há muito tempo, no meio do ano passado (sim, esse é um post bem atrasado, mas que ainda sim pode servir de referência). Se seu application server estiver rodando em um servidor headless, isto é, sem monitor, sem placa e capacidade gráfica, o Flex 1.5, na instalação padrão não funciona, pois ele usa a API do Java AWT (Abstract Window Toolkit) para implementar tratamentos com gráficos e afins, e tenta usar processamento de hardware para tal. Como o servidor é headless, não há hardware para responder estas requisições. Em um caso que passei, o servidor era um Linux acessado remotamente por SSH – um verdadeiro “headless server”.

Felizmente há uma solução bem simples e trivial para isso, e a Macromedia (na época) disponibilizou um technote para servidores headless: adicionar o argumento -Djava.awt.headless=true na JVM, para que as instruções do AWT sejam executadas por software. Notem que neste technote, há uma passagem que diz: “Somente configure para headless se sua máquina realmente não tiver placa gráfica, caso contrário a tag cfchart do ColdFusion pode dar erros”.

No meu caso o ColdFusion e o Flex realmente estavam sob a mesma instância, mas o CF só provia as camada de negócios, e não gerava gráficos. Contudo, as outras instâncias do mesmo servidor (todas as instâncias sob o JRun 4) geravam gráficos com cfchart, e o JRun, por padrão, compartilha os parâmetros de inicialização da JVM, de modo que o parâmetro headless seria aplicado também às outras instâncias, inclusive as que tinham apenas o ColdFusion instalado. Mas o servidor era mesmo um headless, então não havia o que temer. Supostamente…

Mas todos os gráficos das outras instâncias do ColdFusion (criados com a tag cfchart) pararam de funcionar após o acréscimo do parâmetro do headless, parâmetro esse necessário para que o Flex instalado sob o mesmo JRun funcionasse!

Em um outro technote da Macromedia, fica claro que a tag cfchart não funciona se você utilizar o argument de headless na JVM (veja um outro technote sobre cfchart, headless e contas de domínio no Windows aqui). Mas oras.. eu precisava do parâmetro de headless para iniciar o Flex, mas não podia utilizá-lo se não os gráficos do ColdFusion paravam de funcionar!

Situaçlão delicada… Posto isso, algumas outras soluções eram possíveis. (1) Instalar uma placa gráfica no servidor, (2) ou rodar as instâncias com parâmetros de JVM diferenciados – algo que o JRun 4 não permite por sua interface administrativa (mas que felizmente se preocuparam em adicionar essa funcionalidade no JRun 4.5 “Cheetah”, em beta).

Então a primeira coisa que passou no momento foi instalar outro JRun, um com as instâncias do Flex 1.5 com ColdFusion, com o parâmetro headless na JVM, e outro JRun com as instâncias do ColdFusion, em que estes precisariam gerar gráficos via cfchart. Isso até descobrir que no JRun 4 é possível sim iniciar as instâncias com parâmetros de JVM separados (inclusive está no Release Notes).

Enfim, essa situação tende a não ser mais vista (já nem era tanto, já que é uma situação específica) com o advento do Flex 2 e a geração local (na máquina do desenvolvedor) dos arquivos, mas ficam por aqui as dicas (e o “causo”).