Como criar um alarme em Java Web

12 respostas
wladyband

Saudação pra todos,

Eu sou novo como programador Java, mas tive a oportunidade de conseguir um projeto para fazer parte do meu primeiro Portfólio.
O cliente fez várias exigências, muitas delas eu tenho como suprir as necessidades, mas uma me chamou atenção, ele é um advogado, ele quer cadastrar os clientes e colocar as datas de audiência, que quando chegar a data de audiência o sistema acione uma notificação.
Eu conheço uma maneira de como fazer isso, porém tem um consumo violento de memória, seria o seguinte;

  1. Quando o usuário salvar o cadastro de cliente, o sistema vai gravar automaticamente a data atual e o usuário colocará a data da audiência, o sistema fará uma comparação entre a data atual e a data de audiência, e na ação de comparar ele determinará uma contagem regressiva decrescente até chegar a data de audiência como mostra no modelo super básico do vídeo abaixo;

Agora imagina! se o usuário cadastra 10 clientes em um único dia, quantos contadores ficaram atuando para fazer contagem regressiva ate a data de audiência de cada registro, acredito que o sistema ficará super lento.
Existe uma outra abordagem para esse problema?

12 Respostas

Ruttmann

Não é mais fácil você criar uma rotina que rode uma vez por dia, verifique as próximas audiências e notifique o advogado de algum jeito?

Explique melhor essa situação. O que o cliente realmente quer? Uma agenda que toque alarme pra ele não perder o horário da audiência?

adriano_si

Mas ele quer mesmo com Hora, Minuto e Segundo? Pelo que você me falou, quer fazer um cronômetro decrescente?

Eu imagino que ele quer saber se o dia da Audiência está próximo ou se chegou. Acho que na lista de clientes dele você pode colorir os registros de acordo com a proximidade da data de Audiência e ordernar pelas audiências mais próximas.

Claro, aí quando ele entrar na tela, tudo o que você precisa fazer é calcular do momento que ele entrou na tela, até a audiência do cliente, quanto tempo falta.

Isso deixa o seu cálculo por requisição e não assíncrono pra cada cliente cadastrado.

Posso ter entendido errado, mas é a minha sugestão pelo que entendi do problema. Vamos conversando.

Atenciosamente.

adriano_si

É válido também… Uma forma seria já na tela de entrada após o login, ele receber uma lista com as audiências do dia.

Melhor ainda, receber isso em sua App Android… :wink:

Fica a dica.

wladyband

adriano_si:
Mas ele quer mesmo com Hora, Minuto e Segundo? Pelo que você me falou, quer fazer um cronômetro decrescente?

Eu imagino que ele quer saber se o dia da Audiência está próximo ou se chegou. Acho que na lista de clientes dele você pode colorir os registros de acordo com a proximidade da data de Audiência e ordernar pelas audiências mais próximas.

Claro, aí quando ele entrar na tela, tudo o que você precisa fazer é calcular do momento que ele entrou na tela, até a audiência do cliente, quanto tempo falta.

Isso deixa o seu cálculo por requisição e não assíncrono pra cada cliente cadastrado.

Posso ter entendido errado, mas é a minha sugestão pelo que entendi do problema. Vamos conversando.

Atenciosamente.

É exatamente isso, ele quer saber se o dia da Audiência está próximo ou se chegou, ele quer sim uma lista de clientes dele que eu possa colorir os registros de acordo com a proximidade da data de Audiência e ordernar pelas audiências mais próximas.

Ele entrar na tela, tudo o que eu preciso é calcular do momento que ele entrou na tela, até a audiência do cliente, quanto tempo falta.

Sendo que não tenho uma minima ideias de qual algoritmo irei utilizar para calcular isso.

Eu já implementei vários tipos de coisas em Java, coisas que um programador Junior sem experiencia faz, mas esse tipo de problema é um desafio para mim.

adriano_si

Relaxa man, é normal irmos pegando novidades e se enrolando. O que você quer é fazer cálculos com Datas, ou seja, com base em 2 datas qual a diferença de tempo entre elas.

Tem uma API épica e eterna do Java (que vai entrar na API da linguagem) chamada JodaTime…

Segue um exemplo e um Link bem mais completo:

public class DiferencaDatas {
	
	public static void main(String[] args) {
		DateTime entrada = new DateTime(2015, 1, 1, 17, 30);
		DateTime audiencia = new DateTime(2015, 2, 20, 14, 0);
		
		int dias = Days.daysBetween(entrada, audiencia).getDays();
		
		System.out.println("Quantidade de dias: " + dias);
	}
}

http://blog.caelum.com.br/o-eterno-problema-de-calcular-a-diferenca-de-dias-entre-duas-datas-em-java/

Pereba que com a API você pode ir BEEEEMMMMM além de só calcular os dias. Vale a pena dar uma boa estudada.

:wink:

wladyband

adriano_si:
Relaxa man, é normal irmos pegando novidades e se enrolando. O que você quer é fazer cálculos com Datas, ou seja, com base em 2 datas qual a diferença de tempo entre elas.

Tem uma API épica e eterna do Java (que vai entrar na API da linguagem) chamada JodaTime…

Segue um exemplo e um Link bem mais completo:

public class DiferencaDatas {
	
	public static void main(String[] args) {
		DateTime entrada = new DateTime(2015, 1, 1, 17, 30);
		DateTime audiencia = new DateTime(2015, 2, 20, 14, 0);
		
		int dias = Days.daysBetween(entrada, audiencia).getDays();
		
		System.out.println("Quantidade de dias: " + dias);
	}
}

http://blog.caelum.com.br/o-eterno-problema-de-calcular-a-diferenca-de-dias-entre-duas-datas-em-java/

Pereba que com a API você pode ir BEEEEMMMMM além de só calcular os dias. Vale a pena dar uma boa estudada.

;)

OPA! valeu, muito obrigado, essa sugestão foi muito boa, mas ainda estou aberto a mais sugestões :stuck_out_tongue:

igor_ks

Eu faria como o Ruttman disse… já que ele quer saber as audiências do dia, é só ter um cadastro das audiencias, e toda dia, na hora X, ele notifica de alguma forma. Alem disso, ao abrir o sistema, essa notificacao tb pode ser emitida. Se ele quer alguma notificacao com 30 minutos de antecedencia (configurável), por exemplo, é só calcular a partir da data e hora da audiencia e diminiuir os minutos, para enviar a notificacao.

Para fazer a rotida de rodar algo em determinado dia/hora/minuto/segundo, tem essa biblioteca chamada Quartz( http://quartz-scheduler.org/ ), nela vc pode configurar para rodar todo dia, na hora X, ou a cada 5 minutos, ou no dia 20 de janeiro de cada ano, entre varias outras coisas.

wladyband

igor_ks:
Eu faria como o Ruttman disse… já que ele quer saber as audiências do dia, é só ter um cadastro das audiencias, e toda dia, na hora X, ele notifica de alguma forma. Alem disso, ao abrir o sistema, essa notificacao tb pode ser emitida. Se ele quer alguma notificacao com 30 minutos de antecedencia (configurável), por exemplo, é só calcular a partir da data e hora da audiencia e diminiuir os minutos, para enviar a notificacao.

Para fazer a rotida de rodar algo em determinado dia/hora/minuto/segundo, tem essa biblioteca chamada Quartz( http://quartz-scheduler.org/ ), nela vc pode configurar para rodar todo dia, na hora X, ou a cada 5 minutos, ou no dia 20 de janeiro de cada ano, entre varias outras coisas.

Eu achei super interessante ser feita dessa forma, mas vou fazer uma pergunta,

Você já fez esse tipo de implementação que quero fazer com essa Biblioteca do Quartz Scheduling?

Porque eu dei uma olhada na documentação e achei pouco intuitivo.

igor_ks

Sim, já usei… vc pode usar ela diretamente, via configuracao XML, ou hardcoded mesmo, ou via Spring, que utiliza o quartz por tras.

Qual a dificuldade que está tendo com ele?

wladyband

igor_ks:
Sim, já usei… vc pode usar ela diretamente, via configuracao XML, ou hardcoded mesmo, ou via Spring, que utiliza o quartz por tras.

Qual a dificuldade que está tendo com ele?

Eu vi esse site

Já executei e ele funcionou.

Ele agenda um a cada 30 segundos um log de mensagem no consoles do eclipse escrito

DEBUG (TestJob.java:13) - TestJob run successfully...

ele funciona com agendamento de 30 segundos, mas como implementar isso e transforma os segundos em dias?

Acho que vou dá uma olhada em notação cientifica! rsrsrs

wladyband

igor_ks:
Eu faria como o Ruttman disse… já que ele quer saber as audiências do dia, é só ter um cadastro das audiencias, e toda dia, na hora X, ele notifica de alguma forma. Alem disso, ao abrir o sistema, essa notificacao tb pode ser emitida. Se ele quer alguma notificacao com 30 minutos de antecedencia (configurável), por exemplo, é só calcular a partir da data e hora da audiencia e diminiuir os minutos, para enviar a notificacao.

Para fazer a rotida de rodar algo em determinado dia/hora/minuto/segundo, tem essa biblioteca chamada Quartz( http://quartz-scheduler.org/ ), nela vc pode configurar para rodar todo dia, na hora X, ou a cada 5 minutos, ou no dia 20 de janeiro de cada ano, entre varias outras coisas.

Vamos supor que para cada registro vai ter um agendamento, e vamos supor que ele cadastrou 10 clientes em um só dia, isso não irá consumir muita memoria?

igor_ks

O Quartz é baseado no cron, então é só olhar o que cada campo significa: http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

Sobre pesado ou não, depende mto do que o job faz, se for só por estar rodando o timer, não é pesado não, já trabalhei em sistemas que possuem diversos jobs agendados e é leve.

Criado 14 de julho de 2015
Ultima resposta 14 de jul. de 2015
Respostas 12
Participantes 4