Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unregister Vert.x codecs in dev-mode #10935

Merged
merged 1 commit into from
Jul 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package io.quarkus.vertx.devmode;

import java.util.UUID;
import java.util.concurrent.CountDownLatch;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.inject.Inject;

import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;

import io.quarkus.test.QuarkusDevModeTest;
import io.restassured.RestAssured;
import io.vertx.core.Vertx;
import io.vertx.ext.web.Router;

public class ConsumeUuidEventHotReloadTest {

@RegisterExtension
static final QuarkusDevModeTest test = new QuarkusDevModeTest()
.setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class)
.addClasses(UuidMessageConsumer.class, BeanDeployingAVerticleFromInstance.class));

private static final String SAMPLE_UUID = "38400000-8cf0-11bd-b23e-10b96e4ef00d";

@Test
public void testUuidMessageConsumption() {
String resp = RestAssured.get("/").asString();
Assertions.assertEquals("test-" + SAMPLE_UUID, resp);
test.modifySourceFile(UuidMessageConsumer.class, data -> data.replace("test-", "other-"));
resp = RestAssured.get("/").asString();
Assertions.assertEquals("other-" + SAMPLE_UUID, resp);
String resp2 = RestAssured.get("/").asString();
Assertions.assertEquals(resp, resp2);

}

@ApplicationScoped
public static class BeanDeployingAVerticleFromInstance {
@Inject
Vertx vertx;

public void init(@Observes Router router) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
vertx.deployVerticle(new MyVerticle(),
ar -> latch.countDown());
router.get("/").handler(rc -> vertx.eventBus().<String> request("event", UUID.fromString(SAMPLE_UUID),
ar -> rc.response().end(ar.result().body())));
latch.await();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package io.quarkus.vertx.devmode;

import java.util.UUID;

import javax.enterprise.context.ApplicationScoped;

import io.quarkus.vertx.ConsumeEvent;

@ApplicationScoped
public class UuidMessageConsumer {

@ConsumeEvent(value = "event", blocking = true)
public String handleUuid(UUID uuid) {
return "test-" + uuid.toString();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import io.quarkus.runtime.RuntimeValue;
import io.quarkus.runtime.ShutdownContext;
import io.quarkus.runtime.annotations.Recorder;
import io.quarkus.runtime.configuration.ProfileManager;
import io.quarkus.vertx.ConsumeEvent;
import io.vertx.core.AsyncResult;
import io.vertx.core.Handler;
Expand Down Expand Up @@ -144,12 +145,19 @@ private EventConsumerInvoker createInvoker(String invokerClassName) {
@SuppressWarnings("unchecked")
private void registerCodecs(Map<Class<?>, Class<?>> codecByClass) {
EventBus eventBus = vertx.eventBus();
boolean isDevMode = ProfileManager.getLaunchMode() == LaunchMode.DEVELOPMENT;
for (Map.Entry<Class<?>, Class<?>> codecEntry : codecByClass.entrySet()) {
Class<?> target = codecEntry.getKey();
Class<?> codec = codecEntry.getValue();
try {
if (MessageCodec.class.isAssignableFrom(codec)) {
MessageCodec messageCodec = (MessageCodec) codec.newInstance();
if (isDevMode) {
// we need to unregister the codecs because in dev mode vert.x is not reloaded
// which means that if we don't unregister, we get an exception mentioning that the
// codec has already been registered
eventBus.unregisterDefaultCodec(target);
}
eventBus.registerDefaultCodec(target, messageCodec);
} else {
LOGGER.error(String.format("The codec %s does not inherit from MessageCodec ", target.toString()));
Expand Down