Configurando Log4j para email de exceptions no Grails

O log4j tem um appender que envia emails chamado SMTPAppender. Nesse post eu vou mostrar como configurar esse appender no Grails.
Dessa forma sempre que for lançada uma exception não tratada você recebe um email com o erro e o stacktrace.
Encontrei essa solução aqui.

Pra fazer isso siga os passos.
1. Adicionar dependencia de mail.jar e activation.jar em BuildConfig.groovy

dependencies {
compile("javax.mail:mail:1.4.4")
compile("javax.activation:activation:1.1.1")
}
2. Alterar Config.groovy

import org.apache.log4j.Level
import org.apache.log4j.net.SMTPAppender

System.setProperty 'mail.smtp.port', '465'
System.setProperty 'mail.smtp.starttls.enable', 'true'

mail.error.server = 'smtp.gmail.com'
mail.error.port = 465
mail.error.username = 'seu@email.com'
mail.error.password = 'sua-senha-aqui'
mail.error.to = 'to@email.com'
mail.error.from = 'from@email.com'
mail.error.subject = '[Application Error]'
mail.error.starttls = true
mail.error.auth = true
mail.error.socketFactory.port = 465
mail.error.socketFactory.class = "javax.net.ssl.SSLSocketFactory"
mail.error.socketFactory.fallback = false
mail.error.debug = false

// log4j configuration
log4j = {

    System.setProperty 'mail.smtp.port', mail.error.port.toString()
  System.setProperty 'mail.smtp.starttls.enable', mail.error.starttls.toString()

  appenders {

     appender new SMTPAppender( name: 'smtp', to: mail.error.to, from: mail.error.from,        subject: mail.error.subject, threshold: Level.ERROR, SMTPHost: mail.error.server, SMTPUsername: mail.error.username, SMTPDebug: mail.error.debug.toString(), SMTPPassword: mail.error.password, layout: pattern(conversionPattern: '%d{[ dd.MM.yyyy HH:mm:ss.SSS]} [%t] %n%-5p %n%c %n%C %n %x %n %m%n'))
  }

  error  'org.codehaus.groovy.grails.web.servlet',  //  controllers
         'org.codehaus.groovy.grails.web.pages', //  GSP
         'org.codehaus.groovy.grails.web.sitemesh', //  layouts
         'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
         'org.codehaus.groovy.grails.web.mapping', // URL mapping
         'org.codehaus.groovy.grails.commons', // core / classloading
         'org.codehaus.groovy.grails.plugins', // plugins
         'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
         'org.springframework',
         'org.hibernate',
         'net.sf.ehcache.hibernate'
  warn   'org.mortbay.log'

  root {
     error 'stdout', 'smtp'
     additivity = true
  }
}

that's pretty much it

Sistema modular aplicando OSGI com Apache Felix

No início desse ano estive envolvido em um projeto onde um dos principais requisitos seria a flexibilidade de instalar, desinstalar, pausar e restartar módulos em tempo de execução sem precisar parar o sistema todo ou impactando o mínimo nos módulos já instalados. Isso especialmente porque o ciclo de vida de desenvolvimento desses módulos seriam independentes e por outras questões de ambiente. O sistema não podia crescer sendo um bloco monolítico. Ele precisava ter modularidade no seu DNA e os componentes deveriam funcionar mais como serviços que cooperariam entre si. 

Quando comecei a esboçar o núcleo do sistema percebi que o problema era mais comum do que havia imaginado inicialmente, foi quando lembrei que já existia uma solução pra isso e podia atender pelo nome de OSGi, ou Open Services Gateway Initiative, que apesar do nome pouco intuitivo é uma especificação para se criar sistemas modulares e orientados a serviços em Java.

A primeira versão da especificação saiu em 2000 e desde de então vem evoluindo e sendo empregada em aplicações como Eclipse, Glashfish e no ServiceMix. O que todas essas aplicações têem em comum é a capacidade de suportar e gerenciar plugins. Exatamente como no projeto em questão.

Os containers mais relevantes que eu encontrei na época foram o Apache Felix , Equinox e KnopflerfishBrincando um pouco com cada acabei escolhendo o projeto Apache pela facilidade.  Depois de fazer o download, pra iniciar o felix basta executar um jar.

java -jar bin/felix.jar

Executando o comando lb ele lista os componentes ativos (ou bundles como são chamados).

g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)

Agora com o Felix rodando só falta instalar um bundle próprio.

Basicamente a especificação pede que você informe meta-informações sobre o seu jar dentro do manifest. Se você usa Maven fica tudo mais fácil com o Maven Bundle Plugin. Com esse plugin você consegue definir no seu arquivo pom as informações para transformá-lo em um bundle OSGI.
O ciclo de vida de um bundle é gerenciado pelo container e você só precisa de uma classe que implemente a interface BundleActivator

package org.foo.myproject.impl1;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

public class MyBundleActivator implements BundleActivator {

public void start(BundleContext bundleContext){
System.out.println("Olá! Eu sou um bundle ativo =) ");
}
public void stop(BundleContext context) {
System.out.println("Bye bye");
 }
}

Essa classe deve ser informada no manifest. Usando maven a configuração você adicionaria essa configuração no seu arquivo pom dessa maneira.

...
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
  <artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
    <instructions>
      <Export-Package>org.foo.myproject.api</Export-Package> <!-- visível para outros bundles -->
       <Private-Package>org.foo.myproject.*</Private-Package>
        <Bundle-Activator>org.foo.myproject.impl1.MyBundleActivator</Bundle-Activator>
    </instructions>
</configuration>
</plugin>
</plugins>
...

Execute "mvn package" e pronto. 
Para instalar o novo bundle basta executar o comando install:

g! install file:/path/to/bundle/bundle.jar
g! lb
START LEVEL 1
   ID|State      |Level|Name
    0|Active     |    0|System Bundle (3.0.0)
    1|Active     |    1|Apache Felix Bundle Repository (1.6.2)
    2|Active     |    1|Apache Felix Gogo Command (0.6.0)
    3|Active     |    1|Apache Felix Gogo Runtime (0.6.0)
    4|Active     |    1|Apache Felix Gogo Shell (0.6.0)
    5|Installed  |    1|Example Bundle (1.0.0)
g! start 5
Olá! Eu sou um bundle ativo =) 
g!

Pesquisando mais a fundo o projeto descobri ainda um subprojeto chamado Apache Karaf que veio facilitar ainda mais o gerenciamento dos componentes. Basicamente é uma distribuição baseada no kernel do Apache Felix somando funcionalidades adicionais mais amigáveis para o gerenciamento dos bundles tais como console, interface web de administração, segurança, sistema de logging, configuração dinâmica, features, hot deployment e etc.

Hoje temos o Karaf rodando em ambiente de produção e cobrindo nossas necessidades.

O mais legal disso tudo é que você acaba tendo mais uma opção pra evitar usar um container pesado como um servidor de aplicação para disponibilizar seus componentes. Considere também um container OSGI a partir de agora. 

1o encontro do Grupo de Usuários Adobe de Joinville

Estamos inaugurando um Grupo de Usuários da Adobe em Joinville e o primeiro encontro vai ser no auditório da Softville sobre Flex. Esse primeiro encontro que ocorrerá no dia 15/07 será para reunir profissionais da região e vamos contar com 3 palestras, do básico e intermediário ao avançado. - Introdução ao Flex - Flex e Java com BlazeDS - Desafios no desenvolvimento de uma aplicação real Como o auditório possui espaço limitado, para garantir seu espaço peço que confirmem a presença neste link. Lista de presença Mais informações em http://fugsc.groups.adobe.com/ Um abraço
Media_httpimagesgroup_ubmsw

Open in TextMate no Finder

Media_httphenriknyhse_vrtji
Essa é uma daquelas dicas simples que facilitam muito a nossa vida. Baixe OpenInTextMate.zip , descompacte no lugar que preferir (por exemplo /Applications/Scripts), arraste e solte o arquivo descompactado na barra de ferramentas do Finder. That's it. Mais fácil impossível. Créditos a Henrik Nyh, se você quiser saber os detalhes de como funciona o script dê uma olhada aqui -> "Open in TextMate" from Leopard Finder – The Pug Automatic.

Me Empresta

A três dias publiquei meu primeiro app na AppStore. A experiência toda está sendo bem interessante e de muito aprendizado. Nos últimos meses venho estudando Objective-C e Cocoa Touch e construir esse aplicativo me fez por em prática muita coisa legal.
Media_httpblogarianpa_geefu
O objetivo desse pequeno projeto que criei em parceria com meu colega Marcio Lohmann foi principalmente me forçar a estudar o framework Cocoa, descobrir as melhores práticas em desenvolvimento para iPhone OS e conhecer o processo todo de publicação e comercialização de um app na AppStore. E já posso garantir que atingi meus objetivos, nesse momento o app está em primeiro lugar entre os apps pagos no Brasil na categoria Produtividade e está entre os 40 no quadro geral.
Media_httpblogarianpa_eoagm
Inicialmente publiquei apenas na loja brasileira, em breve faço um refactoring para internacionalizar o app e diponibilizar na AppStore americana e veremos como se comporta por lá. Outra coisa que me deixou bem contente foi os feedbacks que recebemos. É bem motivante ver que o pessoal está gostando, isso motiva a continuar evoluindo esse pequeno e útil app. O hotsite pode ser conferido pelo link http://meempresta.autusmobile.com.br Nos comentários vou colocando os links de reviews que vão sendo publicados em sites especializados.

Flex For Kids

[caption id="" align="alignleft" width="270" caption="Flex for Kids"]
Media_httpwwwflexfork_tjrwg
[/caption] Comece 2010 fazendo uma boa ação e participando do primeiro evento Flex do ano. Assista a 10 palestras sobre Adobe Flex ao vivo com feras da comunidade brasileira e ainda ajude uma instituição carente. A maratona de palestras on-line será realizada no dia 06/02/2010 e contará com palestras de nomes conhecidos como Beck Novaes, Mario Junior e compania. Qualquer pessoa, empresa ou faculdade poderá participar do Flex for Kids, para isto basta fazer uma doação de um valor simbólico de R$ 30,00 para ter acesso as 10 palestras on-line e suas gravações que serão disponibilizadas 15 dias após o evento. Todo dinheiro arrecadado será doado ao Cotolengo de Mato Grosso do Sul. Para conhecer a instituição Cotolengo clique aqui. Quer oportunidade melhor que essa pra aprender e ainda ajudar quem precisa? Site oficial: http://www.flexforkids.com

AC/DC Black Ice Tour 2009 - Brasil

Media_httparianpasqua_arqrw
Dia 27 de novembro de 2009 é o dia que marca o melhor show que eu já vi na vida. Sem palavras pra descrever o que é ver Angus Young tocando, ele toca como se o demônio estivesse encarnado nele. Um cidadão disse que se ele tocasse guitarra desistiria na mesma hora. O bom e velho blues com o melhor do rock n'roll saem das mãos de Angus com tanta paixão que emociona. A apresentação dele foi um show a parte. Antes da banda entrar pontualmente as 21:30, Nasi se apresentou pra o Morumbi lotado mas nem um pouco empolgado por terem escolhido ele para abrir o show. Na minha opinião quem deveria ter aberto o show tinha que ser Velhas Virgens, a única banda brasileira que tem o espírito AC/DC. Esse é o video que eu gravei durante Hells Bells (o som não está uma maravilha) [youtube ZZ8jzTlx7H4] Video de The Jack selecionado de algum maluco na pista [youtube vfN764hIyog] Minhas fotos do show estão no Flickr

Descobrindo código que cheira mal no seu projeto Flex

Media_http2bpblogspot_qhoxw
Baseado no PMD, ferramenta de auditoria de código bem conhecida dos javeiros, FlexPMD é uma ferramenta de auditoria de código capaz de detectar más práticas comuns em código Flex (MXML/AS3) e ajudar a melhorar o nível da qualidade do código produzido. Exemplo: Código não usado (functions, variáveis, etc) Código duplicado Código muito longo (classes, metodos, etc.) Uso inapropriado do ciclo de vida de componentes Flex (ex. commitProperties, etc.) O FlexPMD faz a auditoria automática do código baseado em regras escolhidas por você. Um relatório XML é gerado relacionado as violações de acordo com as regras configuradas. Existem várias regras prontas para serem usadas, mas é possível criar suas próprias regras para atender as necessidades de cada projeto. Você pode criar uma regra para forçar uma convenção de código ou para verificar se todos os métodos estão documentados por exemplo. Esse é o FlexPMD Ruleset Creator, uma aplicação em Flex que facilita a criação dessas regras customizadas. FlexPMD pode ser chamado via linha de comando, Ant, Maven ou até Automator do Mac OS. O relatório gerado pela ferramenta pode ser visualizado pelo viewer da Adobe, mas o ideal mesmo é integrar a alguma ferramenta de integração contínua como o Hudson. Fica aí a dica pra quem, assim como eu, estava a tempos procurando um auditor de código automatizado para implantar no serviço de integração contínua. Espero poder utilizar no meu próximo projeto Flex.