+ All Categories
Transcript

Enterprise Developmentwith …

What needs to be done to run JEE like applications inside Karaf?

2014-­‐10-­‐233

@anierbeck- Karaf PMC, Apache Member - OPS4j Pax Web Project Lead

- Senior IT Consultant @codecentric

- co-Author of Apache Karaf Cookbook

Agenda

• Enterprise Requirements • OSGi with Karaf • Enterprise Requirements on Karaf • Specialties • Http Service • Cellar - or how to cluster Karaf • Summary

2014-­‐10-­‐234

Enterprise Requirements

Enterprise Java

2014-­‐10-­‐236

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

JAX-RPC

SAAJ

OSGi with Karaf

OSGi - a very brief introduction

• Modular

• OSGi Bundles:

• High Cohesion (One classloader/bundle)

• Low Coupling (Package Import/Export)

• Versioning per bundle ( [1.0,2,0) )

• Service Registry

2014-­‐10-­‐238

What is Karaf

• Container

• OSGi Applications

• Ligthtweight

• expandable to Full Enterprise support

• Covers all major needs

• Logging

• Deployment

• Configuration

2014-­‐10-­‐239

Karaf - Overview

2014-­‐10-­‐2310

Console Admin

OSGi Framework - Felix / Equinox

Logging DeployerConfig

JMX

SSHBlueprint

Enterprise requirements on Karaf

Karaf

2014-­‐10-­‐2312

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

JAX-RPC

SAAJ

Enterprise - Pax Web

2014-­‐10-­‐2313

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

JAX-RPC

SAAJ

Enterprise - Pax CDI

2014-­‐10-­‐2314

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

JAX-RPC

SAAJ

Enterprise - Aries

2014-­‐10-­‐2315

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

JAX-RPC

SAAJ

Enterprise - Tomee aka OpenEJB

2014-­‐10-­‐2316

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS

JAX-RPC

JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDISAAJ

Enterprise - CXF

2014-­‐10-­‐2317

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS

JAX-RPC

JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDISAAJ

Enterprise - ActiveMQ

2014-­‐10-­‐2318

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS

JAX-RPC

JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDISAAJ

Enterprise - Cellar

2014-­‐10-­‐2319

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS

JAX-RPC

JAX-RS

JAXR

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDISAAJ

Enterprise - Karaf with features

2014-­‐10-­‐2320

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

Bean Validation

JAX-WS

JAX-RPC

JAX-RS

JAXR

SAAJ

JAXB

JMS

JAAS

JASPIC

JACC

JSR-88

JCA

JavaMail

JSR-77

RMI

JNDI

Specialties

JPA - Karaf

2014-­‐10-­‐2322

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" > <persistence-unit name="cookbook" transaction-type="JTA"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <jta-data-source> osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/cookbook) </jta-data-source> <class>de.nierbeck.apachecon.persistence.entity.Book</class> <class>de.nierbeck.apachecon.persistence.entity.Recipe</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="openjpa.Log" value="slf4j" /> <property name="openjpa.RuntimeUnenhancedClasses" value="supported" /> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> </properties> </persistence-unit> </persistence>

JPA - Karaf

2014-­‐10-­‐2322

<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0" > <persistence-unit name="cookbook" transaction-type="JTA"> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <jta-data-source> osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/cookbook) </jta-data-source> <class>de.nierbeck.apachecon.persistence.entity.Book</class> <class>de.nierbeck.apachecon.persistence.entity.Recipe</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="openjpa.Log" value="slf4j" /> <property name="openjpa.RuntimeUnenhancedClasses" value="supported" /> <property name="openjpa.jdbc.SynchronizeMappings" value="buildSchema"/> </properties> </persistence-unit> </persistence>

To have this blueprint JNDI is needed

JTA - Karaf

2014-­‐10-­‐2323

<blueprint default-activation=„eager" xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<bean id="cookBookServiceImpl" class="de.nierbeck.apachecon.persistence.dao.CookBookServiceImpl"> <jpa:context property="em" unitname="cookbook" /> <tx:transaction method="*" value="Required" /> </bean>

<service id="cookBookService" ref="cookBookServiceImpl" interface="de.nierbeck.apachecon.persistence.api.CookBookService" /> </blueprint>

JTA - Karaf

2014-­‐10-­‐2323

<blueprint default-activation=„eager" xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jpa="http://aries.apache.org/xmlns/jpa/v1.0.0" xmlns:tx="http://aries.apache.org/xmlns/transactions/v1.0.0" xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd">

<bean id="cookBookServiceImpl" class="de.nierbeck.apachecon.persistence.dao.CookBookServiceImpl"> <jpa:context property="em" unitname="cookbook" /> <tx:transaction method="*" value="Required" /> </bean>

<service id="cookBookService" ref="cookBookServiceImpl" interface="de.nierbeck.apachecon.persistence.api.CookBookService" /> </blueprint>

To have this blueprint JPA and JTA is needed

Client - Karaf

2014-­‐10-­‐2324

<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"

default-activation="lazy">

<reference id="cookBookService"interface="de.nierbeck.apachecon.persistence.api.CookBookService" />

<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0"> <command>

<action class="de.nierbeck.apachecon.commands.CreateBook"><property name="bookService" ref="cookBookService" />

</action></command>...

</command-bundle></blueprint>

Demo

Persistence

2014-­‐10-­‐2326

Client

2014-­‐10-­‐2327

Client Shell

2014-­‐10-­‐2328

Client - Shell

2014-­‐10-­‐2329

Client Shell

2014-­‐10-­‐2330

Client - Shell

2014-­‐10-­‐2331

Http Service with …

HTTP Service

2014-­‐10-­‐2333

• Using an Activator: final HttpContext httpContext = httpService

.createDefaultHttpContext();// register the BookServlet

// first wait for the DAO-ServiceCookBookService cookBookService;ServiceReference<CookBookService> serviceReference = bundleContext

.getServiceReference(CookBookService.class);cookBookService = bundleContext.getService(serviceReference);

//now create the servletViewBookServlet viewBookServlet = new ViewBookServlet();

//set the DAO to the ServletviewBookServlet.setCookBookService(cookBookService);

final Dictionary<String, Object> initParams = new Hashtable<String, Object>();try {

httpService.registerServlet("/book", // aliasviewBookServlet,initParams, httpContext);

Whiteboard

2014-­‐10-­‐2334

• Using the whiteboard approach via Activatorpublic void start(BundleContext bc) throws Exception {

bundleContext = bc;

// first wait for the DAO-ServiceCookBookService cookBookService;ServiceReference<CookBookService> serviceReference = bundleContext

.getServiceReference(CookBookService.class);cookBookService = bundleContext.getService(serviceReference);

// create new ServletViewBookServlet cookBookViewServlet = new ViewBookServlet();cookBookViewServlet.setCookBookService(cookBookService);

registerServiced = bundleContext.registerService(Servlet.class,cookBookViewServlet, null);

}

Whiteboard

2014-­‐10-­‐2335

• Using the whiteboard approach via Blueprint

<blueprint default-activation="eager">

<reference id="cookBookService"interface="de.nierbeck.apachecon.persistence.api.CookBookService" />

<bean id="viewBookServlet" class="de.nierbeck.apachecon.view.ViewBookServlet" >

<property name="cookBookService" ref="cookBookService"/></bean>

<service id="servletService" interface="javax.servlet.Servlet" ref="viewBookServlet" /></blueprint>

Servlet 3.0 - Just annotation

2014-­‐10-­‐2336

@WebServlet(urlPatterns = "/book")public class ViewBookServlet extends HttpServlet {

/** * */private static final long serialVersionUID = 1L;

@Inject@OsgiServiceCookBookService cookBookService;

@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException { ...

}}

LOST?

Registering - Servlet

2014-­‐10-­‐2338

Pax-Web HTTP Service

Service-Registry

Servlet

Registering - Servlet

2014-­‐10-­‐2338

Pax-Web HTTP Service

Service-Registry

Servlet

Registerd

Registering - Servlet

2014-­‐10-­‐2338

Pax-Web HTTP Service

Service-Registry

ServletRegisterd

Registerd

Registering - Whiteboard

2014-­‐10-­‐2339

Pax-Web WebContainer

Service-Tracker

Service-Registry

Servlet

Registering - Whiteboard

2014-­‐10-­‐2339

Pax-Web WebContainer

Service-Tracker

Service-Registry

Servlet

Registerd

Registering - Whiteboard

2014-­‐10-­‐2339

Pax-Web WebContainer

Service-Tracker

Service-Registry

Servlet

Registerd

Registerd

Registering - Whiteboard

2014-­‐10-­‐2339

Pax-Web WebContainer

Service-Tracker

Service-Registry

Servlet

Registerd

Registerd

Registering - WAR

2014-­‐10-­‐2340

Pax-Web WebContainer

Pax-Web WAR Extender

Service-Registry

WAB-Bundle

Servlet

Registering - WAR

2014-­‐10-­‐2340

Pax-Web WebContainer

Pax-Web WAR Extender

Service-Registry

WAB-Bundle

Servlet

Registerd

Registering - WAR

2014-­‐10-­‐2340

Pax-Web WebContainer

Pax-Web WAR Extender

Service-Registry

WAB-Bundle

Servlet

RegisterdRegisterd

Registering - WAR

2014-­‐10-­‐2340

Pax-Web WebContainer

Pax-Web WAR Extender

Service-Registry

WAB-Bundle

Servlet

RegisterdRegisterd

Servlet + JPA / Service

2014-­‐10-­‐2341

Blueprint Extender

Pax-Web WAR Extender

JPA-Bundle

Service-Registry

JPA - Service

WEB-Bundle

Servlet

Servlet + JPA / Service

2014-­‐10-­‐2341

Blueprint Extender

Pax-Web WAR Extender

JPA-Bundle

Service-Registry

JPA - Service

WEB-Bundle

Servlet

Registerd

Servlet + JPA / Service

2014-­‐10-­‐2341

Blueprint Extender

Pax-Web WAR Extender

JPA-Bundle

Service-Registry

JPA - Service

WEB-Bundle

Servlet

Registerd

Injected

Servlet + JPA / Service

2014-­‐10-­‐2341

Blueprint Extender

Pax-Web WAR Extender

JPA-Bundle

Service-Registry

JPA - Service

WEB-Bundle

Servlet

RegisterdRegisterd

Injected

Demo

View

2014-­‐10-­‐2343

View

2014-­‐10-­‐2344

Cluster provided by Apache Karaf Cellar

Cellar - Cluster Communication

2014-­‐10-­‐2346

Cellar - Cluster Communication

2014-­‐10-­‐2347

Hazelcast

Cellar - Events

2014-­‐10-­‐2348

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

osgi:install mvn:groupId/artifactId/version

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

DEPRECATED

Cellar - Distributing Bundles

2014-­‐10-­‐2349

Node A

Node B

Node C

Maven Repository

Hazelcast

DEPRECATED

cluster:install mvn:groupId/artifactId/version

Cellar - RMI

2014-­‐10-­‐2350

Group 1

Node A Consumes OSGi-Service

Group 2

Node B Consumes OSGi-Service

Node C Consumes OSGi-Service

Node A Provides OSGi-Service

Node B Provides OSGi-ServiceHazelcast

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cellar - Web session failover

2014-­‐10-­‐2351

Node A

Hazelcast

DataBase

Client

ServletFilter

Node B

ServletFilter

Cluster - Demo

Presentation Layer

2014-­‐10-­‐2353

web.xml - Hazelcast

2014-­‐10-­‐2354

• Hazelcast for Session Replication<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"version="3.0">

<filter><filter-name>hazelcast-filter</filter-name><filter-class>com.hazelcast.web.WebFilter</filter-class>

<!-- Name of the distributed map storing your web session objects -->

<init-param><param-name>map-name</param-name><param-value>my-sessions</param-value>

</init-param><init-param>

<param-name>sticky-session</param-name><param-value>false</param-value>

</init-param></filter><filter-mapping>

<filter-name>hazelcast-filter</filter-name><url-pattern>/*</url-pattern><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher><dispatcher>REQUEST</dispatcher>

</filter-mapping><listener>

<listener-class>com.hazelcast.web.SessionListener</listener-class></listener>

</web-app>

View

2014-­‐10-­‐2355

View

2014-­‐10-­‐2356

View

2014-­‐10-­‐2357

SUMMARY

Enterprise - Karaf

2014-­‐10-­‐2359

Servlet 3

JSF 2

JSP

JPA 2

JTA

CDIEJB 3.1

JAX-WS

JAX-RPC

JAX-RS

JAXR

SAAJ

JAXB

JMS

JAAS RMIJNDI

JEE with Karaf?

• Adoptions needed? YES

• Minor on Persistence - JNDI lookup

• Minor on transaction - Blueprint JTA

• Wiring of Services:

• Use Blueprint

• Use Servlet 3.0 with CDI - @OsgiService

• Session Replication throughout cluster, it’s still standard Hazelcast

2014-­‐10-­‐2360

Resources

• @anierbeck

• notitzblog.nierbeck.de

• https://github.com/ANierbeck/karaf-enterprise-sample

• www.codecentric.de

• karaf.apache.org

• https://ops4j1.jira.com/wiki/display/paxweb/Pax+Web

• #karaf at irc.codehaus.org

• https://www.packtpub.com/application-development/apache-karaf-cookbook

• Pictures, mainly from flickr

2014-­‐10-­‐2361

THANKS FOR LISTENING

Thanks to the Apache Community

Questions

Thanks


Top Related