Guide de portage d'une application en Vertx 3

Pré-requis

Procédure de portage d'une application

  1. Mettez à jour les branches du dépôt local de votre application

  2.  Créez une branche vertx3 en partant de dev puis modifiez la version dans dans deployment/app/conf.json.template et les versions dans gradle.properties

    1. incrémentez la version majeure de l'application

    2. mettre vertxVersion à 3.5.0

    3. mettre entCoreVersion à 3.0-SNAPSHOT

  3. Passez les commandes ci-desous :

find src -name *.java -exec sed -i "s/org.vertx/io.vertx/" {} \; find src -name *.java -exec sed -i "s/io.vertx.java/io.vertx/" {} \; find src -name *.java -exec sed -i "s/io.vertx.core.logging.impl/io.vertx.core.logging/" {} \; find src -name *.java -exec sed -i "s/putString/put/g" {} \; find src -name *.java -exec sed -i "s/putObject/put/g" {} \; find src -name *.java -exec sed -i "s/putArray/put/g" {} \; find src -name *.java -exec sed -i "s/putNumber/put/g" {} \; find src -name *.java -exec sed -i "s/putBoolean/put/" {} \; find src -name *.java -exec sed -i "s/expectMultiPart/setExpectMultipart/" {} \; find src -name *.java -exec sed -i "s/new Buffer(/Buffer.buffer(/" {} \; find src -name *.java -exec sed -i "s/getFieldNames/fieldNames/" {} \; find src -name *.java -exec sed -i "s/getArray/getJsonArray/" {} \; find src -name *.java -exec sed -i "s/addString/add/" {} \; find src -name *.java -exec sed -i "s/addObject/add/" {} \; find src -name *.java -exec sed -i "s/addNumber/add/" {} \; find src -name *.java -exec sed -i "s/getObject/getJsonObject/g" {} \; find src -name *.java -exec sed -i "s/AsyncResultHandler/Handler<AsyncResult>/g" {} \; find src -name *.java -exec sed -i "s/VoidHandler/Handler<Void>/g" {} \; find src -name *.java -exec sed -i "s/registerLocalHandler/localConsumer/g" {} \; find src -name *.java -exec sed -i "s/removeField/remove/g" {} \; find src -name *.java -exec sed -i "s/containsField/containsKey/g" {} \; find src -name *.java -exec sed -i "s/dataHandler/handler/g" {} \; find src -name *.java -exec sed -i "s/container.config()/config/g" {} \; find src -name *.java -exec sed -i "s/toList(/getList(/g" {} \; find src -name *.java -exec sed -i "s/JsonElement/Object/g" {} \; find src -name *.java -exec sed -i "s/import io.vertx.platform.Container;//" {} \; find src -name *.java -exec sed -i "s/import io.vertx.core.http.RouteMatcher;/import org.vertx.java.core.http.RouteMatcher;/" {} \; find src -name *.java -exec sed -i "s/public void start()/public void start() throws Exception/" {} \; find src -name *.java -exec sed -i "s/protected void handle()/public void handle(Void v)/" {} \; find src -name *.java -exec sed -i "s/new JsonArray/new fr.wseduc.webutils.collections.JsonArray/" {} \;



4. Changez le fichier build.gradle par celui-ci :

plugins { id 'java' id 'scala' id 'maven' id 'maven-publish' id 'com.github.johnrengelman.shadow' version '2.0.1' } if (!hasProperty('odeUsername')) { ext.odeUsername = '' } if (!hasProperty('odePassword')) { ext.odePassword = '' } repositories { mavenLocal() maven { url "https://maven.opendigitaleducation.com/nexus/content/groups/public" } mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/iovertx-3720/" } maven { url "https://oss.sonatype.org/content/repositories/snapshots" } } configurations { provided runtime.exclude module: 'vertx-core' } sourceSets { main { compileClasspath += configurations.provided } } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } sourceCompatibility = 1.8 targetCompatibility = 1.8 compileJava { sourceCompatibility = project.sourceCompatibility targetCompatibility = project.targetCompatibility } compileTestJava { sourceCompatibility = project.sourceCompatibility targetCompatibility = project.targetCompatibility } dependencies { compileOnly "io.vertx:vertx-core:$vertxVersion" compile "org.entcore:common:$entCoreVersion" testCompile "org.entcore:tests:$entCoreVersion" testCompile 'io.gatling.highcharts:gatling-charts-highcharts:2.2.2' } jar { manifest { attributes( "Main-Verticle": "service:mod" ) } } shadowJar { classifier = 'fat' archiveName = "${modowner}~${modname}~$version-$classifier.$extension" mergeServiceFiles { include 'META-INF/services/io.vertx.core.spi.VerticleFactory' } } publishing { repositories { if (version.endsWith("SNAPSHOT")) { maven { name 'Snapshots' url 'https://maven.opendigitaleducation.com/nexus/content/repositories/snapshots/' credentials { username "${odeUsername}" password "${odePassword}" } } } else { maven { name 'Releases' url 'https://maven.opendigitaleducation.com/nexus/content/repositories/releases/' credentials { username "${odeUsername}" password "${odePassword}" } } } } publications { maven(MavenPublication) { groupId "${modowner}" artifactId "${modname}" artifact("build/libs/${modowner}~${modname}~$version-fat.jar") { classifier "fat" } } maven(MavenPublication) { groupId "${modowner}" artifactId "${modname}" artifact("build/libs/${modname}-$version-deployment.jar") { classifier "deployment" } } maven(MavenPublication) { groupId "${modowner}" artifactId "${modname}" artifact("build/libs/${modname}-$version-tests.jar") { classifier "tests" } } } } javadoc { options.encoding = 'UTF-8' classpath = configurations.provided classpath += configurations.compile } test { } task testJar(type: Jar) { classifier = 'tests' baseName = "${modname}" from sourceSets.test.output } task deploymentJar(type: Jar) { classifier = 'deployment' baseName = "${modname}" from 'deployment' } artifacts { archives testJar archives deploymentJar }



5. Ouvrez votre ide, rafraichir gradle puis "fix gradle settings" et choisissez le répertoire de votre gradle 4

6. Fixez les erreurs :

7. Exécutez la commande gradle clean shadowJar install publishToMavenLocal (la commande gradle doit venir de l'install de gradle version 4).

8. Pour ajouter les fichiers de build Docker et Jenkins :

wget https://raw.githubusercontent.com/OPEN-ENT-NG/forum/vertx3/build.sh wget https://raw.githubusercontent.com/OPEN-ENT-NG/forum/vertx3/Jenkinsfile wget https://raw.githubusercontent.com/OPEN-ENT-NG/forum/vertx3/docker-compose.yml chmod +x build.sh wget -O build.gradle https://raw.githubusercontent.com/OPEN-ENT-NG/forum/vertx3/build.gradle git add Jenkinsfile build.sh docker-compose.yml build.gradle



Testez la migration

  • Ajoutez l'application dans les fichiers gradle.properties et build.gradle du springboard

  • Gérez la conf de test

  • Lancez l'application 

    • Vous pouvez utiliser le run.sh du springboard qui fera le téléchargement du vertx-service-launcher

    • Ou lancer la commande ci-dessous qui vous permettra de faire du débug :

      • java -agentlib:jdwp=transport=dt_socket,address=5000,server=y,suspend=n -jar vertx-service-launcher-1.0-SNAPSHOT-fat.jar -Dvertx.services.path=mods -Dvertx.disableFileCaching=true -conf ent-core.embedded.json

Changements notables

  • Unsupported text
    Unsupported text

  • Tous les appels au bus on maintenant un timeout par défaut à 30 secondes.

    • Vous pouvez augmenter ce timeout sur un appel en particulier en ajoutant new DeliveryOptions().setSendTimeout(TIMEOUT) dans l'appel de la méthode send.

    • Les handler renvoient forcement un AsyncResult. La méthode statique handlerToAsyncHandler de la classe Utils dans web-utils permet de faire la compatibilité.



  • L'instanciation du client Http doit passer par un HttpClientOptions



  • io.vertx.core.json.JsonObject ne renvoit pas la valeur défaut si la valeur existe mais qu'elle est nulle.

    • La classe fr.wseduc.webutils.collections.JsonObject permet de palier ce  problème.

  • io.vertx.core.json.JsonArray n'accepte plus d'ajouter des valeurs nulles avec la méthode add.

    • La classe fr.wseduc.webutils.collections.JsonArray permet de palier ce  problème.