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


Entries (RSS)