intro to osgi and eclipse virgo

39
Introduction to OSGi & Eclipse Virgo Gordon Dickens @gdickens linkedin.com/in/gordondickens Blog: technophile.gordondickens.com GitHub: github.com/gordonad 1

Upload: gordon-dickens

Post on 24-Jun-2015

5.230 views

Category:

Technology


0 download

DESCRIPTION

Presentation I gave on OSGi with Eclipse Virgo and OSGi Blueprint

TRANSCRIPT

Page 1: Intro to OSGi and Eclipse Virgo

1

Introduction to OSGi& Eclipse Virgo

Gordon Dickens

@gdickenslinkedin.com/in/gordondickensBlog: technophile.gordondickens.comGitHub: github.com/gordonad

Page 2: Intro to OSGi and Eclipse Virgo

2

>OSGi TerminologyOSGI containerBundleServiceSpring Dynamic ModulesSpring dm Server

Page 3: Intro to OSGi and Eclipse Virgo

3

OSGI ContainerA low-footprint engine that manages

OSGi componentsCan be embedded into applications

to provide modular componentsThree major OSGi Containers:

◦Equinox The reference implementation for the

framework. The container built into Eclipse. Used by default with Spring dm Server Spring dm Server moving to Eclipse Virgo

project◦Knoplerfish◦Apache Felix

Page 4: Intro to OSGi and Eclipse Virgo

4

The OSGi BundleJAR with extra Config Info

◦Classes and resources that deliver functions to consumers

◦Can “export” services & packages

◦Can “import” services & packages

Page 5: Intro to OSGi and Eclipse Virgo

5

More on Bundles (bundles for dummies?)

Bundle is a JAR

Requires a Manifest that describes the bundle◦META-INF/MANIFEST.MF

You configure the Manifest with◦A machine-readable ID◦Packages required◦Which packages are exportable/private◦Services interfaces to expose◦Requirements - such as the minimum JDK

Page 6: Intro to OSGi and Eclipse Virgo

6

Sample META-INF/MANIFEST.MF

Manifest-Version: 1.0Export-Package: com.gordondickens.utils,org.osgi.framework”Bundle-Name: Maven OSGi Demo – ServicesBuild-Jdk: 1.6.0Bundle-Version: 1.0.0Bundle-ManifestVersion: 2Bundle-Activator: com.gordondickens.services.ServiceActivatorBundle-SymbolicName: maven-osgi-demo-servicesImport-Package: org.osgi.framework;version="1.3"

Page 7: Intro to OSGi and Eclipse Virgo

7

MANIFEST.MF Keywords Bundle-ManifestVersion

◦ Which OSGi container rules to follow. 2 = OSGi Specification release 4 1 = OSGi version 3 or earlier

Bundle-Name◦ Short, human readable name

Bundle-SymbolicName◦ Unique, machine-usable name◦ Used by other bundles & container to refer to the bundle

Bundle-Version◦ Version of the bundle

Bundle-Activator◦ Listener class◦ May be bound to bundle lifecycle (start, stop events)

Bundle-Vendor◦ Human readable name for the vendor who created the bundle

Import-Package◦ Set of packages required for dependency management

Page 8: Intro to OSGi and Eclipse Virgo

8

DependenciesBundles are versioned using the

header Bundle-Version◦Matches Maven version numbers

(underscores converted to periods)Bundles can require other Bundles

to function◦This is configured with the Import-Package header

◦Required versions can be specified using the version= keyword

Versions can be a specific version or range

Page 9: Intro to OSGi and Eclipse Virgo

9

Bundle Lifecycle

Page 10: Intro to OSGi and Eclipse Virgo

10

What can you do with a bundle?

Bundles just expose packages or services to be used◦Does not automatically

hide impl classes◦Package exporting

should only be for utility packages (plumbing).

◦ You only want to expose “services”

Page 11: Intro to OSGi and Eclipse Virgo

11

ServicesRegister POJOs to container as a

service◦Source bundle registers the service interface

◦Target bundle asks the container registry for a reference to the service

Services are managed by Virgo◦Services are “published” to the container registry

◦Clients lookup and consume the services

Page 12: Intro to OSGi and Eclipse Virgo

12

Preparing the ManifestYou could do that by hand,

but…◦Format the MANIFEST.MF file EXACTLY per spec (ending each line on 72 characters, etc)

Instead, Virgo provides the Bundlor build tool

Page 13: Intro to OSGi and Eclipse Virgo

13

Bundlor

Input:◦ jar◦ template.mf

Import-Template

jar

template.mf

The BUNDLOR manifest.mf

• Generates:– manifest.mf

Page 14: Intro to OSGi and Eclipse Virgo

14

What is Blueprint?A framework that

◦Exposes & consumes services from Beans

◦Dynamically publishes App Contexts & beans

◦Handles dependencies◦Can pause bundles while locating

dependencies (during updates, etc)◦Simplifies defining OSGi bundles◦The basis for the Eclipse Virgo, a fully

OSGi-compliant platform based on Equinox

◦Originally from Spring Dynamic Modules

Page 15: Intro to OSGi and Eclipse Virgo

15

The Blueprint ExtenderExtender start up

◦ Looks for Blueprint enabled Bundles◦ Loads their application contexts

automatically◦ Publishes application contexts◦ Exports beans as Services◦ Injects any consumed services from other

Bundles automatically

When a bundle comes online◦ Detects & publishes the Application

Context◦ Inject beans from other required app

contextsReplaces Bundle Activator

Page 16: Intro to OSGi and Eclipse Virgo

16

Template.mfThe Bundlor uses the template.mf to generate the OSGi required manifest.mf file

Which header(s) to use for dependency resolution:

Import-Package - Core OSGi

◦ Used for every external package that the bundle depends on

Require-Bundle - Core OSGi

◦ Bundle must be found to start this bundle

◦ Used specifying the bundle and bundle's version

◦ Brittle, only searched if not found in Import-Package

Import-Bundle - Virgo

◦ Like Import-Package but all packages within an entire bundle

◦ Used specifying the bundle and bundle's version. Not always a best practice, too broad brush.

Import-Library - Virgo

◦ Imports all packages of a specific package, from a library in the Virgo repository.

◦ Packages can be resolved across multiple bundles

◦ Preferred approach for expressing dependency on the Spring Framework.

Import-Template - Bundlor

◦ Used to import packages by version range.

◦ Used when a transitive dependencies not found "your.package (0.0.0)" or "Import of package xyz doesn't specify a version”.

◦ Can use wildcards and setup custom patterns for matching.

In Summary, you need to Import Packages! Bundlor assists with directives to save you time instead of listing out all your packages in the standard OSGi Import-Package header.

Page 17: Intro to OSGi and Eclipse Virgo

17

Dependency ManagementIf a Bundle requires another

bundle◦Load the other bundle◦Damping - Suspends any threads

attempting to access the imported packages

◦Once loaded, threads are resumed

Page 18: Intro to OSGi and Eclipse Virgo

18

Using BlueprintConfiguring your contextThe blueprint: namespaceExporting beans as OSGi Services

into RegistryImporting beans from OSGi

Registry

Page 19: Intro to OSGi and Eclipse Virgo

19

Configuring your ContextGood practice:

◦Separate Spring configuration from Blueprint imports/exports bundle-context.xml bundle-context-osgi.xml

Create 2 context files in META-INF/spring◦All *.xml files in this dir are processed

Page 20: Intro to OSGi and Eclipse Virgo

20

Blueprint ServicesBlueprint enables services to be

published and consumed using descriptions written in XML

Eclipse Virgo supports BlueprintThe XML descriptions reside in

files with extension .xml in the bundle’s META-INF/spring sub-directory.

Page 21: Intro to OSGi and Eclipse Virgo

21

Spring DM ServicesTo publish a service <blueprint:service>

and specify◦ implementation class◦ interface class(es)◦ at bundle start, an instance is published to

the OSGi service registry under the interface

◦ impl class constructed like any other bean

To consume a service <blueprint:reference>◦ service may be passed into other beans using DI

Page 22: Intro to OSGi and Eclipse Virgo

22

Expose the Spring Bean as an OSGi Service

Use the osgi: namespace

<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd” default-activation="eager">

<service ref="exampleBean" interface="com.gordondickens.demo.bean.ExampleBean"/>

</blueprint>

Page 23: Intro to OSGi and Eclipse Virgo

23

Consuming the ServiceUse the blueprint: namespace:

◦Service Beans ◦Valid OSGi Service beans

Can be injected into other Beans using◦XML injection◦annotation-driven injection

Page 24: Intro to OSGi and Eclipse Virgo

24

Example: Consuming an OSGi ServiceUse the <reference> tag in the blueprint: namespace.

<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns=http://www.osgi.org/xmlns/blueprint/v1.0.0 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd" default-activation="eager">

<reference id="exampleBeanService”/></blueprint>

Page 25: Intro to OSGi and Eclipse Virgo

25

Alternative: use bean-name

Exposing

Consuming

<bean id="exampleBean”class="com.gordondickens.demo.bean.internal.ExampleBeanImpl" />

<service id="exampleBeanService” ref="exampleBean"

interface="com.gordondickens.demo.bean.ExampleBean"/>

<reference id="exampleBean”interface="com.gordondickens.demo.bean.ExampleBean" />

Page 26: Intro to OSGi and Eclipse Virgo

26

Service DampingProxies automatically created services

◦ the actual service object may come and go at runtime

If service disappears, any proxies will wait for the service to re-appear.

This effect is known as damping.

Page 27: Intro to OSGi and Eclipse Virgo

27

Blueprint Bundle LifeWhen a bundle is started:

◦ builds application contexts as per the XML◦ creates proxies for specified services◦ publishes specified services to the registry

When a bundle is stopped:◦retracts any services◦closes bundle application context◦turns off damping of a service proxy◦proxy’s app context is being closed

Page 28: Intro to OSGi and Eclipse Virgo

28

Eclipse VirgoOSGi Server based on EquinoxProvides a PAR file archiveProvides PLAN file for grouped or

scoped bundlesProvides Import-Bundle: tag to import

all packages of a given BundleBundle Repository used to manage

artifacts required by other projectsCan be configured to automatically

download required bundles from a Maven repository

Page 29: Intro to OSGi and Eclipse Virgo

29

Virgo Dependency MgmtImport-Bundle:

◦Import-Package is fine grained◦Import-Bundle imports all Packages

from a BundleImport-Library:

◦Imports a Blueprint configured Library

◦A package of Bundles◦Example: the Spring 3.x Framework◦Can use wildcards

Page 30: Intro to OSGi and Eclipse Virgo

30

Virgo Fragments A bundle attached to a host bundle Treated as part of the host Can only add to the host

◦ Configuration◦ Classes◦ Resources

Can not have◦ activator◦ its own class loader

Designated in manifest.mf with Fragment-Host◦ Fragment-Host points to symbolic name of host

Page 31: Intro to OSGi and Eclipse Virgo

31

Virgo Feature - SlicesFragments for web appsUses manifest valuesIn myapp/web/template.mf

◦Slice-Host◦Slice-ContextPath

Slice-Host: com.gordondickenssolutions.runtime.webapp;version="[1.1.0,1.1.0]"

Slice-ContextPath: /myapp

Page 32: Intro to OSGi and Eclipse Virgo

32

Virgo Feature - PAR Files Platform Archive – like a jar/ear/war Multiple bundles packaged together Contains

◦ application name◦ version◦ symbolic name◦ description

The modules within are scoped together Cannot be shared accidentally by other apps The scope forms a boundary for automatic propagation of load

time weaving and bundle refresh The modules of a PAR have their exported packages imported

by the synthetic context bundle, used for thread context class loading

The PAR file is visible to management interfaces The PAR file can be undeployed and redeployed as a unit PARs physically contain the included artifacts

Page 33: Intro to OSGi and Eclipse Virgo

33

Virgo Feature - Plan FilesRecommended over PARsDeployment strategy for a Virgo applicationsSimilar to PARs describing a collection of

bundles to load together as an applicationSimple XML file

◦ defines a collection of artifacts

The syntax of a plan file◦ outer <plan/> tag defines a name and version, as

well as scoping and atomicity requirements◦ Inside the tag is at least one artifact tag with

type name version

Page 34: Intro to OSGi and Eclipse Virgo

34

Virgo Plan FilesDeploys the artifacts in the order

listedCan contain other plans (nesting)Easily share content between plansUpdate individual parts of a plan

without repackaging (re-JAR)Copy the bundles to the repositorythe $DMS_HOME/repository/usr

directory

Page 35: Intro to OSGi and Eclipse Virgo

35

Virgo Plan File Example<?xml version="1.0" encoding="UTF-8"?><plan name="greenpages.db.plan" version="2.4.3.RELEASE” scoped="false" atomic="true” xmlns=http://www.eclipse.org/virgo/schema/plan xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd"> <attributes> <attribute name="web.context.path" value="greenpages"/> </attributes>

<!-- Database properties file (minus file extension) to be deployed --> <artifact type="configuration" name="greenpages.db.config"/>

<artifact type="bundle" name="greenpages" version="[2.4, 2.5)"/> <artifact type="bundle" name="greenpages.db" version="[2.4, 2.5)"/> <artifact type="bundle" name="greenpages.jpa" version="[2.4, 2.5)"/>

<artifact type="bundle" name="greenpages.web" version="[2.4, 2.5)"> <property name="header:Web-ContextPath" value="${web.context.path}"/> </artifact></plan>

Page 36: Intro to OSGi and Eclipse Virgo

36

Connecting to OSGi Platformbin/startup.sh –shell

[or]ssh -p 2402 admin@localhost

Page 37: Intro to OSGi and Eclipse Virgo

37

Admin Consolehttp://localhost:8080/admin

Page 38: Intro to OSGi and Eclipse Virgo

38

Terminology ReviewBundleServiceExtenderFragmentDampingSlices

Page 39: Intro to OSGi and Eclipse Virgo

39

SummaryVirgo makes OSGi easier

◦Registers with the OSGi container

◦Exposes Beans as Services◦Consumes Services as Beans◦Simplfies MANIFEST.MF creation