Archive for October 27th, 2007

Em 2004 foi primeira vez que vi oOpen Services Gateway Initiative - OSGI, quando avaliava uma forma de atualização de módulos(bundles) de uma aplicação, de forma ciclica e com suporte a dependências, mais ou menos como o Maven faz, ou seja, em termos gerais que cada módulo fosse um plugin para o agente executador: A Aplicação. Naquele época, avaliei alguns esforços da IBM e o Oscar Framework.

Passando vários anos, a necessidade de habiltiação de Serviços passou a ser requisito para o mercado, OSGI pode ter uma boa Aplicabilidade pra distribuição, governança, gerenciamento, gestão de ativos em termos de componentes/serviços.

Em busca de uma solução para meus brinquedos de Profiler, resolvi fazer algumas coisas com o JBoss Micro-Container, Jetty e o Apache Felix , sendo este a implementação de OSGI da Apache, e presente também no projeto Spring OSGi.

Algumas dicas do Felix:

  • Ao fazer o download, você tem que ir ao diretório bin, porém não há um .sh ou .bat, nesse momento você tem que recorer ao braço forte e digitar: java -jar felix.jar
  • O Felix vai perguntar qual o nome do seu profile (registros de serviços OSGI), para que tudo funcione, copie a basta bundle para dentro da bin e digite “bundle” apenas.
  • Pronto, Felix estará no ar.

Criando um Serviço OSGI

Basicamente você precisa primeiro pensar em Interfaces, ou seja: O contrato do seu serviço, para exemplificar, criemos uma Interface MoneyConverter.java:

[java]

package br.com.edgarsilva.service;

public interface MoneyConverter {

public static final String BRAZILIAN_MONEY= “BRL”;
public static final String BRITSH_MONEY= “US”;

public Double convert(Double amount, String money);

}
[/java]

O OSGI precisa de um “ativador” dos seus serviços, no caso criamos um Ativador para esse pequeno serviço de Conversor de moedas, veja o exemplo:

[java]

package br.com.edgarsilva;

import br.com.edgarsilva.service.MoneyConverter;
import br.com.edgarsilva.service.impl.SimpleMoneyConverter;
import java.util.Properties;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

/**
*
* @author edgarsilva
*/
public class Activator implements BundleActivator {

public void start(BundleContext ctx) throws Exception {

Properties props = new Properties();

ctx.registerService(MoneyConverter.class.getName(), new SimpleMoneyConverter(),props);

}

public void stop(BundleContext ctx) throws Exception {
System.out.println(”Servico Parado !”);
}

}
[/java]

Veja que no método start(), retornarmos uma classe que implementa o serviço.

Alterando o MANIFEST do Jar do Serviço

Para que o container/framework OSGI reconheça seu compoente, ao contrário de descriptors via XMLs de darem medo, você precisa apenas preencher algumas informações, como no exemplo a seguir:

[java]

Bundle-Name: Money Converter
Bundle-Description: Conversor de Valores Dolar
Bundle-Vendor: Edgar Silva
Bundle-Version: 1.0.0
Bundle-Activator: br.com.edgarsilva.Activator
Export-Package: br.com.edgarsilva.service
Import-Package: org.osgi.framework
[/java]

Com OSGI você tem a capacidade de dizer quais as dependências seu serviço têm, assim como o que do seu pacote você quer que seja público para os outros componentes do cotainer OSGI. Isso pode ajudar bastante no desenvolvimento de forma mais tranquila no que diz respeito a independência e ao mesmo tempo dependência.

Pelo o que você viu lembra bastante JMX e o modelo de MBeans do JBoss Microcontainer, falando nisso, deveremos suporta OSGI dentro do JBoss MC também, não sei dizer qual a implementação iremos usar, particularmente gostei bastante dos fontes e da documentação do Felix.

Curiosidade: Você sabia que todo o esquema de atualização de plugins do Eclipse é baseado em OSGI, além de alguns core-components de alguns Application Servers de Mercado.

Para maiores informações: http://felix.apache.org