ASP.NET 2.0 – Agendando Tarefas – Task Scheduler [Parte 2]

1 de agosto de 2006 Por portal

ASP.NET – Agendando Tarefas
Conforme comentei no post anterior, após o fim do ciclo de vida de uma pagina o processamento de sua aplicação web termina. Mas em algunas casos você precisa rodar algum job para atualizar por exemplo seu controle de estoque, pegar uma cotação do dolar atualizado, pegar os ultimos preços para atualizar seu shop eletronico. Enfim, a gama de possibilidades é enorme e fazer isso dentro do modelo web não uma tarefa simples.

Bem para facilitar isso eu montei um caso de teste. Para esse teste implementei diretamente no global.asax.

1)  Adicione o método
public void CacheItemRemovedCallback(string key,object value,System.Web.Caching.CacheItemRemovedReason reason)

{

if (reason.Equals(System.Web.Caching.CacheItemRemovedReason.Expired) || reason.Equals(System.Web.Caching.CacheItemRemovedReason.Underused))

{

// Coloque aqui sua codificacao pra acontecer quando o cache expirar

}

 

}

2) Adicionei um segundo método para adicionar os itens ao Cache, é importante você registrar que o cache do asp.net 2.0 pode armazenar qualquer tipo de objeto para esse caso estou armazenando apenas uma string. Pois meu objetivo é apenas agendar uma tarefa que seja disparada quando cache for invalidado. O Cache do asp.net pode está vinculado a uma tabela do banco de dados ou até a um arquivo, disparando a invalidação em caso de alteração. Mas estaremos utilizando o fator tempo como referencia. Observe também que é criado um objeto callback que vai ser responsável por disparar o CacheItemRemovedCallback quando o cache for invalidado.

public void AddJob(string Chave,object Valor,Int32 Minutos)

{

//Adiciona novo agendamento

public void AddJob(string Chave,object Valor,Int32 Minutos)

{

//Adiciona novo agendamento

{

//Adiciona novo agendamento

string IniciarEm = System.DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss");

string ExpirarEm = System.DateTime.Now.AddMinutes(Minutos).ToString("dd/MM/yyyy HH:mm:ss");

System.DateTime ExpirarGeral = System.DateTime.Now.AddMinutes(Minutos);

System.Web.Caching.CacheItemRemovedCallback callback = new System.Web.Caching.CacheItemRemovedCallback(CacheItemRemovedCallback);

System.Web.HttpContext.Current.Cache.Insert(Chave, Valor + "#" + IniciarEm + "#" + ExpirarEm, null, ExpirarGeral, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Default, callback);

}

Já passou a fase de testes, estou agora fazendo novas implementações como fazer o re agendamento automático do prossimo processamento. Para fazer isso dentro do contexto do Global.asax no momento que estiver dentro do evento de invalidação do cache você não tera acesso objeto do cache porque estará fora do contexto.

Para resolver isso eu estou chamando uma pagina via System.Net.WebClient() que se encarrega do agenda mento do novo tempo para expiração do cache.

Aguarde mais detalhes em breve!

[],

Ramon Durães