OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O...

Post on 31-Jul-2020

0 views 0 download

Transcript of OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O...

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.