Operation am offenen Herzen

Ähnliche Dokumente
Operation am offenen Herzen

Daniel Tschan Technischer Leiter. Continuous Delivery mit OpenShift

Continuous Delivery mit OpenShift, 2nd Edition

Continuous Integration (CI) Workshop

Schritt 4: Hallo Enterprise Bean

Axis2, CXF und JAX-WS RI im Vergleich

Artem Eger. Build-Systeme in java Maven & ANT

Buildsystem. Maven & Scons. Controls Entwicklungsforum Januar 2012

Mit Java von der Datenbank in den Browser Thomas Bröll Principal Consultant Trivadis GmbH, Stuttgart

Application Server und Continuous Integration

JAX-RS 2.0 REST mit Java EE 7

End-to-End Agility Sind Sie schon agil genug? Mag. Christoph Leithner

Eclipse Equinox als Basis für Smart Client Anwendungen. Christian Campo, compeople AG, Java Forum Stuttgart 2007

Dennis Schulte / Tobias Flohre codecentric AG. Enterprise Java Batch mit Spring

Renée Bäcker. Perl $foo Magazin

Platform as a Service (PaaS) & Containerization

Build-Pipeline mit Jenkins

CI von Eclipse RCP Anwendungen mit Gradle/Jenkins

Projektgruppe. Thomas Kühne. Komponentenbasiertes Software Engineering mit OSGi

Wir implementieren Lösungen. + DevOps-in-the-Box. Rainer Heinold VP Technology and Services

DevOps with AWS. Software Development und IT Operation Hand in Hand. Matthias Imsand CTO Amanox Solutions AG

Spring Dynamic Modules for OSGi Service Platforms

WER ERZÄHLT DIE NÄCHSTEN 55+ MINUTEN ETWAS?

Continuous Delivery in der Realität eines Großunternehmens

Dirk Reinemann Working Student Sales Consulting

Enterprise JavaBeans Überblick

Der Weisheit letzter Schluss:

Martin. Spiller. Maven 3. Konfigurationsmanagement mit Java

Ant + Ivy Building with dependencies

Projekt Entwicklung verteilter Softwaresysteme mit Web Services SoSe Java API for XML Web Service (JAX-WS) April 2008

Continuous Delivery mit OpenShift

Dominik Helleberg inovex GmbH. Auf Augenhöhe mit Android Studio und Gradle

Continuous Delivery. für Java Anwendungen. Axel Fontaine Software Development Expert

Axis2, CXF und JAX-WS RI im Vergleich

ES GIBT EIN LEBEN NACHCI!

Web-Technologien Kick-Start

Maven 2 Softwareprojekte mit Kultur

Geronimo, konfigurierbarer Java EE Application Server

Auszug aus JAX-WS Folien

Consultant & Geschäftsführer, enpit consulting OHG ugb@enpit.de

Das Build Tool Ant. Sebastian Mancke,

CONTINUOUS DELIVERY. Entmystifiziert. codecentric AG

Pluginbasierte Entwicklung auf Basis einer eigenen JAR Datei

Software(technik)praktikum: SVN-Tutorial

Gerrit und Jenkins ein Traumpaar für Pre-Tested Commit

Maven 2.0. DRV Jahrestagung Java Würzburg Rainer Vehns, codecentric GmbH codecentric GmbH

RESTful Services mit Java EE

AGILE APPLICATION LIFECYCLE MANAGEMENT IM ATLASSIAN ECOSYSTEM

Gerrit und Jenkins ein Traumpaar für Pre-Tested Commit

Enterprise Java Beans Einführung

Java Web Services Metadata JSR-181

Neue Wege mit Contao 4

Prozessautomatisierung mit BPMN 2.0 und Java.

Continuous Everything

WebService in Java SE und EE

DevOps. Alexander Pacnik, Head of DevOps Engineering

Ohne Build geht's besser: Makeloses Java mit dem z 2 -Environment. Henning Blohm

The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into

Bean-Mapping mit MapStruct

Rene Böing, Alexander Kuhn, Marc Wilmes Einführung in Spring und Hibernate

Bekannte Tools in einem agilen Ansatz. Frank Schwichtenberg SourceTalkTage 2013 Göttingen,

Platform as a Service (PaaS) Prof. Dr. Ch. Reich

Java Batch Der Standard für's Stapeln

MICRO-BATCH-SERVICES MIT SPRING BOOT

ALM mit Visual Studio Online. Philip Gossweiler Noser Engineering AG

Kurzanleitung Eclipse

JBoss AS 7. Installation, Konfiguration und Betrieb. Alexander Pacnik Karlsruhe,

Open Source. Hendrik Ebbers 2015

Persönliche Build-Höllen für Jedermann Andreas Hartmann & Dr. Halil-Cem Gürsoy

Spring Dynamic Modules for OSGi Service Platforms

Iterativ. Inkrementell

Mit OSGi Webanwendungen entwickeln Was geht, was nicht?

HAGEN KLATT. Geburtsjahr 1989 Profil-Stand Juni Triona Information und Technologie GmbH Dekan-Laist-Straße 15a Mainz

Benutzung von Eclipse zur Entwicklung von Java EE 5 Anwendungen mit dem JBoss Application Server 5.0

Programmieren II. Exkurs: Apache Maven. Institut für Angewandte Informatik. KIT Die Forschungsuniversität in der Helmholtz-Gemeinschaft

Softwareprojekte mit Kultur

Oliver Paulus, 7. Februar Spring Framework Einführung. Oliver Paulus, Was ist Spring?

From Agile Project Management to Continuous Integration Thomas Bergmüller

Einfache Bean-Mappings mit MapStruct 1.2

ebusiness Übung 3a Spezifikation und Nutzung von Web-APIs (Services) Prof. Dr. Andreas Schmietendorf 1

Einführung in den NetBeans Profiler

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Persistenz. Ralf Gitzel

Programmieren I. Dokumentation mit javadoc Heusch 10.4 Ratz Institut für Angewandte Informatik

Buildwerkzeuge für Javaprojekte. Christian Bunse Institut für Informatik

DevOps in der Praxis. Alexander Pacnik

<Insert Picture Here> Grid Control 11g und My Oracle Support Ulrike Schwinn

Application Frameworks

Übungsaufgabe Transaktion als Middleware

Datenbankpraktikum, Gruppe F. JPA mit Hibernate. Alexander Stautner, Harald Zauner, Sascha Schreier

THOMAS WEHRSPANN. Diplom Wirtschaftsinformatiker Scrum Master. Geburtsjahr 1978 Profil-Stand Oktober 2016

Automatisierter Java EE Entwicklungs-Lifecycle mit WebLogic Server 12c. Robin Müller-Bady Systemberater, Oracle Deutschland

BPMN 2.0 gehört in den Werkzeugkasten JEDES Java Entwicklers!

Inhalt: Konfiguration: web.xml ; server.xml Workflow: Weiterleitung von Requests Lektion II-IV Lektion V-VI

FH LU JEE Vorlesung SS Ralf Gitzel

Um asynchrone Aufrufe zwischen Browser und Web Anwendung zu ermöglichen, die Ajax Hilfsmittel DWR ist gebraucht.

Tool-Chain. Übung. Eclipse, SVN, Ant, Cobertura, Metrics Labor "Software Engineering Experiment" Sebastian Meyer und Kai Stapel

Deep Dive in WebLogic Server und Multi- Tenancy

Oracle WebLogic Server 12c Was gibt es Neues? Erik de Linde Pre-Sales PITSS

Transkript:

Operation am offenen Herzen Praxisbericht einer erfolgreichen JEE-7 Migration Dirk Ehms, GameDuell GmbH

GameDuell Plattform Topologie Classic Platform Social Platform 64x Frontend Server OpenMQ 16x Frontend Server Randbedingungen: keinen Einfluss auf Betrieb Entwicklung 10x Persister Server 10x Reporting / Administration SQL / NoSQL / LDAP

GameDuell Entwicklungsumgebung Werkzeuge 300++ Maven Module EAR WAR 10x Deployment Artefakte 1x Assembly pro Stunde 1-2 Deployments pro Tag

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

Dependency Management: Module POM <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 5

Dependency Management: Parent POM <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> 6

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

Source Code Branches 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 2) svn commit JEE-7 Branch 3) svn commit Trunk / Master 8

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 Build Pipeline Source Repository Artifact Repository 1. Check-in 2. Trigger Jenkins 3. Artifact Deploy 4. Update JIRA Ticket 5. Success email 6. Status: Integrated $ svn ci m XYZ-4711, //minor 10

Jenkins konfigurieren (Trunk) SECONDARY PRIMARY $ mvn clean verify P jee7 Jenkins Job ARTIFACT ARTIFACT social-services-2.9.1.jar social-services-2.9.1.jar 1. Neuen Jenkins Job anlegen 2. Nachfolger-Job starten

Jenkins konfigurieren (Branch) SECONDARY PRIMARY Jenkins Job ARTIFACT ARTIFACT social-services-2.9.1.jar social-services-2.9.1-jee7.jar 1. Neuen Jenkins Job anlegen 2. VCS Merge 3. Nachfolger-Job starten 4. Merge Konflikt (optional)

Module POM und Maven Classifier <project> <profiles> <profile> <id>jee6</id> <dependencies> <dependency> <groupid>de.gameduell.social</groupid> <artifactid>social-services</artifactid> <version>2.9.1</version> </dependency> </dependencies> </profile> <profile> <id>jee7</id> <dependencies> <dependency> <groupid>de.gameduell.social</groupid> <artifactid>social-services</artifactid> <version>2.9.1</version> <classifier>jee7</classifier> </dependency> </dependencies> </profile> </profiles> </project> 13

Byte Code Incompatibility 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"; 14

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 15

GameDuell Release Pipeline Artifact Repository Assembly Monkey 1. Assembly Monkey (1x pro Stunde) 2. Integrated Tickets 3. Dependency Update 4. Trigger Jenkins 5. Artifact Deploy 6. User Acceptance Tests Source Repository 16

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

Rolling Deployment / Zero Downtime Load Balancer UAT Ops Team QA Team EAR WAR 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 Rollout

Inkrementeller Rollout 19

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 20

Laufzeitverhalten überwachen Vergleich zwischen GF3 und GF4 (Speicherverbrauch, CPU, Threads, GC) Tools: JConsole, Java VisualVM, Java Mission Control, Java Flight Recoder 21

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 22

Aufräumarbeiten 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 2) svn delete JEE-7 Branch Trunk / Master 23

Ausgewählte Glassfish Migrationsbeispiele 24

GF3: JAX-RS (web.xml) <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> 25

GF4: JAX-RS (web.xml) <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> 26

JAX-RS (@Application) @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; } 27

JAX-RS Type Mapping (GF3 -> GF4) Jersey 1.x JAX-RS2 / Jersey 2.x com.sun.jersey.api.client.client com.sun.jersey.api.client.webresource com.sun.jersey.api.client.clientresponse com.sun.jersey.spi.container.containerrequest Filter com.sun.jersey.spi.container.containerrequest com.sun.jersey.spi.container.containerrespons e com.sun.jersey.core.util.readerwriter com.sun.jersey.api.json.jsonconfiguration com.sun.jersey.api.json.jsonjaxbcontext javax.ws.rs.client.client javax.ws.rs.client.webtarget javax.ws.rs.core.response javax.ws.rs.container.containerrequestfilter org.glassfish.jersey.server.containerrequest org.glassfish.jersey.server.containerresponse org.glassfish.jersey.message.internal.readerwri ter org.glassfish.jersey.jettison.jettisonconfig org.glassfish.jersey.jettison.jettisonjaxbcontext 28

JPA / EclipseLink <?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> 29

@PostConstruct & Checked Exceptions // 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); } } 30

Resource Injection @Stateless public class DataRetriever { @Resource(name = "jdbc/reporting_3") private DataSource datasource; } @Stateless public class DataRetriever { @Resource(lookup = "jdbc/reporting_3") private DataSource datasource; } 31

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-Artefakten können @Stateless nicht mehr verwenden 32

https://jaxenter.de/operation-am-offenen-herzen-jee-7-migration-im-laufenden-betrieb-24684 Vielen Dank