Professional Documents
Culture Documents
with …
What needs to be done to run
JEE like applications inside Karaf?
@anierbeck
- Karaf PMC, Apache Member
- OPS4j Pax Web Project Lead
3
2014-‐10-‐23
Agenda
• Enterprise Requirements
• OSGi with Karaf
• Enterprise Requirements on Karaf
• Specialties
• Http Service
• Cellar - or how to cluster Karaf
• Summary
4
2014-‐10-‐23
Enterprise Requirements
Enterprise Java
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
6
2014-‐10-‐23
OSGi with Karaf
OSGi - a very brief introduction
• Modular
• OSGi Bundles:
• Service Registry
8
2014-‐10-‐23
What is Karaf
• Container
• OSGi Applications
• Ligthtweight
• Logging
• Deployment
• Configuration
9
2014-‐10-‐23
Karaf - Overview
JMX
Blueprint SSH
10
2014-‐10-‐23
Enterprise requirements on Karaf
Karaf
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
12
2014-‐10-‐23
Enterprise - Pax Web
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
13
2014-‐10-‐23
Enterprise - Pax CDI
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
14
2014-‐10-‐23
Enterprise - Aries
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
15
2014-‐10-‐23
Enterprise - Tomee aka OpenEJB
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
16
2014-‐10-‐23
Enterprise - CXF
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
17
2014-‐10-‐23
Enterprise - ActiveMQ
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
18
2014-‐10-‐23
Enterprise - Cellar
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
19
2014-‐10-‐23
Enterprise - Karaf with features
Bean
JPA 2 SAAJ JAAS JavaMail JNDI
Validation
20
2014-‐10-‐23
Specialties
JPA - Karaf
<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>
22
2014-‐10-‐23
JPA - Karaf
<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
To have this blueprint
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
JNDI is needed
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>
22
2014-‐10-‐23
JTA - Karaf
<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>
<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"
To have this blueprint
xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> JPA and JTA is needed
<bean id="cookBookServiceImpl"
class="de.nierbeck.apachecon.persistence.dao.CookBookServiceImpl">
<jpa:context property="em" unitname="cookbook" />
<tx:transaction method="*" value="Required" />
</bean>
<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>
24
2014-‐10-‐23
Demo
Persistence
26
2014-‐10-‐23
Client
27
2014-‐10-‐23
Client Shell
28
2014-‐10-‐23
Client - Shell
29
2014-‐10-‐23
Client Shell
30
2014-‐10-‐23
Client - Shell
31
2014-‐10-‐23
Http Service
with …
HTTP Service
• Using an Activator:
final HttpContext httpContext = httpService
.createDefaultHttpContext();
// register the BookServlet
registerServiced = bundleContext.registerService(Servlet.class,
cookBookViewServlet, null); 34
}2014-‐10-‐23
Whiteboard
<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>
@WebServlet(urlPatterns = "/book")
public class ViewBookServlet extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Inject
@OsgiService
CookBookService cookBookService;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
...
}
}
36
2014-‐10-‐23
LOST?
Registering - Servlet
Service-
Pax-Web
Registry
HTTP Service
Servlet
38
2014-‐10-‐23
Registering - Servlet
Registerd
Service-
Pax-Web
Registry
HTTP Service
Servlet
38
2014-‐10-‐23
Registering - Servlet
Registerd
Service-
Pax-Web
Registry
HTTP Service
Registerd
Servlet
38
2014-‐10-‐23
Registering - Whiteboard
Service-
Pax-Web
Registry
WebContainer
Service-Tracker
Servlet
39
2014-‐10-‐23
Registering - Whiteboard
Registerd
Service-
Pax-Web
Registry
WebContainer
Service-Tracker
Servlet
39
2014-‐10-‐23
Registering - Whiteboard
Registerd
Service- Registerd
Pax-Web
Registry
WebContainer
Service-Tracker
Servlet
39
2014-‐10-‐23
Registering - Whiteboard
Registerd
Service- Registerd
Pax-Web
Registry
WebContainer
Service-Tracker
Servlet
39
2014-‐10-‐23
Registering - WAR
Service-
Pax-Web Pax-Web
Registry
WebContainer WAR Extender
WAB-Bundle
Servlet
40
2014-‐10-‐23
Registering - WAR
Registerd
Service-
Pax-Web Pax-Web
Registry
WebContainer WAR Extender
WAB-Bundle
Servlet
40
2014-‐10-‐23
Registering - WAR
Registerd Registerd
Service-
Pax-Web Pax-Web
Registry
WebContainer WAR Extender
WAB-Bundle
Servlet
40
2014-‐10-‐23
Registering - WAR
Registerd Registerd
Service-
Pax-Web Pax-Web
Registry
WebContainer WAR Extender
WAB-Bundle
Servlet
40
2014-‐10-‐23
Servlet + JPA / Service
Service-
Blueprint
Pax-Web
Registry
Extender WAR Extender
JPA-Bundle WEB-Bundle
JPA -
Servlet
Service
41
2014-‐10-‐23
Servlet + JPA / Service
Registerd
Service-
Blueprint
Pax-Web
Registry
Extender WAR Extender
JPA-Bundle WEB-Bundle
JPA -
Servlet
Service
41
2014-‐10-‐23
Servlet + JPA / Service
Registerd
Service-
Blueprint
Pax-Web
Registry
Extender WAR Extender
JPA-Bundle WEB-Bundle
JPA -
Servlet
Service
Injected
41
2014-‐10-‐23
Servlet + JPA / Service
Registerd Registerd
Service-
Blueprint
Pax-Web
Registry
Extender WAR Extender
JPA-Bundle WEB-Bundle
JPA -
Servlet
Service
Injected
41
2014-‐10-‐23
Demo
View
43
2014-‐10-‐23
View
44
2014-‐10-‐23
Cluster
provided by Apache Karaf Cellar
Cellar - Cluster Communication
46
2014-‐10-‐23
Cellar - Cluster Communication
Hazelcast
47
2014-‐10-‐23
Cellar - Events
48
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
osgi:install mvn:groupId/artifactId/version
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
Node B Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
Maven Repository
Node A
DE
PR
EC
AT
Node B ED Hazelcast
Node C
49
2014-‐10-‐23
Cellar - Distributing Bundles
cluster:install mvn:groupId/artifactId/version
Maven Repository
Node A
DE
PR
EC
AT
Node B ED Hazelcast
Node C
49
2014-‐10-‐23
Cellar - RMI
Group 1 Group 2
Node A Node A
Consumes OSGi-Service Provides OSGi-Service
Node B Node B
Consumes OSGi-Service Hazelcast Provides OSGi-Service
Node C
Consumes OSGi-Service
50
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cellar - Web session failover
Node A
Filter Servlet
Client Hazelcast
Node B
DataBase
Filter Servlet
51
2014-‐10-‐23
Cluster - Demo
Presentation Layer
53
2014-‐10-‐23
web.xml - Hazelcast
<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> 54
</listener>
2014-‐10-‐23
</web-app>
View
55
2014-‐10-‐23
View
56
2014-‐10-‐23
View
57
2014-‐10-‐23
SUMMARY
Enterprise - Karaf
59
2014-‐10-‐23
JEE with Karaf?
• Wiring of Services:
• Use Blueprint
• @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
61
2014-‐10-‐23
THANKS FOR LISTENING
Thanks to the Apache
Community
Questions
Thanks