Artigo Java Magazine 41 - Agendamento de Tarefas em Java

Artigo publicado pela Java Magazine edição 41.

Esse artigo faz parte da revista Java Magazine edição 41. Clique aqui para ler todos os artigos desta edição

Atenção: por essa edição ser muito antiga não há arquivo PDF para download.Os artigos dessa edição estão disponíveis somente através do formato HTML. 

Agendamento de tarefas em Java

Usando o melhor que o Java SE e EE oferecem

Tire o máximo proveito dos recursos de agendamento disponíveis da Java SE e Java EE, e veja como criar uma aplicação Swing de reservas usando vários design patterns

 

Neste artigo, vamos abordar os recursos de agendamento de tarefas disponíveis em Java SE e Java EE. Apresentaremos as classes Timer e TimerTask, presentes na distribuição padrão do Java SE desde a versão 1.3, e o serviço de Timer (Timer Service) acrescentado ao EJB na versão 2.1. Para ilustrar a utilização, criaremos um sistema completo de reservas com interface Swing.

 

Agendamento de tarefas

O agendamento de tarefas permite programar tarefas (Jobs) para execução em momentos específicos, ou periodicamente. Este recuso é suportado nos próprios sistemas operacionais, por exemplo através do agendador de tarefas do Windows ou utilitário cron do Linux/Unix.Veja alguns cenários onde o agendamento de tarefas é útil:

·        Realizar um backup periodicamente

·        Criar diariamente um relatório consolidado de vendas para a gerência

·        Enviar um e-mail para os usuários do sistema cuja senha tenha expirado

·        Verificar a cada cinco minutos se foram copiados novos arquivos para um determinado diretório.

 

O Java oferece elementos para o trabalho com agendamento de tarefas, tanto em sua plataforma Standard como na Enterprise, como veremos em detalhes a seguir.

 

O estudo de caso

Para ilustrar a utilização do agendamento de tarefas com Java, criamos uma aplicação de exemplo que permite a criação de tarefas de verificação automática de expiração de reservas. Poderíamos utilizar este aplicativo em qualquer sistema que trabalhe com o conceito de reserva, como por exemplo hotéis, restaurantes, teatros ou empresas aéreas. A idéia é permitir que o próprio aplicativo verifique e atualize os status de reservas expiradas.

Cada reserva é representada por um objeto da classe br.com.globalcode.model.Reserva. Esta classe tem como atributos um código, uma data de expiração, um status (PENDENTE,CONFIRMADA OU CANCELADA) e um id, que corresponde à chave primária no banco de dados. Veja o código completo na Listagem1.

O acesso aos dados persistidos para as reservas é realizado através da classe br.com.globalcode.dao.ReservasDAO. Além dos métodos diretamente relacionados à manipulação de reservas, esta classe contém os métodos para obtenção e fechamento da conexão com o banco de dados. Usualmente, estes métodos são implementados em uma classe separada, de maneira a serem compartilhados entre os diversos DAOs do aplicativo, mas no exemplo, por simplificação estão na própria ReservasDAO. A figura 1 apresenta o diagrama de classe de ReservasDAO. O código completo desta classe e de todo resto da aplicação está disponível no site da Java Magazine.

Além de reserva também criamos a classe br.com.globalcode.model.Agendamento (Listagem 2), que contém apenas uma descrição e a data e o horário do agendamento. No nosso exemplo o agendamento é sempre diário; por isso esta classe não contém o intervalo para repetição. Note também que, como a classe Agendamento não precisa ser persistida, não criamos um DAO para ela.

 

Figura 1. Diagrama de classe de ReservasDAO

 

Listagem 1. Reserva.

 

package br.com.globalcode.model;

 

import java.text.SimpleDateFormat;

import java.util.Date;

 

public class Reserva {

 public static final SimpleDateFormat

  FORMATADOR_DATA_USUARIO = new SimpleDateFormat("dd/MM/yyyy hh:mm");

 

 private String codigo;

 private Date dataExpiracao;

 private int id;

 private int status = PENDENTE;

 

 public static final int PENDENTE= 1;

 public static final int CANCELADA= 2;

 public static final int CONFIRMADA= 3;

 

 public Reserva() {

 }

 public Reserva(String codigo. Date dataExpiracao){

  this.codigo = codigo;

  this.dataExpiracao = dataExpiracao;

 }

 

 public Reserva(int id, String codigo, Date dataExpiracao){

  this(codigo,dataExpiracao);

  this.id = id;

 }

 public Reserva(int id, String codigo, Date dataExpiracao. int status){

this(codigo,dataExpiracao);

this.id = id;

this.status = status;

 }

 

 

 public String toString(){

  return "Codigo = " + codigo + " data expiração = " + FORMATADOR_DATA_

 USUARIO.format(dataExpiracao) + " id= " + id + "status = " + status;

 }

 

//getters e setters omitidos

}

 

Listagem 2.Agendamento.

 

package br.com.globalcode.model;

 

import java.io.Serializable;

import java.text.SimpleDateFormat;

import java.util.Date;

 

public class Agendamento implements Serializable{

 

 public static final SimpleDateFormat

  FORMATADOR_DATA_USUARIO = new SimpleDateFormat("dd/MM/yyyy   hh:mm");

 private String info;

 private Date data;

 

 public Agendamento() {

 }

 public Agendamento(String info, Date data){

this.info = info;" [...] continue lendo...

Artigos relacionados