Ir para o conteúdo
14 de ago. de 2026·7 min de leitura

A migração do ColdFusion começa antes do fim da licença

Planeie uma migração do ColdFusion que mantenha o tráfego, separe o comportamento CFML do runtime e retire a licença com provas.

A migração do ColdFusion começa antes do fim da licença

Decidir não renovar o ColdFusion define um prazo, não um plano de migração. O trabalho executável é preservar todos os comportamentos dos quais utilizadores e sistemas ligados dependem enquanto o runtime CFML ainda funciona como referência fiável. Se a equipa começar por converter tags para outra linguagem, vai reproduzir a parte menos útil do sistema e ignorar contratos escondidos em resultados da base de dados, sessões, tarefas agendadas, entregas de ficheiros e tratamento de erros.

Uma migração do ColdFusion segura mantém a aplicação atual a servir tráfego enquanto a substituta assume rotas e tarefas em partes mensuráveis. A ordem importa: inventariar o comportamento real, fixar a fronteira da aplicação, isolar a semântica dos dados, mover entradas não visuais e transferir leituras e escritas rota a rota. O servidor antigo só sai quando o tráfego registado comprova a paridade e o rollback deixa de ser útil.

Tratar a não renovação como limite comercial

A não renovação indica quando a organização quer deixar de comprar o produto. Sozinha, não diz o que um servidor instalado fará nessa data. As edições e os modelos de licença diferem, e a Adobe mudou a versão 2025 de chaves de série para Named User Licensing e Feature Restricted Licensing por subscrição. Instalações antigas podem estar sob outras condições. Leia a encomenda, o contrato, os registos de instalação, as datas de suporte e o método de ativação da versão em produção. Um engenheiro não pode deduzir direitos legais pelo simples facto de um processo arrancar.

Separe quatro datas: decisão de renovação, fim do suporte da versão, possível evento de ativação ou direito, e dia em que a produção pode funcionar sem CFML. Podem não coincidir. Compras ou assessoria jurídica esclarecem os direitos; operações testa a ativação num clone isolado. Uma resposta não substitui a outra.

Mantenha o ambiente licenciado estável durante a saída. Congele alterações de runtime, JVM, drivers e limpezas oportunistas de frameworks, salvo exigência de segurança. Cada mudança simultânea enfraquece a referência. Aplique correções suportadas, restrinja a administração e registe JVM, conectores, hotfixes, mappings, fontes de dados, tarefas e serviços externos exatos.

Não prometa uma falha à meia-noite nem funcionamento eterno. As duas afirmações são palpites até alguém ler as condições aplicáveis e testar o mecanismo real. O prazo útil é aquele que as provas sustentam.

Inventariar comportamentos, não extensões

Contar ficheiros CFM e CFC não cria um mapa do sistema. Comece pelos pontos de entrada de produção e siga o que cada um lê, altera, produz e chama. Um template pequeno pode incluir outros ficheiros, invocar um CFC, mudar a sessão, executar SQL, criar um PDF, enviar correio e redirecionar por um handler de erro. O número de linhas não mede risco.

Crie um registo de rotas e tarefas com uma linha por entrada observável. Guarde método e caminho HTTP, autenticação, campos importantes, estado e tipo da resposta, cookies alterados, tabelas lidas ou escritas, ficheiros ou mensagens, chamadas externas e responsável que valida o resultado. Inclua tarefas agendadas, métodos CFC remotos, web services, entradas de ficheiros, mappings administrativos e operações manuais ausentes do repositório.

As dependências incómodas costumam viver fora do CFML. ColdFusion Administrator pode conter credenciais, correio, argumentos JVM, regras sandbox, caminhos de custom tags, tarefas e conectores web. Application.cfc define parte do pedido, mas a configuração do servidor pode mudar o significado do código. Exporte-a e produza um inventário textual comparável. Uma captura de ecrã é uma prova fraca.

Registe uso real antes de eliminar. Guarde modelo da rota, estado, duração, papel autenticado e uma impressão digital segura. Para tarefas, registe início, fim, resultado e artefacto do negócio. Uma página ausente dos logs pode executar no fecho anual. Elimine-a apenas quando um responsável aceitar que ninguém consome o seu comportamento.

Fazer de Application.cfc a primeira fronteira

Application.cfc define o ciclo de vida que a substituta deve reproduzir ou alterar de propósito. Leia onApplicationStart, onSessionStart, onRequestStart, onRequest, onRequestEnd, onError e o tratamento de templates em falta como um fluxo. Veja também Application.cfm e OnRequestEnd.cfm. A CFML Reference da Adobe diz que, quando Application.cfc existe, o ColdFusion ignora esses ficheiros CFM no mesmo contexto. A localização decide qual ciclo corre.

Classifique cada scope por duração e dono. application guarda estado partilhado do processo, session guarda estado do utilizador, request é transitório, server pode atravessar aplicações e variables muda entre templates e componentes. A substituta não precisa dos mesmos nomes, mas deve conservar expiração de sessão, idioma, autorização, correlação e dados de referência visíveis.

Não transporte memória do processo por acidente. Um CFC em application pode guardar dados que o novo serviço acabou de alterar. Dê a cada cache uma origem, expiração, invalidação e dono. Durante operação dupla, desativar uma cache duvidosa costuma ser mais seguro do que recriar as suas peculiaridades.

Transforme o ciclo de vida em middleware e serviços antes da apresentação. Autenticação, resolução de tenant, correlação, mapeamento de exceções e headers pertencem à borda da substituta. Testes nomeados impedem uma rota migrada de contornar regras, e o proxy pode anexar o mesmo ID a ambas as respostas.

Os CFC são vários contratos na mesma extensão

Um CFC pode ser objeto interno, endpoint remoto, singleton com estado ou invólucro SQL. Transformar cada .cfc numa classe preserva ficheiros, mas esconde o contrato público. Classifique cada componente conforme quem o chama e o estado que possui.

Para métodos remotos, registe nome, formatos dos argumentos, valores predefinidos, autenticação, serialização, estado HTTP e formato do erro. Chamadores CFML toleram muitas vezes maiúsculas e tipos flexíveis que um handler TypeScript tipado rejeita. Um valor parecido com array pode ser serializado com colunas e dados próprios de query. Capture os bytes recebidos pelos clientes reais, não o objeto do debugger.

Nos CFC internos, siga primeiro as chamadas. Um componente criado com createObject em templates pode ser um serviço de pedido. Um guardado em application pode precisar de controlo de concorrência. Um método remote sem consumidor externo não deve tornar-se API pública só porque o código o permitia. A exposição é comportamento a verificar.

Defina contratos da substituta em fixtures claras:

{"request":{"method":"GET","path":"/account/orders","sessionRole":"buyer"},"response":{"status":200,"contentType":"text/html; charset=UTF-8","setCookieNames":[],"bodyNormalizers":["csrf-token","generated-at"]}}

A fixture não impõe arquitetura. Define paridade e os campos que podem variar. Acrescente casos negativos para sessão ausente, argumentos inválidos, submissões duplicadas e timeouts. Os erros também têm consumidores.

Separar a mistura de tags antes de traduzir

Templates CFML mistos contêm controlo do pedido, decisões de negócio, acesso a dados e HTML. Uma tradução mecânica mistura as mesmas responsabilidades noutra linguagem. Identifique decisões e contrato da resposta e implemente-os atrás da fronteira da rota existente.

Uma página com valores cfparam, include de autorização, dois cfquery, cfloop, escape cfoutput e redirecionamento após formulário tem um contrato maior que o markup. Inclui valores predefinidos, estado e destino do redirect, submissão dupla, ordenação, apresentação de null, codificação, cookies e talvez uma mensagem esperada por um cliente. Registe tudo antes de mexer.

Mova a apresentação pura em último lugar dentro da rota. Primeiro reproduza o modelo do pedido e as operações de dados; depois renderize um view model estável no novo cliente ou template. Assim, uma interface TypeScript não depende de objetos query desconhecidos e a comparação HTML normaliza tokens variáveis sem esconder diferenças de negócio.

Não redesenhe todos os ecrãs durante a saída. Um redesign muda navegação, validação, acessibilidade e suporte ao mesmo tempo. Parece progresso visível, mas está errado quando a licença define o prazo. Preserve o percurso, retire o runtime e melhore depois com critérios separados.

O objeto query faz parte do contrato

Comprove cada comportamento
O tráfego produtivo verifica paridade de respostas e dados antes de retirar ColdFusion.

A camada query do ColdFusion não transporta apenas SQL. A documentação da Adobe descreve cfquery como objeto com linhas e propriedades RecordCount, ColumnList, SQL, Cached, SQLParameters e ExecutionTime. Templates iteram, tratam colunas como arrays, esperam nomes sem distinguir maiúsculas, executam Query of Queries ou serializam. Um driver PostgreSQL que devolve linhas não reproduz essa semântica.

Inventarie cada fonte e classifique queries como leitura, escrita, transação, procedimento, Query of Queries, SQL dinâmico ou cache. Localize cfqueryparam em falta, mas não misture uma reforma ampla de segurança com paridade salvo exposição imediata. Parametrizar pode mudar conversões implícitas e planos e precisa de testes.

Crie um adaptador que devolva registos de domínio explícitos em vez de imitar uma query universal. No limite antigo capture colunas, ordem, null, precisão, datas e fusos, contagem, chaves geradas e erros. Compare-os no novo limite. Preserve ordem apenas com ORDER BY; se um consumidor depende de ordem acidental, torne-a explícita.

A Adobe documenta QueryExecute com SQL, parâmetros e opções, aceitando arrays ou structs. Ajuda no refactor preparatório ao tornar SQL e ligações visíveis. Não resolve a migração. O contrato difícil está no formato do resultado, transações, configuração e código consumidor.

Use uma ficha pequena por operação importante:

operation: findOpenOrders
inputs: customerId integer, cutoff timestamp UTC
reads: orders, order_items
ordering: orders.created_at DESC, orders.id DESC
nulls: shipped_at remains null
precision: total_amount decimal(18,2), never float
errors: missing customer returns empty rows; unavailable DB returns dependency error

Esta ficha evita que a nova rota devolva as linhas certas noutra ordem, arredonde dinheiro em vírgula flutuante ou converta null da base de dados em texto vazio.

Mover tarefas antes das páginas concorridas

Tarefas agendadas, processadores, feeds e métodos remotos estreitos são bons primeiros cortes porque entradas e saídas são fáceis de registar. Também expõem caminhos, contas de serviço, relays de correio, proxies, idioma, fuso e tentativas que um plano centrado em páginas esquece.

Não copie só a expressão cron. Determine se o ColdFusion evitava sobreposição, como os operadores repetiam falhas, onde ficava o log, qual diretório assumia e se uma execução parcial era repetível. Dê à substituta uma chave de idempotência ou checkpoint se o processo único protegia por acaso. Corra em sombra com entradas copiadas antes de autorizar escritas.

Chamadas CFC remotas e feeds são bons candidatos ao proxy. Encaminhe um grupo interno, compare respostas após normalização aprovada e aumente a autoridade. Executar escritas em sombra pode duplicar efeitos. Compare numa base restaurada ou deixe só uma versão confirmar enquanto a outra propõe alterações.

Esta fase testa deployment, segredos, observabilidade, rollback e propriedade com pouco risco. Se a equipa não opera uma tarefa migrada durante uma falha, não está pronta para rotas de conta ou relatórios.

Colocar o proxy a decidir a ordem

Mova bem os contratos CFC
A CodeHero preserva comportamento invocável sem copiar cada fronteira do componente.

Um reverse proxy ou load balancer deve decidir que implementação possui cada rota. DNS é demasiado grosseiro e um flag dentro de CFML ainda força cada pedido pelo runtime antigo. Operações precisa de uma tabela visível que possa mudar sem publicar as duas aplicações.

Escolha cortes explícitos: caminhos, métodos, hosts, tenants ou grupos estáveis. Evite percentagens em escritas com estado até sessão e dados serem compatíveis. Um formulário submetido de um lado e redirecionado do outro revela diferenças em tokens, mensagens e cache.

Uma ordem prática é:

  1. Recursos estáticos e endpoints de saúde sem estado de negócio.
  2. Tarefas e APIs estreitas só de leitura com fixtures.
  3. Páginas de leitura pelo novo adaptador.
  4. Rotas de escrita com testes de idempotência, transação e rollback.
  5. Autenticação, criação de sessão, uploads, exportações e restantes rotas transversais.

Mantenha uma base autoritativa por corte. Escritas duplas criam reconciliação quando é preciso um retorno limpo. Prefira um writer, alterações compatíveis e auditoria. Se o esquema Postgres de destino difere, introduza-o atrás de um adaptador e mova a propriedade tabela por tabela.

O tráfego registado transforma paridade em prova

Testes unitários provam exemplos escolhidos; tráfego produtivo mostra entradas reais. Capture pedidos e resultados com controlos de privacidade, reproduza-os num ambiente isolado e compare estado, headers, corpo normalizado, efeitos nos dados e efeitos externos. Tokenize campos sensíveis sem perder distinções usadas pelo negócio.

Classifique cada diferença: alteração intencional, campo volátil, defeito antigo aceite provisoriamente ou defeito novo. Normalizadores devem ser estreitos e revistos. Ignorar qualquer data ou ordenar todos os arrays pode fazer uma resposta errada parecer igual. Normalize apenas um campo CSRF, ID ou relógio concreto quando o contrato permitir variação.

Uma verificação HTTP reproduzível pode ser simples:

curl -sS -D old.headers -o old.body -b session.txt https://old.internal/orders/1042
curl -sS -D new.headers -o new.body -b session.txt https://new.internal/orders/1042

O artefacto útil é o relatório, não os comandos. Guarde impressão, estados, headers diferentes, comparação do corpo, alterações da base, efeitos e decisão do revisor. Exija provas de sucesso, recusa de acesso, entradas inválidas, resultados vazios, tentativas e falhas de dependência.

A CodeHero aplica este modelo à escala do código: a plataforma lê toda a árvore com várias linguagens, e um harness de paridade testa a substituta contra tráfego de produção registado. É a medida certa mesmo que construa o seu harness, porque a licença deve ser retirada por comportamento observado, não por contagem de ficheiros.

Mudar escritas mantendo o rollback

Uma rota está pronta para escrever quando a substituta provou a semântica dos dados e o caminho antigo pode voltar sem reparar estado incompatível. Use expand-and-contract: acrescente estruturas compatíveis, publique leitores tolerantes, mova o writer, verifique e remova o antigo só quando o rollback expirar.

As sessões exigem decisão. Pode partilhar store e cookie, traduzir no proxy ou pedir nova autenticação controlada ao grupo migrado. Partilhar só funciona se serialização, expiração, rotação e cifragem coincidirem. Voltar a autenticar costuma ser mais limpo, mas proteja formulários em curso.

Para uploads e ficheiros, defina propriedade fora de discos locais. Confirme nomes, permissões, antivírus existente, retenção e visibilidade atómica. Uma substituta que escreve no contentor enquanto CFML lê uma partilha passa nos testes e perde ficheiros depois.

Defina gatilhos de rollback antes da mudança: defeito de paridade protegido, alteração de erros, fila crescente, invariante violada ou efeito impossível de reconciliar. Diga quem reverte e o que acontece às escritas já aceites. Devolver tráfego sem reconciliar dados não é rollback.

Mova uma família limitada de cada vez e mantenha o código antigo publicável. Depois da janela de provas e aceitação, retire à aplicação antiga o direito de escrever nessa rota. O retorno torna-se uma opção que expira de propósito.

Separar operações da consola antiga

Mantenha as rotas ativas
Modernizamos a arquitetura enquanto um harness verifica as respostas esperadas pelos seus clientes.

A migração continua incompleta enquanto um operador precisar do ColdFusion Administrator para entender ou recuperar o serviço. Mova health checks, logs estruturados, IDs, histórico de tarefas, controlos e estado das dependências para o sistema operacional comum. Preserve o significado dos alertas, não uma consola pelos botões familiares.

Escreva um runbook por carga enquanto o operador CFML ainda pode comparar. Deve explicar deployment, pausa, repetição, rollback, inspeção de pedidos, reconciliação parcial, rotação de segredos e ligação SQL. Teste-o numa falha controlada.

Faça o mesmo com a configuração. Fontes, mappings, correio, fusos e propriedades JVM são entradas ocultas. Reveja a nova configuração, separe segredos e falhe claramente se faltar um valor. Registe a correspondência de cada definição antiga e os descartes intencionais.

Mantenha observabilidade comparável. Use o ID do proxy em logs, auditorias, filas e relatórios. Compare resultados de negócio, não texto de logs. Operações precisa saber se a encomenda 1042 foi aceite uma vez e se a notificação saiu.

Ensaie restauro e recuperação. Restaure dados e configuração em isolamento, reproduza tráfego aceite e confirme que tarefas ficam pausadas até ativação manual. Assim encontra segredos, ficheiros locais, extensões e ordem de arranque ocultos. Um backup nunca restaurado é uma promessa.

Teste a substituta com o mesmo relógio e configuração regional da produção. Fechos mensais, mudanças de hora, fusos SQL, valores JVM e números locais podem escapar a replays normais. Fixe fuso e relógio e inclua casos registados nos limites. Uma data igual no HTML pode selecionar outras linhas ou atrasar uma tarefa uma hora.

Dê dono e condição de remoção a cada camada de compatibilidade. Tradutores de cookies, adaptadores query, normalizadores e leitores de dois esquemas ajudam na mudança, mas tornam-se infraestrutura permanente. Registe cada ponte com dependência antiga, prova necessária e última fase permitida. Elimine-a quando a rota já não precisar de comportamento CFML. A remoção faz parte da aceitação, com revisor e prova produtiva.

Guarde decisões sobre exceções e conversões e ensine à equipa de prevenção as novas fronteiras. Um incidente futuro deve levar a um serviço, query, tarefa ou runbook atual, não a procurar quem recorda um include.

Retirar o ColdFusion depois do trabalho escondido

Zero tráfego no browser não significa zero uso. Reveja histórico do scheduler, firewall, rotas web, contas, sessões SQL, partilhas, correio, monitorização, backups e favoritos administrativos. Procure hosts e IP diretos noutros repositórios e manuais. Mantenha um período de recusa observada em que chamadas inesperadas falhem de modo visível.

Retire autoridade por fases. Desative tarefas, escritas e conectores, remova o nó do proxy e observe. Arquive, quando permitido, código, configuração, deployment, relatórios, licenças e mappings finais. Preserve explicação histórica sem manter um risco executável.

A substituta não deve continuar a modelar conceitos CFML sem significado de negócio. Serviços Go podem possuir pedido e domínio, TypeScript a interação, e Postgres as restrições. A modernização vem depois da paridade mensurável, mas antes das abstrações antigas endurecerem no novo código. Transliterar apenas muda a fatura.

Uma reescrita ColdFusion da CodeHero é entregue em menos de 30 dias e altera a arquitetura em vez de copiar tags. A data interessa porque propriedade das rotas, tráfego, efeitos e diferenças aceites mostram por que o servidor antigo pode sair.

O encerramento final deve ser banal. Nenhuma rota, tarefa, integração ou operador deve notar. Se parecer corajoso, faltam inventário ou provas.

Perguntas frequentes

O ColdFusion deixa de funcionar se não renovarmos a licença?

Não assuma paragem nem continuidade. Verifique versão, contrato, compra, ativação e suporte, pois a Adobe usou modelos diferentes. Teste um clone isolado enquanto compras ou assessoria confirma os direitos.

Devemos passar primeiro de Adobe ColdFusion para Lucee?

Um runtime CFML compatível pode aliviar a licença, mas não remove a arquitetura nem garante identidade. Trate a mudança de runtime como migração própria com testes de paridade.

Podemos traduzir tags CFML diretamente para TypeScript?

A tradução mecânica preserva responsabilidades misturadas e ignora ciclo, queries, sessões e serialização. Defina primeiro o contrato da rota e as operações de dados. Traduza a intenção, não a sintaxe.

O que migrar primeiro numa aplicação ColdFusion?

Comece pelo inventário e ciclo Application.cfc, depois tarefas estreitas ou endpoints de leitura mensuráveis. Páginas concorridas vêm quando deployment, observabilidade, adaptador e rollback já funcionam.

Como substituir objetos query do ColdFusion?

Não crie uma imitação universal salvo compatibilidade temporária. Devolva registos explícitos e teste colunas, null, precisão, ordem, chaves, erros e transações no adaptador.

As aplicações antiga e nova podem servir juntas?

Sim, se um proxy atribuir rotas ou grupos e sessão e dados forem compatíveis. Mantenha um writer por família. Dividir escritas com estado ao acaso causa duplicados.

Como testar a paridade de uma reescrita?

Reproduza tráfego protegido e compare estado, headers, corpo normalizado, dados e efeitos. Reveja cada normalizador e diferença. Ficheiros convertidos e testes unitários não provam comportamento real.

Devemos redesenhar a interface durante a migração?

Normalmente não quando a licença dita o prazo. Um redesign muda percursos e aceitação enquanto o runtime se move. Preserve primeiro o percurso e redesenhe após assumir produção.

Como gerir sessões ColdFusion durante a mudança?

Escolha store compatível, tradução no proxy ou nova autenticação controlada. Teste expiração, rotação, serialização, cifragem, mensagens e formulários ativos. Não deixe cada rota improvisar.

Quando é seguro desligar o servidor ColdFusion?

Quando rotas, tarefas, integrações, sessões SQL, ficheiros e operação não mostrarem dependência. Retire autoridade por fases e observe falhas antes de desligar. Guarde provas e configuração histórica.