25
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

OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 2: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

Slide 2 de

  Introdução

  O caso Eclipse

  Programação OSGi ◦  Exercícios práticos

  Conclusões

Page 3: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicaçõ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

Page 4: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

Slide 4 de

  Problemas com aplicações Java ◦  Camadas com fronteiras mal definidas

Page 5: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 6: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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)

Page 7: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 8: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 9: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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..."); } }

Page 10: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 11: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 12: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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; }

Page 13: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 14: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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); }

Page 15: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 16: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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]));

} }

Page 17: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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)

Page 18: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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(); }

Page 19: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

Slide 19 de

 Exercício 5 ◦ Adaptar a solução encontrada no

exercício 4 usando ServiceTrackerCustomizer e ServiceTracker

Page 20: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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.

Page 21: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

Slide 21 de

  Exercício final

Page 22: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 23: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 24: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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

Page 25: OSGi - Open Services Gateway Initiative - WordPress.com · Slide 3 de A necessidade de módulos O Humilde arquivo JAR Vários arquivos JAR numa aplicação comum Problemas com aplicações

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.