Archive for setembro de 2011

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. 

Permalink | Leave a comment  »

Nenhum comentário.

Mini curso Introdução a Desenvolvimento Web com Java da GlobalCode em Joinville

A Globalcode, através de sua parceira em Santa Catarina a V. Office, dará um mini curso introduzindo desenvolvimento web utilizando a tecnologia Java. Recomendo pra quem está pensando em ingressar na área sendo esse querendo entrar como analista ou desenvolvedor. … Continue lendo


Nenhum comentário.

Google cancela Google Desktop e outros produtos de seu portfólio

SÃO PAULO – Com a justificativa de que vai direcionar seu foco para projetos mais importantes, o Google anunciou que vai deixar de oferecer dez produtos de seu portfólio. Entre as iniciativas que serão canceladas, estão o Google Desktop, sistema … Continue lendo


Nenhum comentário.

“Schmidt: compra da Motorola mira produtos”

O ex-CEO do Google Eric Schmidt declarou que o investimento de US$ 12,5 bilhões que a empresa pagará pela Motorola mirava em mais do que patentes. “Fizemos por mais do que apenas patentes. A Motorola tem produtos maravilhosos”, declarou. As … Continue lendo


,

Nenhum comentário.