Post on 02-Jul-2015
description
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