Monitorando arquiteturas JMS

June 30th, 2009

Qualquer sistema sério precisa de monitoração, isso é um fato. Existem vários pontos para serem monitorados dentro de um sistema, o pessoal da Globo.com fez uma excelente apresentação sobre isso no FISL. Veja em: http://www.slideshare.net/denao/fisl-monitoracao-inteligente

No sistema que eu trabalho aqui na empresa, usamos muito JMS, então para nós, é imprecindível uma monitoração em cima dessa tecnologia.

Para quem não sabe, uma aplicação tenta enviar uma mensagem JMS um número configurado de vezes, caso a aplicação que recebe essa mensagem tenha problemas para receber a mensagem. Após o número X de vezes, a mensagem é enviada para uma DLQ, que traduzindo para o português é “fila-morta”. É este o ponto que estamos monitorando na nossa aplicação.

Criamos um método JMX que é chamado pelo Nagios de tempos em tempos, e que retorna OK se não existe nenhuma mensagem na DLQ, e NOK cc.

Caso retorne NOK, a minha equipe é avisada para que entre em ação e investigar o porquê da mensagem ter ido para a DLQ, e após isso, resgatar a mensagem da DLQ caso necessário.

O código para fazer isso é o seguinte:

public String validateMessagesSentToDLQ() {
   logger.info("+++++ Validando se ha ou nao mensagens na DLQ +++++");
   ObjectName name = null;
   List<SpyMessage> listMessages = null;
   String ret = RETURN_NOK;

   try {
      name = new ObjectName("jboss.mq.destination:service=Queue,name=DLQ");
      listMessages = (List<SpyMessage>) getRmiAdaptor().invoke(name, "listMessages", null, null);
      logger.info("Quantidade de mensages na DLQ: " + listMessages.size());
      if (listMessages.size() == 0) {
         ret = RETURN_OK;
      }
   } catch (Exception e) {
      logger.error("Problemas ao verificar se há mensagens na DLQ!", e);
   }
   return ret;
}

Este código funciona no JBoss 4.0.4. Não sei dizer se funciona em outros servidores ou versões do JBoss, mas se não funcionar, não deve ser difícil adaptar ele.

Bom, tá aí a dica! Recomendo essa monitoração. Já nos ajudou bastante aqui no UOL!

Respeite seu cliente! Mantenha compatibilidade entre versões.

June 17th, 2009

Hoje tive uma surpresa extremamente desagradável. Temos um framework de uma empresa ˜conceituada” que é o responsável pelo core de um sistema crítico que temos aqui na empresa. A empresa responsável lançou recentemente uma nova versão deste framework que possui diversas coisas importantes que estavamos querendo a tempos. Então lá fui eu feliz e contente baixar a nova versão para colocar no projeto. Faço o download e vou ver o README.txt para ver como fazer a migração da versão antiga para a nova versão. Para a minha surpresa leio o seguinte:

“Esta versão é totalmente incompátivel com a versão antiga. Mudamos a API, mudamos as tabelas no banco de dados, ou seja, mudamos tudo. Ah, também não existe nenhuma ferramenta para ajudar na migração”

Ou seja, basicamente um “Dane-se você, se vira se quiser migrar”

Na minha opinião, isso é o cúmulo da falta de respeito com o seu cliente, que usa a sua ferramenta. Tá na hora das empresas entenderem que é uma obrigação manter a compatibilidade entre versões. Eu até entendo que existem mudanças que necessitam quebrar tudo, mas então, nesse caso, a empresa fornecedora deveria ter o dever de prover ferramentas e guias para orientar os clientes em migrações.

Estamos em uma situação delicadissima no projeto. Migrar versões em um projeto que é responsável pelo billing da empresa é sempre um drama. Nessa condições então, onde a empresa fornecedora lavou as mãos então.

Nesse aspecto, eu respeito bastante a Sun e a Oracle. Essas empresas sempre foram bem conservadoras em relação a compatibilidade, e com certeza, é por isso que elas são tão respeitadas e seus produtos atingiram sucesso. Um outro belo exemplo foi a migração de versões do Wordpress, eu simplesmente apertei um botão e a ferramenta se atualizou sozinha.

Já essa empresa que faz esse framework que usamos no projeto sempre foi negligente em relação a mudanças de versões. Mesmo em mudanças de versões minors eles conseguem tornar suas ferramentas incompativeis entre versões! Mas enfim, paciência!

Meu objetivo nesse post é conscientizar os programadores a sempre atentarem para esse ponto. Em um momento que a integração entre sistemas, SOA, ganham força a cada dia, é importantíssimo mantermos compatibilidade quando atualizarmos nossos sistemas. Isso inspira confiança para o cliente do seu sistema/framework/API/serviço. É sempre preciso fazer o possivel e o impossível para isso. E no caso que realmente for imprescindível quebrar a compatibilidade, fazer tudo para ajudar o seu cliente e nunca ˜lavar as mãos˜.

Fica aqui meu desabafo!

Scheduler do JBoss rodando uma hora depois do configurado

June 12th, 2009

Nós passamos por um problema curioso no projeto que eu estou trabalhando aqui no UOL. Nós tinhamos
um processo batch que estava configurado para rodar todos os dias as 3:00 da manhã. Esse processo
batch era iniciado via scheduler do Jboss. O problema é que surpreendentemente o processo ao invez
de rodar as 3:00 da manhã, começpi a rodar as 4:00 da manhã sem nenhum motivo aparente.

A configuração estava feita da seguinte forma:

<mbean code="org.jboss.varia.scheduler.Scheduler"
name="jboss.docs:service=MyScheduler">
<attribute name="TimerName">jboss:service=MyTimer</attribute>
<attribute name="SchedulableClass">br.com.uol.MyScheduler</attribute>
<attribute name="StartAtStartup">true</attribute>
<attribute name="DateFormat">dd/MM/yyyy HH:mm</attribute>
<attribute name="InitialStartDate">01/01/2006 03:00</attribute>
<attribute name="SchedulePeriod">86400000</attribute><!-- Roda uma vez por dia -->
<attribute name="InitialRepetitions">-1</attribute>
<depends>administration:custom=MyJMX</depends>
<depends>
<mbean code="javax.management.timer.Timer"
name="jboss:service=MyTimer"/>
</depends>

</mbean>

Foram levantadas hipóteses que o horário da máquina estava configurado errado, que o timezone estava errado, que
o horário de verão estava configurado errado etc. A gente investigou uma por uma e tudo estava OK.

Até que começou a fase do desespero, de começar a etapa de tentar resolver o problema por tentativa e erro, e dessa
forma, descobrimos o problema.

Por uma razão desconhecida, se o campo “InitialStartDate” é configurado para alguma data dentro do horário de verão,
ele só inicia no horário correto quando estamos no horário de verão. Para resolver esse problema, nós apelamos
e mudamos este campo para 01/09/2006, e finalmente o scheduler começou a rodar conforme esperado, as 3:00 da manhã.

Fica aí a dica para caso alguém também passe por este problema. A versão do JBoss usada é 4.0.4_GA.

É impressionante como horário de verão sempre traz problemas, mesmo a cada ano a gente cercando cada vez mais, sempre
tem algum efeito colateral!

[]’s e até a próxima.

Brincando com AppleScript

January 8th, 2009

De férias no trabalho, as vésperas de viajar, sem muito o que fazer, resolvi brincar um pouco com AppleScript. Meu conhecimento anterior
de AppleScript era nulo, nunca não tinha nem visto como era um código feito em AppleScript, e por isso me surpreendi com a facilidade que
é desenvolver um!!

Eu fiz um scriptzinho de algo que eu já queria faz tempo. Eu queria que quando eu ligasse o meu Mac e entrasse no sistema operacional, ele
falasse algumas palavras! Isso “ainda” gera um certo fascínio nas pessoas, principalmente nos usuários leigos, é algo diferente ver um
computador falando! Como a tarefa foi muito fácil e terminei em 5 minutos, resolvi incrementar um pouquinho meu script e adicionar umas
condicionais para o meu Mac falar frases diferentes dependendo do horário!

Pra começar, o Mac vêm com uma ferramenta chamada “Script Editor”. Ela é muito simples e intuitiva, e possui diversos templates de comandos, o que ajuda muito pra aprender a sintaxe. Sem muito esforço e com a ajuda dessa ferramenta eu desenvolvi o script abaixo:
[sourcecode language='java']
if time of (current date) < 43200 then
tell application "Console"
say "Good Morning, Mr Hespanha"
say "Do you want a coffee?"
end tell
else
if time of (current date) < 64800 then
tell application "Console"
say "Good Afternoon, Mr Hespanha"
say "Time to program!"
end tell
else
tell application "Console"
say "Good night, Mr Hespanha"
say "Time to play!!"
end tell
end if
end if
[/sourcecode]
A chamada a função time of(current date) retorna a quantidade de minutos decorridas no dia.

Os demais comandos são auto-explicativos!

Feito isso, foi só salvar o arquivo como "Application Bundle" e colocar ele pra rodar no login do meu usuário. Como diz o grande Aurélio: “Simple == Beautiful”.

Gostei muito da experiência de desenvolver(se é que se pode falar isso) com AppleScript. Quando voltar de férias pretendo me aventurar
mais e tentar fazer umas coisinhas mais elaboradas!

O Aurelio mantém uma página com vários AppleScripts. Quem quiser conhecer, o endereço é: http://www.aurelio.net/soft/

Pra aprender mais sobre AppleScripts, é só dar uma googada que vão aparecer diversos tutoriais e dicas!!

É isso! Abraços e até a próxima!

Livro recomendado: “Algoritmos em linguagem C”

December 14th, 2008

Faz um tempo eu publiquei uma lista de 10 livros que eu achava fundamental para a formação de um bom programador. Na época, ainda não existia o livro “Algoritmos em linguagem C” do brilhante professor Paulo Feofiloff, então eu gostaria de adicionar mais este livro a minha seleta lista de livros recomendados.

Recomendo este livro tanto para os mais novatos quanto para programadores já experientes. É um livro de leitura agradável e objetiva. Mais do que simplesmente aprender sobre algoritmos, o professor PF dá muita enfase em como escrever bons códigos, bem documentados, e demonstra como provar que um algoritmo está correto por meio de invariantes. Independente de se estar interessado em aprender C ou não, o livro é recomendadissimo, já que é muito simples e trivial fazer um algoritmo em C virar código Java por exemplo.

Bom, tá aí a dica. E quem se interessa por algoritmos, não pode deixar de visitar a página do professor PF, onde há muito material bom sobre: estrutura de dados, teoria dos grafos, otimização combinatória, analise de algoritmos etc etc etc :-)

Palestra sobre “Balanceamento de Cargas em Linux”

November 13th, 2008

Ontem eu assisti a palestra da Fernanda G. Weiden(Google-Suiça) sobre “Balanceamento de Cargas em Linux” no IME-USP.
Meus conhecimentos em rede são bem básicos, praticamente se resumem ao que eu vi na graduação, mas
mesmo assim fui assistir a palestra, confesso que mais pelo nome Google que sempre chama a atenção.
A grande parte do tempo eu viajei no que ela tava falando, apenas em um momento que ela falou de algoritmos pra balanceamento de carga eu me animei pensando “Opa! Agora é minha praia”, mas ela só falou como cada um funcionava e voltou a falar grego! hehehe Mas mesmo não entendendo muito, eu gostei muito da palestra pelo belo exemplo. Pelo que pude entender, na grande parte dos sistemas do Google, eles usam uma solução proprietária que custa uma fortuna pra fazer esse trabalho de balanceamento de carga. O que a Fernanda tem feito na equipe dela é abandonar a solução proprietária e partir para soluções open-source. E o mais legal ainda é que quando eles esbarram no problema de “Não tem nada parecido para Linux”, eles desenvolvem e depois compartilham com a comunidade, chegando até mesmo a fazer commits para o kernel do Linux. É por isso que o Google é uma empresa diferenciada. Quantas empresas no mundo fariam isso?
É ou não é um belo exemplo que deveria ser mais praticado por outras empresas?

Usar -Dmaven.test.skip=true é pecado!

October 30th, 2008

Certa vez estava numa palestra do Vinicius da Globalcode, e ele disse brincando a seguinte frase: “O JMetter é muito louco! Não sei como alguém faz um negócio tão bom como esse e
distribui gratuitamente.”. Eu diria o mesmo a respeito do Maven. O Maven é uma ferramente fantastica e indispensável para todo projeto Java.

Entre as muitas features do Maven que eu gosto, uma das minhas preferidas é que sempre que você precisa compilar o projeto para gerar os seus ears, jars, sars etc, ele executa automaticamente
todos os testes unitários do projeto, e se algum teste não passar ele não compila o projeto. Acho esse recurso formidável para manter a qualidade do projeto.

Porém, infelizmente existe o parâmetro -Dmaven.test.skip=true, que se você passa ele, os testes não são executados. Agora imagine a seguinte situação: “O sprint está aos 45 do segundo tempo, você
precisa gerar o ear do projeto pra fechar o sprint e mostrar pro Product Owner, dai você manda o Maven compilar o projeto e os testes unitários não passam” O que fazer nesta situação? Taca o “Skip Test”
lá e vamos embora certo?

Ao menos na minha opinião, ERRADISSIMO. Neste caso, é sprint NOT DONE e acabou. O código não está apto para ir para produção, afinal, dizem os mais críticos que código não testado é lixo. Eu não tenho
uma opinião tão rígida, mas concordo que é muito arriscado colocar um código em produção sem testa-lo, ainda mais se você escreveu testes pra esse código, e os testes não estão passando.

Usar -Dmaven.test.skip=true é tentador. Eu mesmo já usei várias vezes, sempre com o pensamento que “Ah, o código tá certo, precisa só arrumar os testes mas depois quando tiver tempo eu faço isso”. Hoje,
com mais maturidade eu vejo que isso é um erro feio, e eu aboli completamente este parâmetro da minha vida. Finjo que ele não existe, e tenho até vontade de recompilar o Maven para arrancar ele de vez, para
não correr riscos de ter recaidas. Hehehe

Fica aqui então o recado deste post, se você não conhecia esse parâmetro macabro, continue sem conhecer, se você conhecia mas não usa, excelente, se você conhecia e ainda usa, esta na hora de mudar
a sua mente, deixar de apelar, e começar a testar o código direito. :-)

Um abraço e até a próxima.

New Mac User

September 10th, 2008

Pois eh, sou mais um que estah deixando o mundo dos pcs e partindo pro mundo dos macs. Depois de muito pensar achei que era hora de uma nova maquina, e depois de muito pensar mais ainda, decidi que essa maquina seria um MacBook. Fazia um bom tempo que eu estava querendo comprar um Mac, mas o preco aqui no Brasil sempre me desencorajava, soh que a partir de uns tempos pra cah, o preco dos Mac tem caido, e dai, acabou a desculpa.

Por enquanto estou bastante satisfeito e ainda nao tive nenhuma razao para sentir saudades do PC com Windows e Linux.

A compra do meu Mac foi um pouco conturbada. Eu comprei ele no Submarino, meu Mac chegou na quinta-feira de manha, e na quinta a noite quando eu comecei a brincar com ele, percebi que ele tinha vindo com um dead-pixel. Na sexta-feira abri um chamado no Submarino solicitando a troca, e eles me enviaram um e-mail autorinizando o envio do produto de volta via sedex. Fiz isso na sexta-feira mesmo. O prazo que eles tinham me dado eram de 7 dias uteis pra eles constatarem o defeito e me enviarem outro. Mas pra minha feliz surpresa, hoje, terca-feira, apenas 1 dia util depois eles jah me enviaram um MacBook novinho em folha. Excelente servico! Por isso que eu sempre compro coisas no Submarino e continuarei comprando!

Bom, contarei as minhas experiencias como novo usuario Mac por aqui! Quem jah tiver Mac e quiser me dar algumas dicas que achar legal, sintam-se a vontade!

Mensagens JMS agendadas Just-In-Time

August 25th, 2008

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:

[sourcecode language='java']
ObjectMessage message = session.createObjectMessage();

message.setLongProperty("JMS_JBOSS_SCHEDULED_DELIVERY", (new Date().getTime() + (1000 * 60 * 60 * 24)));[/sourcecode]

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

Matemática: A melhor amiga de um programador

August 15th, 2008

Neste post quero mostrar como um bom conhecimento matemático pode facilitar e muito a vida de um programador. Para isso, vou usar 3 exemplos. Vamos e eles….

O primeiro exemplo foi uma situação que passei com um ex-colega de trabalho. Ele tinha que resolver para a faculdade o problema das “Torres de Hanói”, creio que conhecido de todos que frequentam esse blog. O professor queria que fosse desenvolvido um algoritmo para dado uma quantidade de discos, todos inicialmente no pino 1, retornasse quantos movimentos seriam necessários para mover todos os discos para algum outro pino. Meu amigo me pediu para ajudar ele com esse problema. Ele tava fazendo um algoritmo, mas não estava conseguindo….porém, a solução deste problema é totalmente matemática. A formula pow(2, n) – 1 retorna exatamente o resultado esperado. Simples assim.

Outro problema é por exemplo, você quer somar todos os números de 0 a N. Como resolver isso? Simples não? Faz um for até N e vai somando numa variavel. Gauss diria que voce pode resolver isso da seguinte forma:

Soma = N * (N+1) / 2

Quem não gosta de matemática, provavelmente não liga para analise de algoritmos, então acha que dá na mesma. Mas tenta fazer isso com N igual a 1000000 com o for e compara com a solução da expressão.

Um blog que eu gosto muito e sempre acompanho é o DQSoft do Daniel Quadros (http://dqsoft.blogspot.com). O Daniel fez um post falando de um problema recente que ele teve que resolver no “Google Code Jam”. (http://dqsoft.blogspot.com/2008/08/google-code-jam-2008-triangle-areas.html)Reparem como a solução é trivial, dependendo apenas de sacadas matemáticas.

Viram só? Os exemplos não estão relacionados a coisas que usamos no nosso dia-a-dia, mas eu creio que o mais importante disso tudo é a capacidade lógica que a matemática proporciona.

[]’s

PS: A prova do problema das Torres de Hanói pode ser encontrada no livro “Matematica Concreta”

PS1: A questão da soma foi descoberta por Gauss, que em uma aula do ensino fundamental, recebeu como castigo somar até 100, e rapidamente falou 5050, surpreendendo a todos.