service oriented web development with osgi - c ziegeler
DESCRIPTION
OSGi Community Event 2014 Abstract: OSGi is complicated, complex and requires too much coding? Whether you think that's true or whether you are interested in seeing live how easy it is to develop a web application with OSGi, this session is the place to go to. During the talk a web application based on OSGi services will be developed leveraging the latest OSGi specifications, the Http Whiteboard Service (RFC 189) and updates to Declarative Services (RFC 190, RFC 208 and RFC 212). The used implementations are well known projects from The Apache Software Foundation. Learn how to leverage the annotation based development which is very easy to use but also very powerful. Apart from developing the application, open source tooling based on the Eclipse IDE will be demonstrated making the life of a developer much easier. Of course, important topics like configuration and management of the web application are covered as well. Speaker Bio: Carsten Ziegeler is senior developer at Adobe Research Switzerland and spends most of his time on architectural and infrastructure topics. Working for over 25 years in open source projects, Carsten is a member of the Apache Software Foundation and heavily participates in several Apache communities including Sling, Felix and ACE. He is a frequent speaker on technology and open source conferences and participates in the OSGi Core Platform and Enterprise expert groups.TRANSCRIPT
Service Oriented Web Development with OSGi Carsten Ziegeler | [email protected]
1
OSGi Community Event 2014
About [email protected] @cziegeler
• RnD Team at Adobe Research Switzerland
• Member of the Apache Software Foundation
• Apache Felix and Apache Sling (PMC and committer)
• And other Apache projects
• OSGi Core Platform and Enterprise Expert Groups
• Member of the OSGi Board
• Book / article author, technical reviewer, conference speaker
2
OSGi Preconceptions
3
No POJOs
Too slow
No dependency injection
Not suitable for the enterprise
No
tool
ing ?!?
4
The Next Big Thing
5
Building Blocks
§ Module aka Bundle
§ Services
§ Components
6
Game Design
7
public enum Level {EASY,MEDIUM,HARD
}
public interface GameController { Game startGame(final String name, final Level level); int nextGuess(final Game status, final int guess); int getMax(final Level level);}
Implementation
8
@Componentpublic class GameControllerImpl implements GameController { ...
Configuration
9
public @interface Config { int easy_max() default 10; int medium_max() default 50; int hard_max() default 100;
}
10
private Config configuration;@Activateprotected void activate(final Config config) {
this.configuration = config;}
11
public int getMax(final Level level) {
int max = 0;
switch (level) { case EASY : max = configuration.easy_max(); break; case MEDIUM : max = configuration.medium_max(); break; case HARD : max = configuration.hard_max(); break; }
return max; }
Web?
12
@Component( service = Servlet.class , property="osgi.http.whiteboard.servlet.pattern=/game")public class GameServlet extends HttpServlet {
13
public class GameServlet extends HttpServlet {@FieldReferenceprivate GameController controller;
14
15
No POJOs
Too slow
No dependency injection
Not suitable for the enterprise
No
tool
ing ✔
Recipe
§ OSGi Declarative Services (Compendium Chapter 112) § + RFC 190 Declarative Services Enhancements (OSGi R6) § + RFC 212 Field Injection for Declarative Services (OSGi R6)
§ OSGi Whiteboard Service § + RFC 189 (OSGi R6)
§ OSGi Configuration Admin (Compendium Chapter 104) § OSGi Metatype Service (Compendium Chapter 105)
§ + RFC 208 Metatype Annotations
16
Management
17
Metatype
18
@ObjectClassDefinition(name = "Game Configuration",description = "The configuration for the guessing game.")
public @interface Config {
@AttributeDefinition(name="Easy", description="Maximum value for easy")
int easy_max() default 10;
Metatype
19
@Component@Designate( ocd = Config.class )public class GameControllerImpl implements GameController {
Component Container Interaction
20
OSGi Service Registry
Declarative Services Blueprint
iPojo, Dependency
Manager, ….
Framework API
Service Scopes
• Singleton • Bundle
• Prototype
21
Servlets
22
@Component( service = Servlet.class , scope=ServiceScope.PROTOTYPE, property="osgi.http.whiteboard.servlet.pattern=/game")public class GameServlet extends HttpServlet { public void init() {...} public void destroy() {...}
Dynamics
§ Lazy instantiation
§ Reference policy and cardinality
§ Reconfiguration
23
Unary References
24
@FieldReferenceprivate GameController controller;
@FieldReference(
cardinality=ReferenceCardinality.OPTIONAL policy=ReferencePolicy.DYNAMIC)private volatile GameStatistics stats;
Multiple References
25
@FieldReference( cardinality=ReferenceCardinality.MULTIPLE)private volatile List<Highscore> highscores;
Multiple References
26
@FieldReferenceprivate final Set<Highscore> highscores = new ConcurrentSkipListSet<Highscore>();
Reconfiguration
27
private volatile Config configuration;
@Activate@Modifiedprotected void activate(final Config config) {
this.configuration = config;}
Web Contexts
28
Servlet B /foo
Servlet A /game
Servlet C /bar
Servlet Filter
Servlet Context /play
Authentication
Servlet X /foo
Servlet Context /fooapp
Authentication
Web Contexts
29
@Component( service = Servlet.class , property={"osgi.http.whiteboard.servlet.pattern=/foo", "osgi.http.whiteboard.context.select=mygame"}public class ServletB extends HttpServlet {
@Component( service = Servlet.class , property={"osgi.http.whiteboard.servlet.pattern=/bar", "osgi.http.whiteboard.context.select=game"}public class ServletC extends HttpServlet {
Try it out today!
§ HTTP Whiteboard Service
§ Servlet contexts (grouping, authentication)
§ Servlets
§ Filters
§ Listeners
30
Try it out today!
§ Declarative Services
§ Easy too use
§ Pojos
§ DI with handling dynamics
§ Tooling
§ Open Source Solutions
§ Building large scale enterprise apps
31
QnA
32