SlideShare ist ein Scribd-Unternehmen logo
1 von 32
Downloaden Sie, um offline zu lesen
© GameDuell GmbH | JAX 2015
Operation am offenen Herzen
Case Study zur erfolgreichen JEE-7 Migration
Dirk Ehms, GameDuell GmbH
© GameDuell GmbH | JAX 2015
•Randbedingungen:
keinen Einfluss auf
•Betrieb
•Entwicklung
SQL / NoSQL / LDAP
Social Platform
Gameduell Plattform Topologie
Classic Platform
64x Frontend Server
10x Reporting / Administration10x Persister Server
OpenMQ
16x Frontend Server
© GameDuell GmbH | JAX 2015
Werkzeuge
Gameduell Entwicklungsumgebung
EAR|WAR
10x Deployment
Artifakte
1x Assembly pro
Stunde
1-2 Deployments
pro Tag
300++ Maven
Module
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
4
© GameDuell GmbH | JAX 2015
Dependency Management: Module POM
5
<project>
<parent>
<groupId>de.gameduell</groupId>
<artifactId>jee-parent</artifactId>
<version>2.8.0</version>
</parent>
...
<dependencies>
...
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
$ mvn clean install
$ mvn clean install –P jee7
© GameDuell GmbH | JAX 2015
Dependency Management: Parent POM
6
<project>
...
<profiles>
<profile>
<id>jee6</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
<profile>
<id>jee7</id>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</dependencyManagement>
</profile>
...
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
7
© GameDuell GmbH | JAX 2015
Source Code Branches
8
Trunk / Master
JEE-7 Branch
3) svn commit
2) svn commit
1. Anlegen einer Kopie vom Trunk / Master
2. Notwendige JEE-7 Anpassungen durchführen
3. Weiterentwicklung erfolgt wie bisher auf dem Trunk
4. Änderungen automatisch zusammenführen
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
9
© GameDuell GmbH | JAX 2015
Gameduell Build Pipeline
10
Source Repository
1. Check-in
2. Trigger Jenkins
3. Artifact Deploy
4. Update JIRA Ticket
5. Success eMail
6. Status: Integrated
Artifact Repository
$ svn ci –m “XYZ-4711, … //minor”
© GameDuell GmbH | JAX 2015
Jenkins konfigurieren
1. Neuen Jenkins Job anlegen
2. VCS Merge (optional)
3. Nachfolger-Job starten
4. Merge Konflikt (optional)
PRIMARY
Jenkins Job
social-services-2.9.1.jar
ARTIFACT
SECONDARY
ARTIFACT
social-services-2.9.1-jee7.jar
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
12
© GameDuell GmbH | JAX 2015
Gameduell Release Pipeline
13
1. Assembly Monkey
(1x pro Stunde)
2. Integrated Tickets
3. Dependency Update
4. Trigger Jenkins
5. Artifact Deploy
6. User Acceptance Tests
Assembly Monkey
Source Repository
Artifact Repository
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
14
© GameDuell GmbH | JAX 2015
Rolling Deployment / Zero Downtime
Load Balancer
Ops
Team
1. 50% der Frontends auf
Standby
2. Deployment auf einem
Frontend
3. User Acceptance Tests
4. Exploratives Testen
5. “Echte” User auf das
Frontend
6. Rollout fortsetzen
7. Vollständiger RolloutQA
Team
UAT
EAR|WAR
© GameDuell GmbH | JAX 2015
Inkrementeller Rollout
16
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
17
© GameDuell GmbH | JAX 2015
Laufzeitverhalten überwachen
18
• Vergleich zwischen GF3 und GF4 (Speicherverbrauch,
CPU, Threads, GC)
• Tools: JConsole, Java VisualVM, Java Mission Control,
Java Flight Recoder
© GameDuell GmbH | JAX 2015
Schritte zum Erfolg
1. Maven Dependency Management, Maven Profile
2. VCS Branches für nicht-kompatiblen Source Code
3. Continuous Integration
4. Continuous Delivery / Release Pipeline
5. Rolling Deployment / Inkrementeller Rollout
6. Laufzeitverhalten überwachen
7. Aufräumarbeiten
19
© GameDuell GmbH | JAX 2015
Aufräumarbeiten
20
1. Integration aller Banches in die zugehörigen Trunks
2. Umstellen der Entwicklungsumgebung auf JEE-7
3. Primäre Jenkins Jobs anpassen (Maven Profil)
4. Alle zusätzlichen Jenkins Jobs löschen
5. Optional: Branches löschen
Trunk / Master
JEE-7 Branch
2) svn delete
© GameDuell GmbH | JAX 2015 21
AusgewählteGlassfishMigrationsbeispiele
© GameDuell GmbH | JAX 2015
<web-app>
...
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>de.gameduell.rest.accounting</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
...
</web-app>
GF3: JAX-RS (web.xml)
22
© GameDuell GmbH | JAX 2015
GF4: JAX-RS (web.xml)
23
<web-app>
...
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>de.gameduell.rest.accounting</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
...
</web-app>
© GameDuell GmbH | JAX 2015
JAX-RS (@Application)
24
@ApplicationPath("/")
public class RestfulServiceApp extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> appClasses = new HashSet<Class<?>>();
appClasses.add(ShopResource.class);
// enable request debugging with LoggingFilter
appClasses.add(LoggingFilter.class);
// substitution for class ::
// com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory
appClasses.add(RolesAllowedDynamicFeature.class);
// use Jackson Feature instead of POJOMappingFeature
appClasses.add(JacksonFeature.class);
return appClasses;
}
@Override
public Set<Object> getSingletons() {
Set<Object> singletons = new HashSet<>();
// substitution for class :: com.sun.jersey.api.container.filter.PostReplaceFilter
singletons.add(new HttpMethodOverrideFilter(new HttpMethodOverrideFilter.Source[0]));
return singletons;
}
}
© GameDuell GmbH | JAX 2015
JAX-RS Type Mapping (GF3 -> GF4)
25
Jersey 1.x JAX-RS2 / Jersey 2.x
com.sun.jersey.api.client.Client javax.ws.rs.client.Client
com.sun.jersey.api.client.WebResource javax.ws.rs.client.WebTarget
com.sun.jersey.api.client.ClientResponse javax.ws.rs.core.Response
com.sun.jersey.spi.container.ContainerRequest
Filter
javax.ws.rs.container.ContainerRequestFilter
com.sun.jersey.spi.container.ContainerRequest org.glassfish.jersey.server.ContainerRequest
com.sun.jersey.spi.container.ContainerRespons
e
org.glassfish.jersey.server.ContainerResponse
com.sun.jersey.core.util.ReaderWriter org.glassfish.jersey.message.internal.ReaderWri
ter
com.sun.jersey.api.json.JSONConfiguration org.glassfish.jersey.jettison.JettisonConfig
com.sun.jersey.api.json.JSONJAXBContext org.glassfish.jersey.jettison.JettisonJaxbContext
© GameDuell GmbH | JAX 2015
JPA / EclipseLink
26
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0“ 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">
<persistence-unit name="social-bus" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/busDataSource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<!-- Multiple persistence units clash with EclipseLink 2.5 annotation pre-processor -->
<property name="eclipselink.canonicalmodel.subpackage" value="bus" />
</properties>
</persistence-unit>
<persistence-unit name="social-mps" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>jdbc/mpsDataSource</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="eclipselink.canonicalmodel.subpackage" value="mps" />
</properties>
</persistence-unit>
</persistence>
© GameDuell GmbH | JAX 2015
Byte Code Incompatibility
27
public class SomeManagedBean {
public void foo() {
FaceletContext faceletContext = (FaceletContext) FacesContext
.getCurrentInstance().getAttributes()
.get(FaceletContext.FACELET_CONTEXT_KEY);
String formId = (String) faceletContext.getAttribute("formId");
...
}
...
}
// JEE-6
public abstract class FaceletContext extends ELContext {
public static final String FACELET_CONTEXT_KEY =
"com.sun.faces.facelets.FACELET_CONTEXT";
}
// JEE-7
public abstract class FaceletContext extends ELContext {
// The key in the FacesContext attribute map for the FaceletContext instance.
public static final String FACELET_CONTEXT_KEY = "javax.faces.FACELET_CONTEXT";
}
© GameDuell GmbH | JAX 2015
@PostConstruct & Checked Exceptions
28
// Glassfish-3
@Stateless
public class AccountingService {
@PostConstruct
public void init() throws IOException {
...
}
...
}
// Glassfish-4
@Stateless
public class AccountingService {
@PostConstruct
public void init(){
try {
...
} catch(IOException e) {
throw new EJBException(e);
}
...
}
...
}
© GameDuell GmbH | JAX 2015
Resource Injection
29
@Stateless
public class DataRetriever {
@Resource(name = "jdbc/reporting_3")
private DataSource dataSource;
...
}
@Stateless
public class DataRetriever {
@Resource(lookup = "jdbc/reporting_3")
private DataSource dataSource;
...
}
© GameDuell GmbH | JAX 2015
Weitere Migrationsbeispiele
• Jackson-Lib package name (ObjectMapper)
org.codehaus.jackson.map → com.fasterxml.jackson.databind
• Geändertes Verhalten der JAXB Implementation
• Neue Atmosphere-Lib Version (1.0.15 → 2.1.7)
• CDI standardmäßig aktiv
• Fehlende Methoden für handgeschriebene Test-Mocks
• HttpServletRequest.login(...) in Verbindung mit
Custom Authentication Modules
• JAX-RS: Default Konstuktoren für Result-Objekte bei
WADL Generierung
• Dateistruktur domain.xml für Embedded Glassfish
• RESTful Ressource innerhalb von EAR-Artifakten können
@Stateless nicht mehr verwenden
30
© GameDuell GmbH | JAX 2015 31
http://gameduell.com/jobs/
© GameDuell GmbH | JAX 2015 32
VielenDank
http://de.slideshare.net/dehms

Weitere ähnliche Inhalte

Was ist angesagt?

BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerPatrick Baumgartner
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenQAware GmbH
 
Continuous Integration mit Hudson
Continuous Integration mit HudsonContinuous Integration mit Hudson
Continuous Integration mit HudsonDr. Christian Betz
 
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!adesso AG
 
Objektbasierte Versionierung und Lifecycle Management für den OWB
Objektbasierte Versionierung und Lifecycle Management für den OWBObjektbasierte Versionierung und Lifecycle Management für den OWB
Objektbasierte Versionierung und Lifecycle Management für den OWBMinerva SoftCare GmbH
 
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...NETWAYS
 
Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Torsten Kleiber
 
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Torsten Kleiber
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...inovex GmbH
 
Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Torsten Kleiber
 
Build Patterns - Patterns und Best Practices für den Build Prozess
Build Patterns - Patterns und Best Practices für den Build ProzessBuild Patterns - Patterns und Best Practices für den Build Prozess
Build Patterns - Patterns und Best Practices für den Build ProzessRalf Abramowitsch
 
WebLogic Server auf ODA: Erfahrungen aus einem Kundenprojekt
WebLogic Server auf ODA: Erfahrungen aus einem KundenprojektWebLogic Server auf ODA: Erfahrungen aus einem Kundenprojekt
WebLogic Server auf ODA: Erfahrungen aus einem KundenprojektOPITZ CONSULTING Deutschland
 

Was ist angesagt? (17)

BED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als EntwicklerBED-Con - Tools für den täglichen Kampf als Entwickler
BED-Con - Tools für den täglichen Kampf als Entwickler
 
Von Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 MinutenVon Maven zu Gradle in 45 Minuten
Von Maven zu Gradle in 45 Minuten
 
Jenkins Acceleration
Jenkins AccelerationJenkins Acceleration
Jenkins Acceleration
 
Vagrant
VagrantVagrant
Vagrant
 
Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?Was ist neu in .NET 4.5?
Was ist neu in .NET 4.5?
 
Continuous Integration mit Hudson
Continuous Integration mit HudsonContinuous Integration mit Hudson
Continuous Integration mit Hudson
 
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
Durchgestartet? Eine Einführung in die Google App Engine / Java - Reloaded!
 
Ant Maven
Ant MavenAnt Maven
Ant Maven
 
Objektbasierte Versionierung und Lifecycle Management für den OWB
Objektbasierte Versionierung und Lifecycle Management für den OWBObjektbasierte Versionierung und Lifecycle Management für den OWB
Objektbasierte Versionierung und Lifecycle Management für den OWB
 
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...
OSMC 2008 | Einsatz von check_multi in einfachen bis hochkomplexen Monitoring...
 
Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020Agile Oracle database modeling and development - APEX Connect 2020
Agile Oracle database modeling and development - APEX Connect 2020
 
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
Das dreckige Dutzend - ADF Migration nach 12c in der IKB - DOAG 2014.
 
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
Continuous Delivery - Development Tool Chain - Virtualisierung, Packer, Vagra...
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018Regulatorics: Offside is when the referee whistles - DOAG 2018
Regulatorics: Offside is when the referee whistles - DOAG 2018
 
Build Patterns - Patterns und Best Practices für den Build Prozess
Build Patterns - Patterns und Best Practices für den Build ProzessBuild Patterns - Patterns und Best Practices für den Build Prozess
Build Patterns - Patterns und Best Practices für den Build Prozess
 
WebLogic Server auf ODA: Erfahrungen aus einem Kundenprojekt
WebLogic Server auf ODA: Erfahrungen aus einem KundenprojektWebLogic Server auf ODA: Erfahrungen aus einem Kundenprojekt
WebLogic Server auf ODA: Erfahrungen aus einem Kundenprojekt
 

Ähnlich wie Gameduell Glassfish Migration

Qualitätssicherung in Webprojekten
Qualitätssicherung in WebprojektenQualitätssicherung in Webprojekten
Qualitätssicherung in WebprojektenSebastian Springer
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOpsAndreas Koop
 
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungOSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungNETWAYS
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsGFU Cyrus AG
 
SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?René Winkelmeyer
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 
Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Tobias Kraft
 
Deployment mit Ansible auf JBoss Servern
Deployment mit Ansible auf JBoss ServernDeployment mit Ansible auf JBoss Servern
Deployment mit Ansible auf JBoss ServernHarald Schmaldienst
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Joachim Baumann
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführunggedoplan
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...Marc Müller
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptOPEN KNOWLEDGE GmbH
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascriptdzuvic
 
Migration zum Zend Framework 3
Migration zum Zend Framework 3Migration zum Zend Framework 3
Migration zum Zend Framework 3Ralf Eggert
 
Java EE Microservices ohne Server
Java EE Microservices ohne ServerJava EE Microservices ohne Server
Java EE Microservices ohne Servergedoplan
 
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8sKontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8sQAware GmbH
 
Sicherheit, Compliance, Höchsteistung mit SPARC/Solaris
Sicherheit, Compliance, Höchsteistung mit SPARC/SolarisSicherheit, Compliance, Höchsteistung mit SPARC/Solaris
Sicherheit, Compliance, Höchsteistung mit SPARC/SolarisJomaSoft
 
Server Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerServer Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerSandro Sonntag
 
Middleware Basics für den DBA
Middleware Basics für den DBAMiddleware Basics für den DBA
Middleware Basics für den DBATrivadis
 

Ähnlich wie Gameduell Glassfish Migration (20)

Qualitätssicherung in Webprojekten
Qualitätssicherung in WebprojektenQualitätssicherung in Webprojekten
Qualitätssicherung in Webprojekten
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOps
 
Oracle WebLogic for DevOps
Oracle WebLogic for DevOpsOracle WebLogic for DevOps
Oracle WebLogic for DevOps
 
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer JungOSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
OSMC 2010 | Java Monitoring und Troubleshooting by Rainer Jung
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 
SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?SNoUG 2015 - Vaadin - XPages 2.0?
SNoUG 2015 - Vaadin - XPages 2.0?
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 
Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?
 
Deployment mit Ansible auf JBoss Servern
Deployment mit Ansible auf JBoss ServernDeployment mit Ansible auf JBoss Servern
Deployment mit Ansible auf JBoss Servern
 
Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)Gradle - Beginner's Workshop (german)
Gradle - Beginner's Workshop (german)
 
JEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine EinführungJEE-Microservices mit Quarkus – eine Einführung
JEE-Microservices mit Quarkus – eine Einführung
 
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
DWX 2017 - Alternativen zu Visual-Studio-Testtools: Wann lohnt es sich auch m...
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
 
JAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & JavascriptJAX 2015 - Continuous Integration mit Java & Javascript
JAX 2015 - Continuous Integration mit Java & Javascript
 
Migration zum Zend Framework 3
Migration zum Zend Framework 3Migration zum Zend Framework 3
Migration zum Zend Framework 3
 
Java EE Microservices ohne Server
Java EE Microservices ohne ServerJava EE Microservices ohne Server
Java EE Microservices ohne Server
 
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8sKontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
Kontinuierliches (Nicht)-Funktionales Testen von Microservices auf K8s
 
Sicherheit, Compliance, Höchsteistung mit SPARC/Solaris
Sicherheit, Compliance, Höchsteistung mit SPARC/SolarisSicherheit, Compliance, Höchsteistung mit SPARC/Solaris
Sicherheit, Compliance, Höchsteistung mit SPARC/Solaris
 
Server Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerServer Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM Server
 
Middleware Basics für den DBA
Middleware Basics für den DBAMiddleware Basics für den DBA
Middleware Basics für den DBA
 

Gameduell Glassfish Migration

  • 1. © GameDuell GmbH | JAX 2015 Operation am offenen Herzen Case Study zur erfolgreichen JEE-7 Migration Dirk Ehms, GameDuell GmbH
  • 2. © GameDuell GmbH | JAX 2015 •Randbedingungen: keinen Einfluss auf •Betrieb •Entwicklung SQL / NoSQL / LDAP Social Platform Gameduell Plattform Topologie Classic Platform 64x Frontend Server 10x Reporting / Administration10x Persister Server OpenMQ 16x Frontend Server
  • 3. © GameDuell GmbH | JAX 2015 Werkzeuge Gameduell Entwicklungsumgebung EAR|WAR 10x Deployment Artifakte 1x Assembly pro Stunde 1-2 Deployments pro Tag 300++ Maven Module
  • 4. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 4
  • 5. © GameDuell GmbH | JAX 2015 Dependency Management: Module POM 5 <project> <parent> <groupId>de.gameduell</groupId> <artifactId>jee-parent</artifactId> <version>2.8.0</version> </parent> ... <dependencies> ... <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> </project> $ mvn clean install $ mvn clean install –P jee7
  • 6. © GameDuell GmbH | JAX 2015 Dependency Management: Parent POM 6 <project> ... <profiles> <profile> <id>jee6</id> <activation> <activeByDefault>true</activeByDefault> </activation> <dependencyManagement> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>6.0</version> <scope>provided</scope> </dependency> </dependencies> </dependencyManagement> </profile> <profile> <id>jee7</id> <dependencyManagement> <dependencies> <dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0</version> <scope>provided</scope> </dependency> </dependencies> </dependencyManagement> </profile> ...
  • 7. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 7
  • 8. © GameDuell GmbH | JAX 2015 Source Code Branches 8 Trunk / Master JEE-7 Branch 3) svn commit 2) svn commit 1. Anlegen einer Kopie vom Trunk / Master 2. Notwendige JEE-7 Anpassungen durchführen 3. Weiterentwicklung erfolgt wie bisher auf dem Trunk 4. Änderungen automatisch zusammenführen
  • 9. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 9
  • 10. © GameDuell GmbH | JAX 2015 Gameduell Build Pipeline 10 Source Repository 1. Check-in 2. Trigger Jenkins 3. Artifact Deploy 4. Update JIRA Ticket 5. Success eMail 6. Status: Integrated Artifact Repository $ svn ci –m “XYZ-4711, … //minor”
  • 11. © GameDuell GmbH | JAX 2015 Jenkins konfigurieren 1. Neuen Jenkins Job anlegen 2. VCS Merge (optional) 3. Nachfolger-Job starten 4. Merge Konflikt (optional) PRIMARY Jenkins Job social-services-2.9.1.jar ARTIFACT SECONDARY ARTIFACT social-services-2.9.1-jee7.jar
  • 12. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 12
  • 13. © GameDuell GmbH | JAX 2015 Gameduell Release Pipeline 13 1. Assembly Monkey (1x pro Stunde) 2. Integrated Tickets 3. Dependency Update 4. Trigger Jenkins 5. Artifact Deploy 6. User Acceptance Tests Assembly Monkey Source Repository Artifact Repository
  • 14. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 14
  • 15. © GameDuell GmbH | JAX 2015 Rolling Deployment / Zero Downtime Load Balancer Ops Team 1. 50% der Frontends auf Standby 2. Deployment auf einem Frontend 3. User Acceptance Tests 4. Exploratives Testen 5. “Echte” User auf das Frontend 6. Rollout fortsetzen 7. Vollständiger RolloutQA Team UAT EAR|WAR
  • 16. © GameDuell GmbH | JAX 2015 Inkrementeller Rollout 16
  • 17. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 17
  • 18. © GameDuell GmbH | JAX 2015 Laufzeitverhalten überwachen 18 • Vergleich zwischen GF3 und GF4 (Speicherverbrauch, CPU, Threads, GC) • Tools: JConsole, Java VisualVM, Java Mission Control, Java Flight Recoder
  • 19. © GameDuell GmbH | JAX 2015 Schritte zum Erfolg 1. Maven Dependency Management, Maven Profile 2. VCS Branches für nicht-kompatiblen Source Code 3. Continuous Integration 4. Continuous Delivery / Release Pipeline 5. Rolling Deployment / Inkrementeller Rollout 6. Laufzeitverhalten überwachen 7. Aufräumarbeiten 19
  • 20. © GameDuell GmbH | JAX 2015 Aufräumarbeiten 20 1. Integration aller Banches in die zugehörigen Trunks 2. Umstellen der Entwicklungsumgebung auf JEE-7 3. Primäre Jenkins Jobs anpassen (Maven Profil) 4. Alle zusätzlichen Jenkins Jobs löschen 5. Optional: Branches löschen Trunk / Master JEE-7 Branch 2) svn delete
  • 21. © GameDuell GmbH | JAX 2015 21 AusgewählteGlassfishMigrationsbeispiele
  • 22. © GameDuell GmbH | JAX 2015 <web-app> ... <servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>de.gameduell.rest.accounting</param-value> </init-param> <init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> ... </web-app> GF3: JAX-RS (web.xml) 22
  • 23. © GameDuell GmbH | JAX 2015 GF4: JAX-RS (web.xml) 23 <web-app> ... <servlet> <servlet-name>Jersey Web Application</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>de.gameduell.rest.accounting</param-value> </init-param> <init-param> <param-name>jersey.config.server.provider.classnames</param-name> <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey Web Application</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> ... </web-app>
  • 24. © GameDuell GmbH | JAX 2015 JAX-RS (@Application) 24 @ApplicationPath("/") public class RestfulServiceApp extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> appClasses = new HashSet<Class<?>>(); appClasses.add(ShopResource.class); // enable request debugging with LoggingFilter appClasses.add(LoggingFilter.class); // substitution for class :: // com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory appClasses.add(RolesAllowedDynamicFeature.class); // use Jackson Feature instead of POJOMappingFeature appClasses.add(JacksonFeature.class); return appClasses; } @Override public Set<Object> getSingletons() { Set<Object> singletons = new HashSet<>(); // substitution for class :: com.sun.jersey.api.container.filter.PostReplaceFilter singletons.add(new HttpMethodOverrideFilter(new HttpMethodOverrideFilter.Source[0])); return singletons; } }
  • 25. © GameDuell GmbH | JAX 2015 JAX-RS Type Mapping (GF3 -> GF4) 25 Jersey 1.x JAX-RS2 / Jersey 2.x com.sun.jersey.api.client.Client javax.ws.rs.client.Client com.sun.jersey.api.client.WebResource javax.ws.rs.client.WebTarget com.sun.jersey.api.client.ClientResponse javax.ws.rs.core.Response com.sun.jersey.spi.container.ContainerRequest Filter javax.ws.rs.container.ContainerRequestFilter com.sun.jersey.spi.container.ContainerRequest org.glassfish.jersey.server.ContainerRequest com.sun.jersey.spi.container.ContainerRespons e org.glassfish.jersey.server.ContainerResponse com.sun.jersey.core.util.ReaderWriter org.glassfish.jersey.message.internal.ReaderWri ter com.sun.jersey.api.json.JSONConfiguration org.glassfish.jersey.jettison.JettisonConfig com.sun.jersey.api.json.JSONJAXBContext org.glassfish.jersey.jettison.JettisonJaxbContext
  • 26. © GameDuell GmbH | JAX 2015 JPA / EclipseLink 26 <?xml version="1.0" encoding="UTF-8"?> <persistence version="2.0“ 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"> <persistence-unit name="social-bus" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/busDataSource</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> <properties> <!-- Multiple persistence units clash with EclipseLink 2.5 annotation pre-processor --> <property name="eclipselink.canonicalmodel.subpackage" value="bus" /> </properties> </persistence-unit> <persistence-unit name="social-mps" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/mpsDataSource</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> <properties> <property name="eclipselink.canonicalmodel.subpackage" value="mps" /> </properties> </persistence-unit> </persistence>
  • 27. © GameDuell GmbH | JAX 2015 Byte Code Incompatibility 27 public class SomeManagedBean { public void foo() { FaceletContext faceletContext = (FaceletContext) FacesContext .getCurrentInstance().getAttributes() .get(FaceletContext.FACELET_CONTEXT_KEY); String formId = (String) faceletContext.getAttribute("formId"); ... } ... } // JEE-6 public abstract class FaceletContext extends ELContext { public static final String FACELET_CONTEXT_KEY = "com.sun.faces.facelets.FACELET_CONTEXT"; } // JEE-7 public abstract class FaceletContext extends ELContext { // The key in the FacesContext attribute map for the FaceletContext instance. public static final String FACELET_CONTEXT_KEY = "javax.faces.FACELET_CONTEXT"; }
  • 28. © GameDuell GmbH | JAX 2015 @PostConstruct & Checked Exceptions 28 // Glassfish-3 @Stateless public class AccountingService { @PostConstruct public void init() throws IOException { ... } ... } // Glassfish-4 @Stateless public class AccountingService { @PostConstruct public void init(){ try { ... } catch(IOException e) { throw new EJBException(e); } ... } ... }
  • 29. © GameDuell GmbH | JAX 2015 Resource Injection 29 @Stateless public class DataRetriever { @Resource(name = "jdbc/reporting_3") private DataSource dataSource; ... } @Stateless public class DataRetriever { @Resource(lookup = "jdbc/reporting_3") private DataSource dataSource; ... }
  • 30. © GameDuell GmbH | JAX 2015 Weitere Migrationsbeispiele • Jackson-Lib package name (ObjectMapper) org.codehaus.jackson.map → com.fasterxml.jackson.databind • Geändertes Verhalten der JAXB Implementation • Neue Atmosphere-Lib Version (1.0.15 → 2.1.7) • CDI standardmäßig aktiv • Fehlende Methoden für handgeschriebene Test-Mocks • HttpServletRequest.login(...) in Verbindung mit Custom Authentication Modules • JAX-RS: Default Konstuktoren für Result-Objekte bei WADL Generierung • Dateistruktur domain.xml für Embedded Glassfish • RESTful Ressource innerhalb von EAR-Artifakten können @Stateless nicht mehr verwenden 30
  • 31. © GameDuell GmbH | JAX 2015 31 http://gameduell.com/jobs/
  • 32. © GameDuell GmbH | JAX 2015 32 VielenDank http://de.slideshare.net/dehms