Closed wjw465150 closed 1 year ago
The only order we can guarantee are messages received on the same event-loop.
When messages are processed on different event-loops the order is not guaranteed, e.g an event loop might have to do other work before it can deliver the message to the handler, so there is always a random effect that will make you observe messages received in a different order on different event loops.
Questions
When there are multiple consumers at one address,Messages are received in a disorderly order!
Version
Vertx 4.4.2
Test Source Code
import java.text.MessageFormat; import java.util.concurrent.TimeUnit;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import io.vertx.core.AbstractVerticle; import io.vertx.core.Promise; import io.vertx.core.eventbus.EventBus; import io.vertx.core.eventbus.MessageProducer; import io.vertx.core.json.JsonObject;
public class SenderVerticle extends AbstractVerticle { private Logger logger;
public SenderVerticle() { this.logger = LoggerFactory.getLogger(this.getClass()); }
@Override public void start(Promise startPromise) {
EventBus eventBus = vertx.eventBus();
} }
import java.util.Arrays; import java.util.concurrent.TimeUnit; import java.util.function.Supplier;
import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import io.vertx.core.CompositeFuture; import io.vertx.core.DeploymentOptions; import io.vertx.core.Future; import io.vertx.core.Promise; import io.vertx.core.Verticle; import io.vertx.core.Vertx; import io.vertx.core.VertxOptions; import io.vertx.junit5.RunTestOnContext; import io.vertx.junit5.Timeout; import io.vertx.junit5.VertxExtension; import io.vertx.junit5.VertxTestContext;
@ExtendWith(VertxExtension.class) @Timeout(value = 10, timeUnit = TimeUnit.MINUTES) public class TestEventBusOrder { private static Logger logger = LoggerFactory.getLogger(TestEventBusOrder.class);
static VertxOptions options = new VertxOptions(); static { long blockedThreadCheckInterval = 60 60 1000L; if (System.getProperties().getProperty("vertx.options.blockedThreadCheckInterval") != null) { blockedThreadCheckInterval = Long.valueOf(System.getProperties().getProperty("vertx.options.blockedThreadCheckInterval")); } options.setBlockedThreadCheckInterval(blockedThreadCheckInterval); }
@RegisterExtension static RunTestOnContext rtoc = new RunTestOnContext(options);
@BeforeAll public static void setUp() { // }
@AfterAll public static void endUp() { rtoc.vertx().close(); }
@Test @Timeout(value = 10, timeUnit = TimeUnit.MINUTES) void verticle_deployed(VertxTestContext testContext) throws Throwable {
}
private Future deployVerticleIfNeeded(Vertx vertx, Supplier verticleSupplier, DeploymentOptions options) {
if (options.getInstances() == 0) {
return Future.succeededFuture("");
} else {
return vertx.deployVerticle(verticleSupplier, options);
}
}
}
2023-06-11 13:03:11.706 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 0 2023-06-11 13:03:11.709 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 1 2023-06-11 13:03:11.710 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 2 2023-06-11 13:03:11.710 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 3 2023-06-11 13:03:11.711 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 4 2023-06-11 13:03:11.711 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 5 2023-06-11 13:03:11.711 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 6 2023-06-11 13:03:11.712 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 7 2023-06-11 13:03:11.712 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 8 2023-06-11 13:03:11.713 [vert.x-eventloop-thread-3] INFO org.wjw.vertx.eventbus.SenderVerticle - [lambda$0,33] - send_msg: 9 2023-06-11 13:03:11.740 [vert.x-eventloop-thread-1] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":0} 2023-06-11 13:03:11.740 [vert.x-eventloop-thread-2] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":1} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-2] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":3} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-1] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":2} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-2] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":5} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-2] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":7} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-1] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":4} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-2] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":9} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-1] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":6} 2023-06-11 13:03:11.741 [vert.x-eventloop-thread-1] INFO org.wjw.vertx.eventbus.ConsumerVerticle - [lambda$0,29] - receive_msg: {"seq":8} 2023-06-11 13:03:21.715 [vert.x-eventloop-thread-0] INFO org.wjw.vertx.eventbus.TestEventBusOrder - [lambda$2,77] - Start OK