Guide de portage d'une application en Vertx 3
Pré-requis
Installez le jdk 8
Installez gradle 4. Vous pouvez télécharger l'archive ici : https://services.gradle.org/distributions/gradle-4.3.1-bin.zip
Pour vos tests, utilisez la branche vertx3 du springboard ent77 : https://github.com/OPEN-ENT-NG/springboard-ent77/tree/vertx3
Procédure de portage d'une application
Mettez à jour les branches du dépôt local de votre application
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
incrémentez la version majeure de l'application
mettre vertxVersion à 3.5.0
mettre entCoreVersion à 3.0-SNAPSHOT
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 :
Remplacer Container container par JsonObject config et remplacer les références à container.
Les méthodes ont changé dans les JsonArray et JsonObject. Vous aurez sûrment des erreurs sur les get. changez la méthode en choissant le type approprié.
Si vous avez un httpclient. Le builder avec le host, port, ssl, etc, doit maintenant être dans un HttpClientOptions. E.g. https://github.com/entcore/entcore/blob/vertx3.5/common/src/main/java/org/entcore/common/storage/impl/HttpAntivirusClient.java#L40
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 textTous 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.