<!– .style2 {color: #990000} .style4 {color: #0000FF} .style5 {color: #006600} .style6 {color: #999999} .style7 {color: #000099} .style8 {color: #009999} –>
Titulo: Variáveis compartilhadas
Quando criamos uma várivel que seja de escopo session, application ou server,
o CFMX implementa o seu compartilhamento através da classe java.util.Hashtable, independente do uso do cflock.
Esse compartilhamento ocorre em requisições simultâneas ou concorrentes a essa variável, e a java.util.Hashtable
nos salva neste instante colocando uma requisição atráz da outra, criando um enfileiramento de requisições.
O java.util.Hashtable realiza essa serialização com tanta eficácia que o seu processamento torna-se mais rápido que o
processamento do cflock
.
O uso do cflock se faz necessário quando praticamos intervenções concorretes. Vizualize o forum.mxstudio, lá você vê
ao lado de cada tópico o número de clicks.
Como fazer aquilo em uma variável de aplicação sem perder nenhum click?
Criamos uma fila separa para cada tópico, para isto basta dar um nome a ela.
<cflock name=“clicksTopcUID#idTopico#” timeout=“30″ type=“exclusive”>
<cfset Application.clicks["UID#idTopico#"]=Application.clicks["UID#idTopico#"]+1 />
</cflock>
Mas este exemplo não é suficiente para demonstrar acesso concorrente.
Imagine que você tenha que montar um relatório
extraído de banco, e que esse relatório deva ser para download,
até ai
tudo bem, mas seu ‘amigo’ sugeriu que esse arquivo já venha compactado. Grande ‘amigo’!
Para o código que será demonstrado
é necessária a instalação da CFX_JCompress.
<cflock name=“criando_xls_compactado_usando_lock” timeout=“60″ type=“exclusive”>
<cfquery name=“qEnquete” datasource=“mxstudio”>
SELECT
enquete_perguntas.pergunta,
enquete_respostas.resposta,
enquete_respostas.votos
FROM
enquete_perguntas,
enquete_respostas
WHERE
enquete_respostas.cod_pergunta=enquete_perguntas.cod
ORDER BY
enquete_perguntas.pergunta,
enquete_respostas.resposta
</cfquery>
<cfsavecontent variable=“o_xls”>
<cfheader name=“Content-Type” value=“application/msexcel”>
<table border=“0″ cellspacing=“0″ cellpadding=“0″>
<cfoutput query=“qEnquete” group=“pergunta”>
<tr>
<td colspan=“2″> #qEnquete.pergunta# </td>
</tr>
<tr>
<td>Resposta</td>
<td>Votos</td>
</tr>
<cfoutput>
<tr>
<td> #qEnquete.resposta# </td>
<td>#qEnquete.votos#</td>
</tr>
</cfoutput>
<tr>
<td colspan=“2″> </td>
</tr>
</cfoutput>
</table>
</cfsavecontent>
<cfset Variables.PATH=ExpandPath(“.”)&“\enquete” />
<cfset Variables.XLS=Variables.PATH&“.xls” />
<cfset Variables.ZIP=Variables.PATH&“.zip” />
<cfif FileExists(Variables.XLS)>
<cffile action=“delete” file=“#Variables.XLS#” />
</cfif>
<cffile action=“write” file=“#Variables.XLS#” output=“#o_xls#”>
<cfif FileExists(Variables.ZIP)>
<cffile action=“delete” file=“#Variables.ZIP#” />
</cfif>
<cfx_JCompress action=“new” filein=“#Variables.XLS#” fileout=“#Variables.ZIP#” />
<cffile action=“delete” file=“#Variables.XLS#” />
<cfheader name=“Content-Disposition” value=“attachment;filename=#Variables.ZIP#” />
<cfcontent type=“application/x-zip-compressed” file=“#Variables.ZIP#” deletefile=“yes” />
</cflock>
Veja que o código todo foi travado, isso impede que o xls seja excluído por um outro usuário antes de ter sido compactado,
ou que um zip sobrescreva outro.
Espero que tenham gostado.
Últimos Comentários