osgi - open services gateway initiative - wordpress.com · slide 3 de a necessidade de módulos o...
TRANSCRIPT
Slide 1 de
OSGi - Open Services Gateway Initiative
Também conhecido como Dynamic Module System for Java
Software Reuse: Theory and Practice http://wp.me/PMzBA-6B
Slide 2 de
Introdução
O caso Eclipse
Programação OSGi ◦ Exercícios práticos
Conclusões
Slide 3 de
A necessidade de módulos ◦ O Humilde arquivo JAR ◦ Vários arquivos JAR numa aplicação comum
Problemas com aplicações Java ◦ Dificuldade de gerenciamento de arquivos JAR ◦ Não há representação em tempo de execução
Slide 4 de
Problemas com aplicações Java ◦ Camadas com fronteiras mal definidas
Slide 5 de
Outros problemas com aplicações Java, especificamente com arquivos JAR ◦ Nome significativo ◦ Versões ◦ Dependências
Necessidade um gráfico de dependências Necessidade de desacoplar Necessidade de Late Biding
Slide 6 de
Pré-OSGi Eclipse < 3.0 ◦ Metadados em plugin.xml ◦ Plugins com nome significativo ◦ Versionamento no plugin.xml ◦ Dependências através de plugin.xml
O que faltava? ◦ DINAMICAMENTE... Instalar Bundles Atualizar Bundles Remover Bundles Tudo on-the-fly
Uma cirurgia no coração do eclipse para adicionar Equinox 3.0 (OSGi)
Slide 7 de
Execution Environment ◦ Ambiente padronizado para
aplicações chamadas de bundles
Modules ◦ Políticas de carregamento de classes ◦ Classes privadas para módulos, bem
como links controlados entre módulos
Life Cycle Estados para os bundles - installed, started, stopped, updated and
uninstalled
Service Registry Provê cooperação entre os bundles Compartilhamento de objetos entre bundles
Slide 8 de
Equinox ◦ Implementação de referência para o OSGi R4.
Previamente instalada no coração do Eclipse.
Apache Felix ◦ Implementação open source da Apache Software
Foundation. Ainda não está completamente compatível com OSGi R4
knopflerfish ◦ Implementação open source para OSGi R3 and OSGi R4
Informações interessantes - Hello, OSGi, Part 1: Bundles for beginners ◦ http://www.javaworld.com/javaworld/jw-03-2008/jw-03-
osgi1.html?page=1
Slide 9 de
Todo o acesso é feito através de BundleContext O mesmo é fornecido por um BundleActivator
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception { System.out.println("Starting..."); }
public void stop(BundleContext context) throws Exception { System.out.println("Stopping..."); } }
Slide 10 de
MANIFEST.MF
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Osgiservice Plug-in Bundle-SymbolicName: edu.cesar.osgiservice Bundle-Version: 1.0.0 Bundle-Activator: edu.cesar.osgiservice.Activator
Slide 11 de
Exercício 1 ◦ Criar um Bundle que imprima Hello
World a cada 2 segundos no console. ◦ Criar um build (.JAR) ◦ Instalar e executar o Bundle usando o
Knopflerfish
Slide 12 de
Criando seu primeiro serviço. Passo-a-passo: ◦ Crie a interface do Serviço ◦ Crie a implementaçao do serviço ◦ Crie um Bundle para registrar o serviço
public void start(BundleContext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get (Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; FirstService service = new FirstServiceImpl(); ServiceRegistration registration = bc.registerService( FirstService.class.getName(), service, new Hashtable()); System.out.println("Service registered: FirstService"); } public void stop(BundleContext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get (Constants.BUNDLE_NAME) + " stopping..."); Activator.bc = null; }
Slide 13 de
Exercício 2 ◦ Criar a interface de um serviço ◦ Criar a implementação do serviço ◦ Criar um Activator para o serviço ◦ Registrar o serviço ◦ Fazer build e instalar
Slide 14 de
Usando o serviço registrado
public void start(BundleContext bc) throws Exception { System.out.println(bc.getBundle().getHeaders().get( Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; ServiceReference reference = bc.getServiceReference (FirstService.class.getName()); FirstService service = FirstService)bc .getService(reference); System.out.println("Using FirstService: formatting date: " + service.getFormattedDate(new Date())); bc.ungetService(reference); }
Slide 15 de
Exercício 3 ◦ Criar um Bundle que registre um
serviço ◦ Fazer build e instalar ◦ Criar Bundle que use um serviço ◦ Fazer build e instalar
Atenção – a ordem deve ser seguida
Slide 16 de
Da forma que foi implementado, o que acontece se tentarmos usar o serviço que não foi registrado? ◦ ERR....
Solução seria simplesmente testar se é nulo o serviço recuperado? O que aconteceria com serviços que fossem registrados depois da
verificação do Activator para encontrar serviços?
Solução: ServiceListener public void start(BundleContext bc) throws Exception {
System.out.println("start " + getClass().getName());
Activator.bc = bc;
String filter = "(objectclass=" + FirstService.class.getName() + ")";
bc.addServiceListener(this, filter); ServiceReference references[] = bc.getServiceReferences(null, filter);
for (int i = 0; references != null && i < references.length; i++) {
this.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED,
references[i]));
} }
Slide 17 de
Exercício 4 ◦ Adaptar a solução encontrada no
exercício 3 de tal forma a permitir a instalação de bundles fora de ordem (pesquisa dinâmica de serviços)
Slide 18 de
Solução alternativa para o ServiceListener: ServiceTrackerCustomizer
public void start(BundleContext bc) throws Exception {
System.out.println(bc.getBundle().getHeaders().get( Constants.BUNDLE_NAME) + " starting..."); Activator.bc = bc; customizer = new MyServiceTrackerCustomizer(bc); tracker = new ServiceTracker(bc, FirstService.class.getName(), customizer); tracker.open(); }
Slide 19 de
Exercício 5 ◦ Adaptar a solução encontrada no
exercício 4 usando ServiceTrackerCustomizer e ServiceTracker
Slide 20 de
Exercício final ◦ Implemente uma solução usando a tecnologia OSGi
para implementar o componente MapLoader indentificado na aplicação Push to Map
The application must be implemented for the JME platform and have to enable a user to locate contacts, displaying the contacts location in a map providing distance information. The maps used to draw the locations can be preloaded or retrieved from a remote server according to a predefined configuration. The application must support different map servers in order to expand the map coverage (Yahoo! maps, Google maps e Map24). The application allows the user to find his/her own GPS location and plots it in a map.
Slide 21 de
Exercício final
Slide 22 de
Exercício Final ◦ Implemente três bundles Bundle com o serviço de recuperação de
Mapas considerando o componente que discutimos
Bundle com o serviço de GPS Bundle usuário dos serviços que apresenta o
mapa recuperado baseado na posição GPS passada como parâmetro através do objeto Coordinate
◦ Utilize a descoberta dinâmica de serviços
Slide 23 de
O que vocês acharam? É útil? Grande interesse da indústria ◦ Diferentes containers ◦ Diferentes projetos explorando arquitetura baseada em
OSGi ◦ Projetos apoiando o desenvolvimento em OSGi ◦ Projeto experimentando OSGi ◦ Mais informações em: http://www.pierocampanelli.info/articles/2006/11/15/osgi-
and-open-source-ecosystem/ Linha de pesquisa na área mobile ◦ JSR 232: Mobile Operational Management http://jcp.org/en/jsr/detail?id=232 ◦ JSR 249: Mobile Service Architecture 2 http://www.jcp.org/en/jsr/detail?id=249
Slide 24 de
OSGi Alliance ◦ http://www.osgi.org/
Equinox ◦ http://www.eclipse.org/equinox/
Knopflerfish ◦ http://www.knopflerfish.org/
Apache FELIX ◦ http://cwiki.apache.org/FELIX/index.html
A Step by Step Introduction to OSGi Programming ◦ www.knopflerfish.org/tutorials/osgi_tutorial.pdf
5-minute guide to start developing with OSGi in Eclipse ◦ http://www.pierocampanelli.info/tutorials/2008/01/02/5-
minute-guide-to-start-developing-with-osgi-in-eclipse/ Getting Started with OSGi ◦ http://live.eclipse.org/node/407
Slide 25 de
Tutorial OSGi – Java World ◦ http://www.javaworld.com/javaworld/jw-03-2008/jw-03-osgi1.html ◦ http://www.javaworld.com/javaworld/jw-04-2008/jw-04-osgi2.html ◦ http://www.javaworld.com/javaworld/jw-06-2008/jw-06-osgi3.html
OSGi on the Web: Here’s How ◦ http://www.slideshare.net/mrdon/the-web-on-osgi-heres-how
Spring Source OSGi Bundle Repository ◦ http://www.springsource.com/repository/app/
Andre L.C. Tavares, Marco Tulio Valente, "A gentle introduction to OSGi", SIGSOFT Software Engineering Notes, Volume 33, Issue 5, August 2008
Kiev Gama, Didier Donsez, "A survey on approaches for addressing dependability attributes in the OSGi service platform", SIGSOFT Software Engineering Notes, Volume 35, Issue 3, May 2010
(Almeida, 2007) E. S. Almeida, RiDE: The RiSE Process for Domain Engineering, Ph.D. Thesis, Federal University of Pernambuco, Informatics Center, Brazil, March, 2007, pp. 276.