Mensagens JMS agendadas Just-In-Time
Uma feature muito legal de mensagens JMS é a possibilidade de poder agendar quando uma mensagem deverá ser recebida pelo MDB. Eu não sei se isso faz parte da especificação, ou se apenas o JBoss possui isso. O exemplo que eu vou demonstrar funciona apenas para o JBoss.
Primeiro vamos a um cenário onde este agendamento é útil.
Vamos supor que a seguinte regra é solicitada: Ao tentarmos cobrar o cartão do cliente, se a operadora retornar transação negada, o sistema deve re-tentar cobrar este cartão por mais 2 dias, sendo que cada tentativa deve ser feita após 24hs.
É possível resolver este requisito usando banco de dados e as famosas flags, mas essa definitivamente não é uma solução elegante. Imagina que você precisaria ficar fazendo pooling no banco para ver quais cobranças já passaram de 24 horas para processa-las novamente. Ou seja, horrível.
Com JMS dá pra fazer algo muito melhor. Se quando a compra é feita, retornar negado, basta enviar uma mensagem JMS pra fila, agendando essa mensagem para ser processada apenas após 24 horas. Quando der essas 24hhs, o MDB lê a mensagem e chama novamente o módulo de cobrança.
Muito simples e elegante. Sem pooling, sem ficar controlando status manualmente, nem nada desse tipo.
O código para fazer isso é extremamente simples:
Pronto, você acabou de agendar a entrega da sua mensagem para daqui a 24 horas. Essa conta maluca aí é porque a data precisa ser passada em milisegundos. Eu sou um grande fã de JMS, e essa é mais uma das caracteristicas que me fazem gostar dessa tecnologia. []’s
ObjectMessage message = session.createObjectMessage();</code></code></code>
message.setLongProperty("JMS_JBOSS_SCHEDULED_DELIVERY", (new Date().getTime() + (1000 * 60 * 60 * 24)));
August 30th, 2008 at 1:51 am
huummm, para esse tipo de situação prefiro usar o quartz, mas a sua solução é bem simples… parabens!!!
September 1st, 2008 at 12:22 am
Parabéns pelo Mestrado!! E parabéns pelo blog, fiquei surpresa! Até pra mim (uma leiga total), achei a leitura super leve e dinâmica!
Te amo! Beijão!!!
September 11th, 2008 at 4:34 pm
Luiz, não surtiria o mesmo efeito se eu configurasse o MDB para reprocessar a mensagem a cada 24 horas, no máximo 3 vezes ?