Search in sources :

Example 36 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class RabbitMQConnector method getPublisherBuilder.

/**
 * Creates a <em>channel</em> for the given configuration. The channel's configuration is associated with a
 * specific {@code connector}, using the {@link Connector} qualifier's parameter indicating a key to
 * which {@link IncomingConnectorFactory} to use.
 *
 * <p>
 * Note that the connection to the <em>transport</em> or <em>broker</em> is generally postponed until the
 * subscription occurs.
 *
 * @param config the configuration, must not be {@code null}, must contain the {@link #CHANNEL_NAME_ATTRIBUTE}
 *        attribute.
 * @return the created {@link PublisherBuilder}, will not be {@code null}.
 * @throws IllegalArgumentException if the configuration is invalid.
 * @throws NoSuchElementException if the configuration does not contain an expected attribute.
 */
@Override
public PublisherBuilder<? extends Message<?>> getPublisherBuilder(final Config config) {
    final RabbitMQConnectorIncomingConfiguration ic = new RabbitMQConnectorIncomingConfiguration(config);
    incomingChannelStatus.put(ic.getChannel(), ChannelStatus.INITIALISING);
    // Create a client
    final RabbitMQClient client = RabbitMQClientHelper.createClient(this, ic, clientOptions, credentialsProviders);
    final ConnectionHolder holder = new ConnectionHolder(client, ic, getVertx());
    final RabbitMQFailureHandler onNack = createFailureHandler(ic);
    final RabbitMQAckHandler onAck = createAckHandler(ic);
    // Ensure we set the queue up
    Uni<RabbitMQClient> uniQueue = holder.getOrEstablishConnection().onItem().call(connection -> establishQueue(connection, ic)).onItem().call(connection -> establishDLQ(connection, ic)).onItem().invoke(connection -> incomingChannelStatus.put(ic.getChannel(), ChannelStatus.CONNECTED));
    // Once the queue is set up, set yp a consumer
    final Integer interval = ic.getReconnectInterval();
    final Integer attempts = ic.getReconnectAttempts();
    Multi<? extends Message<?>> multi = uniQueue.onItem().transformToUni(connection -> client.basicConsumer(ic.getQueueName(), new QueueOptions().setAutoAck(ic.getAutoAcknowledgement()).setMaxInternalQueueSize(ic.getMaxIncomingInternalQueueSize()).setKeepMostRecent(ic.getKeepMostRecent()))).onItem().transformToMulti(consumer -> getStreamOfMessages(consumer, holder, ic, onNack, onAck)).plug(m -> {
        if (attempts > 0) {
            return m.onFailure().invoke(log::retrieveMessagesRetrying).onFailure().retry().withBackOff(ofSeconds(1), ofSeconds(interval)).atMost(attempts).onFailure().invoke(t -> {
                incomingChannelStatus.put(ic.getChannel(), ChannelStatus.NOT_CONNECTED);
                log.retrieveMessagesNoMoreRetrying(t);
            });
        }
        return m;
    });
    if (Boolean.TRUE.equals(ic.getBroadcast())) {
        multi = multi.broadcast().toAllSubscribers();
    }
    return ReactiveStreams.fromPublisher(multi);
}
Also used : Arrays(java.util.Arrays) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) RabbitMQConsumer(io.vertx.mutiny.rabbitmq.RabbitMQConsumer) INCOMING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING) INCOMING_AND_OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING_AND_OUTGOING) Reception(javax.enterprise.event.Reception) Map(java.util.Map) Observes(javax.enterprise.event.Observes) Connector(org.eclipse.microprofile.reactive.messaging.spi.Connector) JsonObject(io.vertx.core.json.JsonObject) Any(javax.enterprise.inject.Any) Instance(javax.enterprise.inject.Instance) ExecutionHolder(io.smallrye.reactive.messaging.providers.connectors.ExecutionHolder) RabbitMQAutoAck(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAutoAck) ConnectorAttribute(io.smallrye.reactive.messaging.annotations.ConnectorAttribute) RabbitMQExceptions.ex(io.smallrye.reactive.messaging.rabbitmq.i18n.RabbitMQExceptions.ex) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RabbitMQPublisher(io.vertx.mutiny.rabbitmq.RabbitMQPublisher) SubscriberBuilder(org.eclipse.microprofile.reactive.streams.operators.SubscriberBuilder) Config(org.eclipse.microprofile.config.Config) Collectors(java.util.stream.Collectors) Priority(javax.annotation.Priority) List(java.util.List) CredentialsProvider(com.rabbitmq.client.impl.CredentialsProvider) PostConstruct(javax.annotation.PostConstruct) ApplicationScoped(javax.enterprise.context.ApplicationScoped) PublisherBuilder(org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) OutgoingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.OutgoingConnectorFactory) RabbitMQReject(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQReject) BroadcastProcessor(io.smallrye.mutiny.operators.multi.processors.BroadcastProcessor) RabbitMQLogging.log(io.smallrye.reactive.messaging.rabbitmq.i18n.RabbitMQLogging.log) RabbitMQClient(io.vertx.mutiny.rabbitmq.RabbitMQClient) Duration.ofSeconds(java.time.Duration.ofSeconds) HealthReporter(io.smallrye.reactive.messaging.health.HealthReporter) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) Inject(javax.inject.Inject) RabbitMQAck(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAck) BeforeDestroyed(javax.enterprise.context.BeforeDestroyed) TracingUtils(io.smallrye.reactive.messaging.rabbitmq.tracing.TracingUtils) OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.OUTGOING) RabbitMQAccept(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQAccept) QueueOptions(io.vertx.rabbitmq.QueueOptions) RabbitMQPublisherOptions(io.vertx.rabbitmq.RabbitMQPublisherOptions) NoSuchElementException(java.util.NoSuchElementException) IncomingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.IncomingConnectorFactory) ReactiveStreams(org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams) RabbitMQOptions(io.vertx.rabbitmq.RabbitMQOptions) RabbitMQAckHandler(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAckHandler) Message(org.eclipse.microprofile.reactive.messaging.Message) RabbitMQFailStop(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQFailStop) Subscription(org.reactivestreams.Subscription) Vertx(io.vertx.mutiny.core.Vertx) RabbitMQFailureHandler(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQFailureHandler) RabbitMQAckHandler(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAckHandler) RabbitMQClient(io.vertx.mutiny.rabbitmq.RabbitMQClient) RabbitMQFailureHandler(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQFailureHandler) RabbitMQLogging.log(io.smallrye.reactive.messaging.rabbitmq.i18n.RabbitMQLogging.log) QueueOptions(io.vertx.rabbitmq.QueueOptions)

Example 37 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class RabbitMQConnector method establishQueue.

/**
 * Uses a {@link RabbitMQClient} to ensure the required queue-exchange bindings are created.
 *
 * @param client the RabbitMQ client
 * @param ic the incoming channel configuration
 * @return a {@link Uni<String>} which yields the queue name
 */
private Uni<String> establishQueue(final RabbitMQClient client, final RabbitMQConnectorIncomingConfiguration ic) {
    final String queueName = ic.getQueueName();
    // Declare the queue (and its binding(s) to the exchange, and TTL) if we have been asked to do so
    final JsonObject queueArgs = new JsonObject();
    queueArgs.put("x-dead-letter-exchange", ic.getDeadLetterExchange());
    queueArgs.put("x-dead-letter-routing-key", ic.getDeadLetterRoutingKey().orElse(queueName));
    ic.getQueueSingleActiveConsumer().ifPresent(sac -> queueArgs.put("x-single-active-consumer", sac));
    ic.getQueueTtl().ifPresent(queueTtl -> {
        if (queueTtl >= 0) {
            queueArgs.put("x-message-ttl", queueTtl);
        } else {
            throw ex.illegalArgumentInvalidQueueTtl();
        }
    });
    return establishExchange(client, ic).onItem().transform(v -> Boolean.TRUE.equals(ic.getQueueDeclare()) ? null : queueName).onItem().ifNull().switchTo(() -> client.queueDeclare(queueName, ic.getQueueDurable(), ic.getQueueExclusive(), ic.getQueueAutoDelete(), queueArgs).onItem().invoke(() -> log.queueEstablished(queueName)).onFailure().invoke(ex -> log.unableToEstablishQueue(queueName, ex)).onItem().transformToMulti(v -> establishBindings(client, ic)).onCompletion().invoke(() -> Multi.createFrom().item("ignore")).onItem().ignoreAsUni().onItem().transform(v -> queueName));
}
Also used : Arrays(java.util.Arrays) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) RabbitMQConsumer(io.vertx.mutiny.rabbitmq.RabbitMQConsumer) INCOMING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING) INCOMING_AND_OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING_AND_OUTGOING) Reception(javax.enterprise.event.Reception) Map(java.util.Map) Observes(javax.enterprise.event.Observes) Connector(org.eclipse.microprofile.reactive.messaging.spi.Connector) JsonObject(io.vertx.core.json.JsonObject) Any(javax.enterprise.inject.Any) Instance(javax.enterprise.inject.Instance) ExecutionHolder(io.smallrye.reactive.messaging.providers.connectors.ExecutionHolder) RabbitMQAutoAck(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAutoAck) ConnectorAttribute(io.smallrye.reactive.messaging.annotations.ConnectorAttribute) RabbitMQExceptions.ex(io.smallrye.reactive.messaging.rabbitmq.i18n.RabbitMQExceptions.ex) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) RabbitMQPublisher(io.vertx.mutiny.rabbitmq.RabbitMQPublisher) SubscriberBuilder(org.eclipse.microprofile.reactive.streams.operators.SubscriberBuilder) Config(org.eclipse.microprofile.config.Config) Collectors(java.util.stream.Collectors) Priority(javax.annotation.Priority) List(java.util.List) CredentialsProvider(com.rabbitmq.client.impl.CredentialsProvider) PostConstruct(javax.annotation.PostConstruct) ApplicationScoped(javax.enterprise.context.ApplicationScoped) PublisherBuilder(org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) OutgoingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.OutgoingConnectorFactory) RabbitMQReject(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQReject) BroadcastProcessor(io.smallrye.mutiny.operators.multi.processors.BroadcastProcessor) RabbitMQLogging.log(io.smallrye.reactive.messaging.rabbitmq.i18n.RabbitMQLogging.log) RabbitMQClient(io.vertx.mutiny.rabbitmq.RabbitMQClient) Duration.ofSeconds(java.time.Duration.ofSeconds) HealthReporter(io.smallrye.reactive.messaging.health.HealthReporter) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) Inject(javax.inject.Inject) RabbitMQAck(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAck) BeforeDestroyed(javax.enterprise.context.BeforeDestroyed) TracingUtils(io.smallrye.reactive.messaging.rabbitmq.tracing.TracingUtils) OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.OUTGOING) RabbitMQAccept(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQAccept) QueueOptions(io.vertx.rabbitmq.QueueOptions) RabbitMQPublisherOptions(io.vertx.rabbitmq.RabbitMQPublisherOptions) NoSuchElementException(java.util.NoSuchElementException) IncomingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.IncomingConnectorFactory) ReactiveStreams(org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams) RabbitMQOptions(io.vertx.rabbitmq.RabbitMQOptions) RabbitMQAckHandler(io.smallrye.reactive.messaging.rabbitmq.ack.RabbitMQAckHandler) Message(org.eclipse.microprofile.reactive.messaging.Message) RabbitMQFailStop(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQFailStop) Subscription(org.reactivestreams.Subscription) Vertx(io.vertx.mutiny.core.Vertx) RabbitMQFailureHandler(io.smallrye.reactive.messaging.rabbitmq.fault.RabbitMQFailureHandler) JsonObject(io.vertx.core.json.JsonObject)

Example 38 with Uni

use of io.smallrye.mutiny.Uni in project openk9 by smclab.

the class DatasourceProcessor method process.

@Incoming("ingestion")
@Outgoing("ingestion-datasource")
public Uni<IngestionDatasourcePayload> process(Object obj) {
    JsonObject jsonObject = obj instanceof JsonObject ? (JsonObject) obj : new JsonObject(new String((byte[]) obj));
    long datasourceId = jsonObject.getLong("datasourceId");
    Uni<Datasource> datasourceUni = Datasource.findById(datasourceId);
    return Panache.withTransaction(() -> datasourceUni.flatMap(datasource -> EnrichPipeline.findByDatasourceId(datasource.getDatasourceId()).onItem().ifNull().continueWith(EnrichPipeline::new).flatMap(enrichPipeline -> {
        Uni<List<EnrichItem>> enrichItemUni;
        if (enrichPipeline.getEnrichPipelineId() != null) {
            enrichItemUni = EnrichItem.findByEnrichPipelineId(enrichPipeline.getEnrichPipelineId()).onItem().ifNull().continueWith(List::of);
        } else {
            enrichItemUni = Uni.createFrom().item(List.of());
        }
        return Uni.combine().all().unis(Tenant.findById(datasource.getTenantId()), enrichItemUni).combinedWith((tenantObj, enrichItemList) -> {
            Tenant tenant = (Tenant) tenantObj;
            IngestionPayload ingestionPayload = jsonObject.mapTo(IngestionPayload.class);
            ingestionPayload.setTenantId(tenant.getTenantId());
            DatasourceContext datasourceContext = DatasourceContext.of(datasource, tenant, enrichPipeline, enrichItemList);
            return IngestionDatasourcePayload.of(ingestionPayload, datasourceContext);
        });
    })).eventually(() -> Datasource.<Datasource>findById(datasourceId).flatMap(datasource -> {
        datasource.setLastIngestionDate(Instant.ofEpochMilli(jsonObject.getLong("parsingDate")));
        return datasource.persist();
    })));
}
Also used : Datasource(io.openk9.datasource.model.Datasource) Outgoing(org.eclipse.microprofile.reactive.messaging.Outgoing) Datasource(io.openk9.datasource.model.Datasource) EnrichItem(io.openk9.datasource.model.EnrichItem) Tenant(io.openk9.datasource.model.Tenant) Instant(java.time.Instant) Uni(io.smallrye.mutiny.Uni) DatasourceContext(io.openk9.datasource.processor.payload.DatasourceContext) List(java.util.List) IngestionDatasourcePayload(io.openk9.datasource.processor.payload.IngestionDatasourcePayload) IngestionPayload(io.openk9.datasource.processor.payload.IngestionPayload) EnrichPipeline(io.openk9.datasource.model.EnrichPipeline) JsonObject(io.vertx.core.json.JsonObject) ApplicationScoped(javax.enterprise.context.ApplicationScoped) Panache(io.quarkus.hibernate.reactive.panache.Panache) Incoming(org.eclipse.microprofile.reactive.messaging.Incoming) JsonObject(io.vertx.core.json.JsonObject) EnrichItem(io.openk9.datasource.model.EnrichItem) Uni(io.smallrye.mutiny.Uni) Tenant(io.openk9.datasource.model.Tenant) IngestionPayload(io.openk9.datasource.processor.payload.IngestionPayload) DatasourceContext(io.openk9.datasource.processor.payload.DatasourceContext) EnrichPipeline(io.openk9.datasource.model.EnrichPipeline) List(java.util.List) Incoming(org.eclipse.microprofile.reactive.messaging.Incoming) Outgoing(org.eclipse.microprofile.reactive.messaging.Outgoing)

Example 39 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class AmqpConnector method getSubscriberBuilder.

@Override
public SubscriberBuilder<? extends Message<?>, Void> getSubscriberBuilder(Config config) {
    AmqpConnectorOutgoingConfiguration oc = new AmqpConnectorOutgoingConfiguration(config);
    String configuredAddress = oc.getAddress().orElseGet(oc::getChannel);
    opened.put(oc.getChannel(), false);
    AtomicReference<AmqpSender> sender = new AtomicReference<>();
    AmqpClient client = AmqpClientHelper.createClient(this, oc, clientOptions);
    String link = oc.getLinkName().orElseGet(oc::getChannel);
    ConnectionHolder holder = new ConnectionHolder(client, oc, getVertx());
    Uni<AmqpSender> getSender = Uni.createFrom().deferred(() -> {
        // If we already have a sender, use it.
        AmqpSender current = sender.get();
        if (current != null && !current.connection().isDisconnected()) {
            if (isLinkOpen(current)) {
                return Uni.createFrom().item(current);
            } else {
                // link closed, close the sender, and recreate one.
                current.closeAndForget();
            }
        }
        return holder.getOrEstablishConnection().onItem().transformToUni(connection -> {
            boolean anonymous = oc.getUseAnonymousSender().orElseGet(() -> ConnectionHolder.supportAnonymousRelay(connection));
            if (anonymous) {
                return connection.createAnonymousSender();
            } else {
                return connection.createSender(configuredAddress, new AmqpSenderOptions().setLinkName(link).setCapabilities(getClientCapabilities(oc)));
            }
        }).onItem().invoke(s -> {
            AmqpSender orig = sender.getAndSet(s);
            if (orig != null) {
                // Close the previous one if any.
                orig.closeAndForget();
            }
            opened.put(oc.getChannel(), true);
        });
    }).onFailure().invoke(t -> {
        sender.set(null);
        opened.put(oc.getChannel(), false);
    }).onCancellation().invoke(() -> {
        sender.set(null);
        opened.put(oc.getChannel(), false);
    });
    AmqpCreditBasedSender processor = new AmqpCreditBasedSender(this, holder, oc, getSender);
    processors.put(oc.getChannel(), processor);
    return ReactiveStreams.<Message<?>>builder().via(processor).onError(t -> {
        log.failureReported(oc.getChannel(), t);
        opened.put(oc.getChannel(), false);
    }).ignore();
}
Also used : AMQPLogging.log(io.smallrye.reactive.messaging.amqp.i18n.AMQPLogging.log) Arrays(java.util.Arrays) AmqpModifiedFailedAndUndeliverableHere(io.smallrye.reactive.messaging.amqp.fault.AmqpModifiedFailedAndUndeliverableHere) SemanticAttributes(io.opentelemetry.semconv.trace.attributes.SemanticAttributes) HealthReport(io.smallrye.reactive.messaging.health.HealthReport) INCOMING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING) INCOMING_AND_OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.INCOMING_AND_OUTGOING) Reception(javax.enterprise.event.Reception) AmqpFailStop(io.smallrye.reactive.messaging.amqp.fault.AmqpFailStop) Duration(java.time.Duration) Map(java.util.Map) Observes(javax.enterprise.event.Observes) Connector(org.eclipse.microprofile.reactive.messaging.spi.Connector) SpanBuilder(io.opentelemetry.api.trace.SpanBuilder) Any(javax.enterprise.inject.Any) Instance(javax.enterprise.inject.Instance) AmqpFailureHandler(io.smallrye.reactive.messaging.amqp.fault.AmqpFailureHandler) Context(io.opentelemetry.context.Context) ExecutionHolder(io.smallrye.reactive.messaging.providers.connectors.ExecutionHolder) ConnectorAttribute(io.smallrye.reactive.messaging.annotations.ConnectorAttribute) Span(io.opentelemetry.api.trace.Span) AmqpAccept(io.smallrye.reactive.messaging.amqp.fault.AmqpAccept) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) SubscriberBuilder(org.eclipse.microprofile.reactive.streams.operators.SubscriberBuilder) Config(org.eclipse.microprofile.config.Config) Collectors(java.util.stream.Collectors) SpanKind(io.opentelemetry.api.trace.SpanKind) AmqpClient(io.vertx.mutiny.amqp.AmqpClient) Priority(javax.annotation.Priority) List(java.util.List) AmqpSenderOptions(io.vertx.amqp.AmqpSenderOptions) PostConstruct(javax.annotation.PostConstruct) ProtonSender(io.vertx.proton.ProtonSender) ApplicationScoped(javax.enterprise.context.ApplicationScoped) PublisherBuilder(org.eclipse.microprofile.reactive.streams.operators.PublisherBuilder) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList) OutgoingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.OutgoingConnectorFactory) BroadcastProcessor(io.smallrye.mutiny.operators.multi.processors.BroadcastProcessor) AmqpReceiverOptions(io.vertx.amqp.AmqpReceiverOptions) AmqpModifiedFailed(io.smallrye.reactive.messaging.amqp.fault.AmqpModifiedFailed) Duration.ofSeconds(java.time.Duration.ofSeconds) Tracer(io.opentelemetry.api.trace.Tracer) AtomicReference(java.util.concurrent.atomic.AtomicReference) HealthReporter(io.smallrye.reactive.messaging.health.HealthReporter) Multi(io.smallrye.mutiny.Multi) Uni(io.smallrye.mutiny.Uni) Inject(javax.inject.Inject) AmqpClientOptions(io.vertx.amqp.AmqpClientOptions) BeforeDestroyed(javax.enterprise.context.BeforeDestroyed) OUTGOING(io.smallrye.reactive.messaging.annotations.ConnectorAttribute.Direction.OUTGOING) IncomingConnectorFactory(org.eclipse.microprofile.reactive.messaging.spi.IncomingConnectorFactory) ReactiveStreams(org.eclipse.microprofile.reactive.streams.operators.ReactiveStreams) AMQPExceptions.ex(io.smallrye.reactive.messaging.amqp.i18n.AMQPExceptions.ex) TracingMetadata(io.smallrye.reactive.messaging.TracingMetadata) AmqpReceiver(io.vertx.mutiny.amqp.AmqpReceiver) GlobalOpenTelemetry(io.opentelemetry.api.GlobalOpenTelemetry) AmqpRelease(io.smallrye.reactive.messaging.amqp.fault.AmqpRelease) AmqpReject(io.smallrye.reactive.messaging.amqp.fault.AmqpReject) Message(org.eclipse.microprofile.reactive.messaging.Message) AmqpSender(io.vertx.mutiny.amqp.AmqpSender) Vertx(io.vertx.mutiny.core.Vertx) Collections(java.util.Collections) AmqpClient(io.vertx.mutiny.amqp.AmqpClient) AtomicReference(java.util.concurrent.atomic.AtomicReference) AmqpSender(io.vertx.mutiny.amqp.AmqpSender) AmqpSenderOptions(io.vertx.amqp.AmqpSenderOptions)

Example 40 with Uni

use of io.smallrye.mutiny.Uni in project smallrye-reactive-messaging by smallrye.

the class KafkaThrottledLatestProcessedCommit method received.

/**
 * Received a new record from Kafka.
 * This method is called from a Vert.x event loop.
 *
 * @param record the record
 * @param <K> the key
 * @param <V> the value
 * @return the record emitted once everything has been done
 */
@Override
public <K, V> Uni<IncomingKafkaRecord<K, V>> received(IncomingKafkaRecord<K, V> record) {
    TopicPartition recordsTopicPartition = getTopicPartition(record);
    OffsetStore offsetStore = offsetStores.get(recordsTopicPartition);
    Uni<OffsetStore> uni;
    if (offsetStore == null) {
        uni = consumer.committed(recordsTopicPartition).emitOn(// Switch back to event loop
        runnable -> context.runOnContext(x -> runnable.run())).onItem().transform(offsets -> {
            OffsetAndMetadata lastCommitted = offsets.get(recordsTopicPartition);
            OffsetStore store = new OffsetStore(recordsTopicPartition, unprocessedRecordMaxAge, lastCommitted == null ? -1 : lastCommitted.offset() - 1);
            offsetStores.put(recordsTopicPartition, store);
            return store;
        });
    } else {
        uni = Uni.createFrom().item(offsetStore);
    }
    return uni.onItem().invoke(store -> {
        store.received(record.getOffset());
        if (timerId < 0) {
            startFlushAndCheckHealthTimer();
        }
    }).onItem().transform(x -> record);
}
Also used : TopicPartition(org.apache.kafka.common.TopicPartition) java.util(java.util) Tuple2(io.smallrye.mutiny.tuples.Tuple2) java.util.concurrent(java.util.concurrent) NoStackTraceThrowable(io.vertx.core.impl.NoStackTraceThrowable) ReactiveKafkaConsumer(io.smallrye.reactive.messaging.kafka.impl.ReactiveKafkaConsumer) ConsumerConfig(org.apache.kafka.clients.consumer.ConsumerConfig) Uni(io.smallrye.mutiny.Uni) AtomicLong(java.util.concurrent.atomic.AtomicLong) Vertx(io.vertx.mutiny.core.Vertx) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata) KafkaConnectorIncomingConfiguration(io.smallrye.reactive.messaging.kafka.KafkaConnectorIncomingConfiguration) KafkaSource(io.smallrye.reactive.messaging.kafka.impl.KafkaSource) KafkaLogging.log(io.smallrye.reactive.messaging.kafka.i18n.KafkaLogging.log) IncomingKafkaRecord(io.smallrye.reactive.messaging.kafka.IncomingKafkaRecord) TopicPartition(org.apache.kafka.common.TopicPartition) OffsetAndMetadata(org.apache.kafka.clients.consumer.OffsetAndMetadata)

Aggregations

Uni (io.smallrye.mutiny.Uni)44 Multi (io.smallrye.mutiny.Multi)21 Test (org.junit.jupiter.api.Test)18 List (java.util.List)17 Assertions.assertThat (org.assertj.core.api.Assertions.assertThat)17 Duration (java.time.Duration)16 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)14 IOException (java.io.IOException)13 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)13 AtomicReference (java.util.concurrent.atomic.AtomicReference)13 Assertions.assertThrows (org.junit.jupiter.api.Assertions.assertThrows)13 AssertSubscriber (io.smallrye.mutiny.helpers.test.AssertSubscriber)12 Function (java.util.function.Function)12 Supplier (java.util.function.Supplier)12 Map (java.util.Map)11 Consumer (java.util.function.Consumer)10 CompositeException (io.smallrye.mutiny.CompositeException)9 ArrayList (java.util.ArrayList)9 ApplicationScoped (javax.enterprise.context.ApplicationScoped)8 CompletableFuture (java.util.concurrent.CompletableFuture)7