Spring

Não fique amarrado com o Spring

Postado em Atualizado em

homem-de-negcios-amarrado-na-corda-2431821Eu praticamente faço tudo com Spring Framework. Ele simplesmente é o camisa 10 de todos os meus projetos nesses últimos 10 anos. Mas eu também não nego o benefício de usar um produto Java baseado em especificação. Quando você inicia sua carreira em java, não da muito bola para as especificações, até ter a experiencia de migrar, trocar e/ou alterar uma solução e ver as consequências de usar uma especificação. A ficha caiu para mim quando migrei soluções de décadas usando banco de dados relacionais com JDBC e um outro com JPA. Demorei simplesmente algumas fáceis horas enquanto outras produtos de outras plataformas dentro da  mesma empresa, precisaram de 9 meses para fazer o mesmo. Migrei vários provedores de JSF em soluções web alguns bons anos também com muita facilidade e segurança. Tive outros exemplos legais também, que vou deixar para uma próxima.

O Spring é um produto proprietário e sendo assim você inevitavelmente acaba ficando amarrado com ele, sua versão e seus pacotes. Por exemplo: Se você use o modulo de IoC, vai acabar usando o import da anotação org.springframework.stereotype.Component. Quando essa anotação mudar de pacote, for substituída por uma outra ou você migrar de provedor de IoC, já era seu projeto! Quebra tudo e perde portabilidade.

“Seria possível usar o Spring e não ficar amarado com ele?”

Sim, existem varias formas diferentes de fazer isso. Hoje quero dar 3 dicas que tenho usado nos últimos anos para reduzir a dependência e amarração para o framework Spring.

1. Não use anotações proprietários de IoC

O modulo de IoC do spring funciona perfeitamente com a especificação CDI. Assim, você pode parar de usar anotações proprietárias @Component, @Controler, @Repository, @Service, @Autowire e etc. Ao invés disso, use especificação CDI @Named, @Inject e @Resource. É claro que iremos perder os tratamentos de exceptions automáticas existente nas anotações spring e outros detalhes, mas você acaba retirando dependência desses pacotes de seu projeto. A maioria dos projetos tem tratamento de erros customizados e não dependente desses serviços. Então, analise e veja o que vale mais a pena. Segue abaixo alguns links sobre o assunto:

  1. https://www.mkyong.com/spring3/spring-3-and-jsr-330-inject-and-named-example/
  2. https://mobiarch.wordpress.com/2013/01/11/spring-di-and-cdi-comparative-study/

2. Não use anotações proprietários de escopo web

Quando você integra um JSF com container IoC do spring, é obrigado a usar as anotações de escopo proprietária para declarar ciclo de vida do seus managed beans. Você também não precisa usar elas. Nas ultimas versões do spring saiu um recurso muito bacana chamado de Meta Anotations Support. Resumidamente, é ato de criar suas próprias anotações customizadas reusando e/ou evitando DRY de anotações spring dentro de seus beans. Usando esse recurso, você poderia criar suas próprias anotações de escopo, evitando espalhar repetidamente o import de pacotes proprietários do spring dentro de seus projetos. Segue abaixo um exemplo meu:

sem-titulo

Assim, nos seus managed beans, você evita o import dos org.springframework.context.annotations.Scope, usando então sua própria anotação. Veja um exemplo de managed bean:

sem-titulo2

3. Não use anotações proprietários de transação

Uma das coisas que eu acredito ser mais utilizadas do modulo de transação do spring é a facilidade e a simplicidade da anotação @Transaction do pacote org.springframework.transaction.annotation. Com ela, o spring aplica AOP recursiva em suas transações de modo fácil e rápido. O que você não parou para pensar é que o seu domain model (DDD) acaba importando esse pacote proprietário em um bilhão de classes, ficando totalmente amarrado com o spring no uso desse serviço, furando o conceito mais básico e clássico DDD de um projeto que é a independência de produto, serviço ou framework. Pare de fazer isso! Aplique o mesmo caso do item 2 acima. Crie sua anotação de transação customizada e reuse no seu DDD. Segue um exemplo:

sem-titulo3

Assim, nos seus beans transacionais, você evita o import dos org.springframework.transaction.annotationusando então sua própria anotação. Veja um exemplo:

sem-titulo4

Com essas três dicas simples, você elimina a maioria dos imports proprietários do spring framework para dentro do seu projeto, deixando seu código independente, mais flexível e limpo. Você continua usando o melhor e maior framework java da historia, e consegue manter as camadas do seu projeto independente de serviço e detalhes infraestruturais! Até a próxima pessoal 😉

“Para ser sábio, é preciso primeiro temer a Deus, o SENHOR. Os tolos desprezam a sabedoria e não querem aprender.” Provérbios 1:7

Mensageria não é um bicho de 7 cabeças

Postado em Atualizado em

activemq-5-x-box-reflectionVocê já ouviu falar de MOM?

Message oriented middleware (MOM) é servidor de aplicação (infra-estrutura de software + hardware) idealizado exclusivamente para suportar o envio e recebimento de mensagens entre sistemas distribuídos. É um serviço utilizado para intermediar a troca de mensagens entre sistemas, com o objetivo de fazer integração de serviços.

Para que serve um MOM?

Serve para dar solução robusta e confiável na integração entre duas ou mais diferentes soluções. Integrar sistemas hoje é um desafio imenso, diferentes plataformas, diferentes tecnologias, diferentes protocolos, diferentes mecanismos de persistências, assim, se faz necessario garantir serviços dentro da solução de integração como por exemplo: desacoplamento, entrega de mensagem, persistência de mensagem, politicas de retry, processamento assíncrono, escalabilidade, confiabilidade, transação, interrupções, segurança, clusterização e muito etc. Um MOM já faz tudo isso e muito mais.

MOM é para ser utilizado em soluções de grande porte?

Essa é justamente meu ponto: você lendo tal definição, tem a falsa impressão que só usaria um MOM para fazer coisas gigantescas e exorbitantes!!! Mas depois de conhecer Apache ActiveMQ e Spring JMS, você vera que é muito fácil e pode usar para fazer coisas pequenas também. Como diria um amigo meu, “só na manteguinha….. 🙂 “.

Você já ouviu falar de ActiveMQ?

ActiveMQ é uma implementação de um middleware completo (MOM), open source e grátis. Ele possui todas as grandes features necessários para dar solução em coisas de “grande porte”, mas o que o pessoal desconhece é que ele tem um arquitetura tão flexível e é tão bem feito que oferece diversas opções de uso e configurações flexíveis. Umas delas é usar o serviço de MOM de forma “embarcada”, dentro da sua própria instancia da JVM e da solução, não precisando criar um servidor remoto exclusivo para isso. Juntamente com isso, você desabilita as chamadas remotas e questões de persistência, e assim, acaba ficando com um mini-serviço de MOM simples, local com suporte a filas(Queue) e tópicos(Topics) que é justamente a “cereja de bolo” desse tipo de serviço.

Você já ouviu falar de Spring JMS?

Spring JMS é kit de desenvolvimento arquitetural que faz parte do framework spring criado exclusivamente para se trabalhar com integração de sistemas usando MOM. Esse produto abstrai toda a infra-estrutura de código utilizada para programar esse tipo de solução, criando uma facade de serviços rápida, produtiva e fácil de usar, retirando a necessidade de fazer código sujo e infraestrutural (boilepart) necessário para se configurar, enviar e consumir mensagens de um MOM.

Vamos fazer um exemplo prático?

Segue abaixo um exemplo real dessa simples e robusta solução:

Ferramentas:

  • Maven
  • Eclipse Java EE IDE for Web Developers – Versão Neon.1
  • Groovy-Eclipse plugin

Projeto:

Segue os passos resumido do projeto:

Crie um projeto java maven: New project -> Maven Project. Adicione groovy no projeto: botão direto no projeto -> configure -> Convert to groovy project. Configure o pom para baixar as dependências básicas: groovy, spring, cdi e activemq:

1

Configurar o spring.xml, subindo o activemq local, sem persistência, sem jmx, sem chamada remota. Configurar uma fila simples e um listener de fila. Configuramos também um jmsTemplate que é a facade de serviços spring que esconde a código sujo de MOM e JMS.

2

Criar um bean que envia a mensagem da fila:

2

Criar um bean que consome as mensagens da fila:

3

Fazer uma classe simples com main para testar o envio e o consumo da mensagem:

3

Execute a solução e teremos a saída:

3

E assim, com  menos de 5 minutos, e poucas linhas de código você consegue embarcar e reusar um MOM completo fazendo filas, tópicos, sem persistência, sem chamada remota, sem gastar muita memoria, rápido, fácil e sem perder tempo fazendo na unha qualquer coisa do tipo. Sem contar que você pode evoluir mais esse produto, habilitando serviço por serviço, tudo de acordo com sua necessidade.

Aonde eu uso isso?

Precisou integrar sua solução java com e-mail?, web services soap? web services rest?, banco de dados legados? ou quer gerar um relatório pesado assincrono? Esta ai seu ponto de partido. ActiveMQ + Spring JMS = Solução simples e rápida com todos os sabores de processamento assíncrono usando filas e tópicos 100% MOM.

Como eu aprendo mais sobre esse assunto?

Tudo isso e muito mais pode ser encontrado no livro ActiveMQ in Action. Excelente livro sobre conceitos de mensageria, JMS e integrações em geral. Boa leitura para todos 😉 .

“Mas tu, ó SENHOR, me proteges como um escudo. Tu me dás a vitória e renovas a minha coragem.” Salmos 3:3

Operações com Retry em Java

Postado em

retryNa engenharia de software ágil que eu prático, existe uma regra simples que me salva de muitas dores de cabeça:

“O menos é mais!” 

Isso quer dizer que como regra, eu sempre tento ao máximo fazer ou criar uma solução mais simples possível. Nesse contexto, algumas soluções Java precisam de operações com”retry” automático. Antes de você concluir que precisa de um servidor de mensageria + persistência de filas como a maioria diz por ai, considere outras opções mais simples. Você pode se surpreender! Segue algumas estratégias de retry simples com Java:

“Respondeu-lhes Jesus: A obra de Deus é esta: que creiais naquele que por ele foi enviado.” João 6:29

Feedback Livro – Just Spring Integration

Postado em Atualizado em

70554dee5e69e28-200x250Semana passada terminei de ler o livro Just Spring Integration e gostaria de dar meu feedback: Mais uma vez, fiquei surpreso com a qualidade do produto. Saiba que para usar serviços profissionais em mensageria, vc não precisa adotar e instalar um  container de mensageria, apenas os jars do spring + spring integration já é suficiente! Saiba que existem muitos processos sequenciais que nos fazemos manualmente que poderiam ser colocados em cadeia de mensagens, deixando a solução bem mais flexível e desacoplada. Solução perfeita para projetos de pequeno e médio porte! Bom final de semana…

“Aquele que crê no Filho não é julgado; mas quem não crê já está julgado porque não crê no Filho único de Deus.” João 3:18

Voltando de férias com Spring In Action 4

Postado em Atualizado em

20160330_113205

Voltei de férias já caindo a fundo no livro Spring in Action 4. Se passaram 6 anos desde a minha última leitura do livro Spring In Action 2.5. Foi então que minha visão e forma de trabalhar mudou radicalmente e de la pra cá, me fazendo um arquiteto 100% “springreiro”. Mais que aprender os produtos da spring, na leitura você aprende sobre design, técnicas e arquitetura. Vamos que vamos 😉 !

“Vejam como é grande o amor que o Pai nos concedeu: sermos chamados filhos de Deus, o que de fato somos! Por isso o mundo não nos conhece, porque não o conheceu.” 1 João 3:1

Spring Framework 4.2.4 & 4.1.9 released

Postado em

downloadDear Spring community,

It is my pleasure to announce that Spring Framework 4.2.4 and 4.1.9 are available fromrepo.spring.io and Maven Central!

4.2.4 addresses a few regressions in the 4.2.x line and includes many fixes and enhancements, with no immediate issues remaining. 4.2.4 is a recommended upgrade for all 4.x users now. Please note that the 4.2.x line moves into maintenance mode at this point, with a low-volume 4.2.5 maintenance release scheduled for mid February.

4.1.9 is designed as the last release in the 4.1.x line, backporting applicable bug fixes as well as selected recent enhancements from 4.2.3 / 4.2.4. Note that this is the ultimate 4.1.x release: Your next upgrade step beyond 4.1.9 is the above-mentioned 4.2.5 in February, even for compatibility issues and security vulnerabilities.

In the meantime, development towards 4.3 has started already, soon to be found in our master branch. We are aiming for a 4.3 release candidate in mid April and a 4.3 GA release in June. So if you happen to be interested in the latest developments there, check out 4.3 RC1 issues on JIRA and 4.3 build snapshots as they become available…Cheers, Juergen.

“O Senhor está perto dos que têm o coração quebrantado e salva os de espírito abatido.” Salmos 34:18

Arquiteto Java – Spring Framework

Postado em

spring1Mesmo depois dos avançados das ultimas especificação do JEE , vemos que ela ainda esta muito longe de se igualar as opções oferecidas pela plataforma Spring. Vale a pena lembrar que da mesma forma que as especificações vão melhorando ao longo do tempo, o Spring também vai evoluindo em uma velocidade muito mais rápida e ampla, uma vez que não depende de nenhum tipo de votação comunitária.

Eu mesmo ao longo dos meus 15 anos de experiência, sempre tive a cautela de preferir produtos JCP ao invés de proprietários, visando o grande ideal da portabilidade e a independência de vendor, mas na prática percebo que ao longo do tempo tenho adotado os produtos Spring mais e mais. Motivo? O mesmo pelo qual o Spring foi criado: ser uma opção muito mais rápida, barata e leve de um lightweight container que ofereça serviços plugáveis de infraestrutura para soluções corporativas com a mesma qualidade.

Hoje a minha dica é sobre os principais livros de Spring atualizados para os interessados em se aprofundar nessa poderosa plataforma:

51nY36Dqo5L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_

Spring in Action  é o livro mais básico que te ensina os pilares do uso de serviços no Spring. Nele você também aprendera os serviços e recursos mais básicos que ele proporciona.

415x7PWAe5L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA300_SH20_OU01_

Just Spring Integration  é o livro que estende o spring oferecendo os serviços de infraestrutura voltados para integração de soluções definidos pelo catalogo de patterns de integração conhecidos pelo EAI.

51RXnaly93L

Spring Data é o livro que estende o spring oferecendo os serviços de infraestrutura voltados para persistência de dados relacionados com banco de dados relacionais e NoSQL.

Existem outros livros mais específicos de outros serviços que você também pode estar estudando como, por exemplo, Spring Bath in Action e Pro Spring Security

Uma vez que você domine todos estes serviços, você praticamente se tornara um “Arquiteto Java Spring”, dominando contextos de soluções mais modernos da atualidade e apto para projetar soluções corporativas de pequeno, médio e grande porte.

“Filhinhos meus, estas coisas vos escrevo para que não pequeis. Se, todavia, alguém pecar, temos Advogado junto ao Pai, Jesus Cristo, o Justo;” 1 João 2:1