Tuesday, December 8, 2009

Resumão OSGI

http://www.springsource.org/training/osgi/online

Spring - DM Server -> Dinamic Modules Server

1-OSGi -> Sistema de modularização dinâmica para Java -> Modularização de verdade

Modular:
-Projetos (módulos), que são chamados de Bundles
-JAR files com meta-data
-Baseado em pacotes
-Versionamento de pacotes e bundles

Dinâmico:
-Adicionar, remover, startar e parar bundles em runtime
-Usa serviços compartilhados para compartilhar objetos, não apenas tipos

"Bundles usam JAR Manifest para meta-data" -> a configuração é feita no Manifest.mf dentro do META-INF

Por default um bundle não consegue enxergar as classes dos outros

Para que um suas classes (tipos) fiquem disponíveis para os outros bundles é necessário exportar seus pacotes

BOAS PRÁTICAS
-Separe as interfaces das implementações
*Coloque-os em pacotes diferentes
*Exporte apenas as API públicas e esconda os detalhes
*Exponha as implementações como serviços
-Versione seus pacotes
*Libere várias versões no mesmo runtime
*Clientes pegam a versão que eles precisarem

Para ter acesso aos tipos dos outros bundles é necessário importar os pacotes disponíveis (você pode especificar um range da versão que quer usar. Ex: "[1.0.0,2.0.0)" - incluindo a 1 e excluindo a 2)

Os containers OSGi têm um pequeno core e são leves
-Equinox (RI - eclipse)
-Apache Felix
-Knoplerfish

Bundles são instalados no container OSGi e têm um lifecicle
-Installed (faltando dependências)
-Resolved (parado, mas com as dependências satisfeitas)
-Starting
-Started (serviços disponíveis)
-Stopping
-Uninstalled (sai no restart)

Você deve disponibilizar os tipos (interface) através do manifest.mf e deve exportar os serviços em uma classe que estende org.osgi.framework.
BundleActivator.

Para utilizar o serviço você deve importar, no manifest.mf a classe que está disponível e, em um BundleActivator, recuperar a instância do serviço

2-OSGi + Spring

Simplifica o uso do OSGi através do applicationContext

Os arquivos do Spring ficam em META-INF/spring

namespace osgi

Você usa o bean de outro bundle como dependência e o Spring injeta (osgi:reference)

O Spring disponibiliza o serviço para você (osgi:service)

BOAS PRÁTICAS
-Separar arquivos normais de configuração do Spring dos arquivos de configuração do Spring-DM

3-Enterprise OSGi

OSGi não suporta aplicações web, então a Spring implementou isto no seu servidor DM

Não possui nenhuma das funcionalidades de EJB, JNDI, etc..

4-Modularização da aplicação

-Vertical
*Por funcinalidade
°Pedidos, Pagamentos, Vendas...
-Horizontal
*Por camadas
°Web, Repositório, Serviço...

Compartilhar infa-estrutura faz sentido
-DataSources
-TransactionManager
-JMS

Qual o tamanho de um Bundle?
-Responsabilidade definida
-Alta coesão
-Baixo acoplamento

Modularização horizontal tende a acoplar os módulos

5-Sumário

OSGi modulariza de verdade dinamicamente

Muitos benefícios em potencial, mas não são fáceis de se conseguir

OSGi é uma área que ainda está no início da evolução (2008) e novos produtos e padrões estarão surgindo