Search in sources :

Example 6 with Vertx

use of io.vertx.mutiny.core.Vertx in project smallrye-reactive-messaging by smallrye.

the class AbstractMediator method invokeBlocking.

@SuppressWarnings("unchecked")
protected <T> Uni<T> invokeBlocking(Message<?> message, Object... args) {
    try {
        Optional<LocalContextMetadata> metadata = message != null ? message.getMetadata().get(LocalContextMetadata.class) : Optional.empty();
        Context currentContext = metadata.map(m -> Context.newInstance(m.context())).orElseGet(Vertx::currentContext);
        return workerPoolRegistry.executeWork(currentContext, Uni.createFrom().emitter(emitter -> {
            try {
                Object result = this.invoker.invoke(args);
                if (result instanceof CompletionStage) {
                    ((CompletionStage<?>) result).thenAccept(x -> emitter.complete((T) x));
                } else {
                    emitter.complete((T) result);
                }
            } catch (RuntimeException e) {
                log.methodException(configuration().methodAsString(), e);
                emitter.fail(e);
            }
        }), configuration.getWorkerPoolName(), configuration.isBlockingExecutionOrdered());
    } catch (RuntimeException e) {
        log.methodException(configuration().methodAsString(), e);
        throw e;
    }
}
Also used : Context(io.vertx.mutiny.core.Context) WorkerPoolRegistry(io.smallrye.reactive.messaging.providers.connectors.WorkerPoolRegistry) Acknowledgment(org.eclipse.microprofile.reactive.messaging.Acknowledgment) HealthCenter(io.smallrye.reactive.messaging.providers.extension.HealthCenter) CompletableFuture(java.util.concurrent.CompletableFuture) ProviderMessages.msg(io.smallrye.reactive.messaging.providers.i18n.ProviderMessages.msg) Function(java.util.function.Function) ConverterUtils(io.smallrye.reactive.messaging.providers.helpers.ConverterUtils) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) MessageConverter(io.smallrye.reactive.messaging.MessageConverter) Objects(java.util.Objects) Message(org.eclipse.microprofile.reactive.messaging.Message) Invoker(io.smallrye.reactive.messaging.Invoker) CompletionStage(java.util.concurrent.CompletionStage) ProviderExceptions.ex(io.smallrye.reactive.messaging.providers.i18n.ProviderExceptions.ex) Vertx(io.vertx.mutiny.core.Vertx) Optional(java.util.Optional) ProviderLogging.log(io.smallrye.reactive.messaging.providers.i18n.ProviderLogging.log) MediatorConfiguration(io.smallrye.reactive.messaging.MediatorConfiguration) BroadcastHelper(io.smallrye.reactive.messaging.providers.helpers.BroadcastHelper) Subscriber(org.reactivestreams.Subscriber) Instance(javax.enterprise.inject.Instance) LocalContextMetadata(io.smallrye.reactive.messaging.providers.locals.LocalContextMetadata) Context(io.vertx.mutiny.core.Context) LocalContextMetadata(io.smallrye.reactive.messaging.providers.locals.LocalContextMetadata) Vertx(io.vertx.mutiny.core.Vertx) CompletionStage(java.util.concurrent.CompletionStage)

Example 7 with Vertx

use of io.vertx.mutiny.core.Vertx in project smallrye-reactive-messaging by smallrye.

the class RabbitMQClientHelper method createClient.

static RabbitMQClient createClient(RabbitMQConnector connector, RabbitMQConnectorCommonConfiguration config, Instance<RabbitMQOptions> optionsInstances, Instance<CredentialsProvider> credentialsProviderInstances) {
    RabbitMQClient client;
    Optional<String> clientOptionsName = config.getClientOptionsName();
    Vertx vertx = connector.getVertx();
    if (clientOptionsName.isPresent()) {
        client = createClientFromClientOptionsBean(vertx, optionsInstances, clientOptionsName.get());
    } else {
        client = getClient(vertx, config, credentialsProviderInstances);
    }
    connector.addClient(client);
    return client;
}
Also used : RabbitMQClient(io.vertx.mutiny.rabbitmq.RabbitMQClient) Vertx(io.vertx.mutiny.core.Vertx)

Example 8 with Vertx

use of io.vertx.mutiny.core.Vertx in project smallrye-reactive-messaging by smallrye.

the class MqttServerSourceTest method testMultiple.

@Test
void testMultiple(io.vertx.core.Vertx vertx, VertxTestContext testContext) {
    final Map<String, String> configMap = new HashMap<>();
    configMap.put("port", "0");
    final MqttServerSource source = new MqttServerSource(new Vertx(vertx), new MqttServerConnectorIncomingConfiguration(TestUtils.config(configMap)));
    final PublisherBuilder<MqttMessage> mqttMessagePublisherBuilder = source.source();
    final List<TestMqttMessage> testMessages = new CopyOnWriteArrayList<>();
    testMessages.add(new TestMqttMessage("hello/topic", 1, "Hello world!", EXACTLY_ONCE.value(), false));
    testMessages.add(new TestMqttMessage("foo/bar", 2, "dkufhdspkjfosdjfs;", AT_LEAST_ONCE.value(), true));
    testMessages.add(new TestMqttMessage("foo/bar", -1, "Hello world!", AT_MOST_ONCE.value(), false));
    final Checkpoint messageReceived = testContext.checkpoint(testMessages.size());
    final Checkpoint messageAcknowledged = testContext.checkpoint(testMessages.size());
    final AtomicInteger index = new AtomicInteger(0);
    mqttMessagePublisherBuilder.forEach(mqttMessage -> {
        testContext.verify(() -> TestUtils.assertMqttEquals(testMessages.get(index.getAndIncrement()), mqttMessage));
        messageReceived.flag();
        mqttMessage.ack().thenApply(aVoid -> {
            messageAcknowledged.flag();
            return aVoid;
        });
    }).run();
    TestUtils.sendMqttMessages(testMessages, CompletableFuture.supplyAsync(() -> {
        await().until(source::port, port -> port != 0);
        return source.port();
    }), testContext);
}
Also used : VertxTestContext(io.vertx.junit5.VertxTestContext) MqttQoS(io.netty.handler.codec.mqtt.MqttQoS) Awaitility.await(org.awaitility.Awaitility.await) HashMap(java.util.HashMap) CompletableFuture(java.util.concurrent.CompletableFuture) VertxExtension(io.vertx.junit5.VertxExtension) Test(org.junit.jupiter.api.Test) List(java.util.List) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Map(java.util.Map) Vertx(io.vertx.mutiny.core.Vertx) Checkpoint(io.vertx.junit5.Checkpoint) Collections(java.util.Collections) PublisherBuilder(org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) HashMap(java.util.HashMap) Vertx(io.vertx.mutiny.core.Vertx) Checkpoint(io.vertx.junit5.Checkpoint) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) Test(org.junit.jupiter.api.Test)

Example 9 with Vertx

use of io.vertx.mutiny.core.Vertx in project smallrye-reactive-messaging by smallrye.

the class BatchCommitStrategiesTest method testThrottledStrategyWithTooManyUnackedMessages.

@Test
void testThrottledStrategyWithTooManyUnackedMessages() {
    MapBasedConfig config = commonConfiguration().with("client.id", UUID.randomUUID().toString()).with("commit-strategy", "throttled").with("auto.offset.reset", "earliest").with("health-enabled", true).with("throttled.unprocessed-record-max-age.ms", 1000).with("auto.commit.interval.ms", 100);
    String group = UUID.randomUUID().toString();
    source = new KafkaSource<>(vertx, group, new KafkaConnectorIncomingConfiguration(config), getConsumerRebalanceListeners(), CountKafkaCdiEvents.noCdiEvents, getDeserializationFailureHandlers(), -1);
    injectMockConsumer(source, consumer);
    List<Message<?>> list = new CopyOnWriteArrayList<>();
    source.getBatchStream().subscribe().with(list::add);
    TopicPartition p0 = new TopicPartition(TOPIC, 0);
    TopicPartition p1 = new TopicPartition(TOPIC, 1);
    Map<TopicPartition, Long> offsets = new HashMap<>();
    offsets.put(p0, 0L);
    offsets.put(p1, 5L);
    consumer.updateBeginningOffsets(offsets);
    consumer.schedulePollTask(() -> {
        consumer.rebalance(offsets.keySet());
        source.getCommitHandler().partitionsAssigned(offsets.keySet());
    });
    for (int i = 0; i < 500; i++) {
        int j = i;
        consumer.schedulePollTask(() -> {
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 0, j, "k", "v0-" + j));
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 1, j, "r", "v1-" + j));
        });
    }
    // Expected number of messages: 500 messages in each partition minus the [0..5) messages from p1
    int expected = 500 * 2 - 5;
    await().until(() -> list.stream().map(IncomingKafkaRecordBatch.class::cast).mapToLong(r -> r.getRecords().size()).sum() == expected);
    // Ack first 10 records
    int count = 0;
    for (Message<?> message : list) {
        assertThat(message.getMetadata(IncomingKafkaRecordBatchMetadata.class)).isPresent();
        if (count < 10) {
            message.ack().toCompletableFuture().join();
            count++;
        }
    }
    // wait until health check is not ok
    await().until(() -> {
        HealthReport.HealthReportBuilder builder = HealthReport.builder();
        source.isAlive(builder);
        HealthReport r = builder.build();
        return !r.isOk();
    });
    // build the health check again and get the report message
    HealthReport.HealthReportBuilder builder = HealthReport.builder();
    source.isAlive(builder);
    String message = builder.build().getChannels().get(0).getMessage();
    assertThat(message).containsAnyOf("my-topic-0", "my-topic-1");
}
Also used : org.apache.kafka.clients.consumer(org.apache.kafka.clients.consumer) BeforeEach(org.junit.jupiter.api.BeforeEach) java.util(java.util) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) io.smallrye.reactive.messaging.kafka(io.smallrye.reactive.messaging.kafka) MapBasedConfig(io.smallrye.reactive.messaging.test.common.config.MapBasedConfig) StringDeserializer(org.apache.kafka.common.serialization.StringDeserializer) MockKafkaUtils.injectMockConsumer(io.smallrye.reactive.messaging.kafka.base.MockKafkaUtils.injectMockConsumer) TypeLiteral(javax.enterprise.util.TypeLiteral) Duration(java.time.Duration) WeldTestBase(io.smallrye.reactive.messaging.kafka.base.WeldTestBase) Instance(javax.enterprise.inject.Instance) TopicPartition(org.apache.kafka.common.TopicPartition) Awaitility.await(org.awaitility.Awaitility.await) Collectors(java.util.stream.Collectors) Test(org.junit.jupiter.api.Test) Message(org.eclipse.microprofile.reactive.messaging.Message) AfterEach(org.junit.jupiter.api.AfterEach) Vertx(io.vertx.mutiny.core.Vertx) ApplicationScoped(javax.enterprise.context.ApplicationScoped) KafkaSource(io.smallrye.reactive.messaging.kafka.impl.KafkaSource) IncomingKafkaRecordBatchMetadata(io.smallrye.reactive.messaging.kafka.api.IncomingKafkaRecordBatchMetadata) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) Identifier(io.smallrye.common.annotation.Identifier) Message(org.eclipse.microprofile.reactive.messaging.Message) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) TopicPartition(org.apache.kafka.common.TopicPartition) MapBasedConfig(io.smallrye.reactive.messaging.test.common.config.MapBasedConfig) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Test(org.junit.jupiter.api.Test)

Example 10 with Vertx

use of io.vertx.mutiny.core.Vertx in project smallrye-reactive-messaging by smallrye.

the class CommitStrategiesTest method testThrottledStrategyWithManyRecords.

@RepeatedTest(10)
void testThrottledStrategyWithManyRecords() {
    MapBasedConfig config = commonConfiguration().with("client.id", UUID.randomUUID().toString()).with("commit-strategy", "throttled").with("auto.offset.reset", "earliest").with("auto.commit.interval.ms", 100);
    String group = UUID.randomUUID().toString();
    source = new KafkaSource<>(vertx, group, new KafkaConnectorIncomingConfiguration(config), getConsumerRebalanceListeners(), CountKafkaCdiEvents.noCdiEvents, getDeserializationFailureHandlers(), -1);
    injectMockConsumer(source, consumer);
    List<Message<?>> list = new ArrayList<>();
    source.getStream().subscribe().with(list::add);
    TopicPartition p0 = new TopicPartition(TOPIC, 0);
    TopicPartition p1 = new TopicPartition(TOPIC, 1);
    Map<TopicPartition, Long> offsets = new HashMap<>();
    offsets.put(p0, 0L);
    offsets.put(p1, 5L);
    consumer.updateBeginningOffsets(offsets);
    consumer.schedulePollTask(() -> {
        consumer.rebalance(offsets.keySet());
        source.getCommitHandler().partitionsAssigned(offsets.keySet());
        for (int i = 0; i < 500; i++) {
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 0, i, "k", "v0-" + i));
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 1, i, "r", "v1-" + i));
        }
    });
    // Expected number of messages: 500 messages in each partition minus the [0..5) messages from p1
    int expected = 500 * 2 - 5;
    await().until(() -> list.size() == expected);
    assertThat(list).hasSize(expected);
    list.forEach(m -> m.ack().toCompletableFuture().join());
    await().untilAsserted(() -> {
        Map<TopicPartition, OffsetAndMetadata> committed = consumer.committed(offsets.keySet());
        assertThat(committed.get(p0)).isNotNull();
        assertThat(committed.get(p0).offset()).isEqualTo(500);
        assertThat(committed.get(p1)).isNotNull();
        assertThat(committed.get(p1).offset()).isEqualTo(500);
    });
    consumer.schedulePollTask(() -> {
        for (int i = 0; i < 1000; i++) {
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 0, 500 + i, "k", "v0-" + (500 + i)));
            consumer.addRecord(new ConsumerRecord<>(TOPIC, 1, 500 + i, "k", "v1-" + (500 + i)));
        }
    });
    int expected2 = expected + 1000 * 2;
    await().until(() -> list.size() == expected2);
    list.forEach(m -> m.ack().toCompletableFuture().join());
    await().atMost(Duration.ofMinutes(1)).untilAsserted(() -> {
        Map<TopicPartition, OffsetAndMetadata> committed = consumer.committed(offsets.keySet());
        assertThat(committed.get(p0)).isNotNull();
        assertThat(committed.get(p0).offset()).isEqualTo(1500);
        assertThat(committed.get(p1)).isNotNull();
        assertThat(committed.get(p1).offset()).isEqualTo(1500);
    });
    List<String> payloads = list.stream().map(m -> (String) m.getPayload()).collect(Collectors.toList());
    for (int i = 0; i < 1500; i++) {
        assertThat(payloads).contains("v0-" + i);
    }
    for (int i = 5; i < 1500; i++) {
        assertThat(payloads).contains("v1-" + i);
    }
}
Also used : AmbiguousResolutionException(javax.enterprise.inject.AmbiguousResolutionException) org.apache.kafka.clients.consumer(org.apache.kafka.clients.consumer) BeforeEach(org.junit.jupiter.api.BeforeEach) java.util(java.util) RepeatedTest(org.junit.jupiter.api.RepeatedTest) Assertions.assertThat(org.assertj.core.api.Assertions.assertThat) UnsatisfiedResolutionException(javax.enterprise.inject.UnsatisfiedResolutionException) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) io.smallrye.reactive.messaging.kafka(io.smallrye.reactive.messaging.kafka) AtomicReference(java.util.concurrent.atomic.AtomicReference) IncomingKafkaRecordMetadata(io.smallrye.reactive.messaging.kafka.api.IncomingKafkaRecordMetadata) MapBasedConfig(io.smallrye.reactive.messaging.test.common.config.MapBasedConfig) Assertions.assertThatThrownBy(org.assertj.core.api.Assertions.assertThatThrownBy) StringDeserializer(org.apache.kafka.common.serialization.StringDeserializer) MockKafkaUtils.injectMockConsumer(io.smallrye.reactive.messaging.kafka.base.MockKafkaUtils.injectMockConsumer) TypeLiteral(javax.enterprise.util.TypeLiteral) Duration(java.time.Duration) WeldTestBase(io.smallrye.reactive.messaging.kafka.base.WeldTestBase) Instance(javax.enterprise.inject.Instance) TopicPartition(org.apache.kafka.common.TopicPartition) Awaitility.await(org.awaitility.Awaitility.await) Collectors(java.util.stream.Collectors) Test(org.junit.jupiter.api.Test) Message(org.eclipse.microprofile.reactive.messaging.Message) AfterEach(org.junit.jupiter.api.AfterEach) Vertx(io.vertx.mutiny.core.Vertx) ApplicationScoped(javax.enterprise.context.ApplicationScoped) KafkaSource(io.smallrye.reactive.messaging.kafka.impl.KafkaSource) Identifier(io.smallrye.common.annotation.Identifier) Message(org.eclipse.microprofile.reactive.messaging.Message) TopicPartition(org.apache.kafka.common.TopicPartition) MapBasedConfig(io.smallrye.reactive.messaging.test.common.config.MapBasedConfig) RepeatedTest(org.junit.jupiter.api.RepeatedTest)

Aggregations

Vertx (io.vertx.mutiny.core.Vertx)14 Awaitility.await (org.awaitility.Awaitility.await)7 KafkaSource (io.smallrye.reactive.messaging.kafka.impl.KafkaSource)6 MapBasedConfig (io.smallrye.reactive.messaging.test.common.config.MapBasedConfig)6 Instance (javax.enterprise.inject.Instance)6 StringDeserializer (org.apache.kafka.common.serialization.StringDeserializer)6 Test (org.junit.jupiter.api.Test)6 MockKafkaUtils.injectMockConsumer (io.smallrye.reactive.messaging.kafka.base.MockKafkaUtils.injectMockConsumer)5 WeldTestBase (io.smallrye.reactive.messaging.kafka.base.WeldTestBase)5 Duration (java.time.Duration)5 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)5 TypeLiteral (javax.enterprise.util.TypeLiteral)5 TopicPartition (org.apache.kafka.common.TopicPartition)5 Message (org.eclipse.microprofile.reactive.messaging.Message)5 AfterEach (org.junit.jupiter.api.AfterEach)5 HealthReport (io.smallrye.reactive.messaging.health.HealthReport)4 io.smallrye.reactive.messaging.kafka (io.smallrye.reactive.messaging.kafka)4 java.util (java.util)4 HashMap (java.util.HashMap)4 Map (java.util.Map)4