Search in sources :

Example 1 with RecordMetadata

use of io.vertx.kafka.client.producer.RecordMetadata in project hono by eclipse.

the class AbstractKafkaBasedMessageSender method sendAndWaitForOutcome.

/**
 * Sends a message to a Kafka broker and waits for the outcome.
 *
 * @param topic The topic to send the message to.
 * @param tenantId The tenant that the device belongs to.
 * @param deviceId The device identifier.
 * @param payload The data to send or {@code null} if the message has no payload.
 * @param headers Additional meta data that should be included in the message.
 * @param currentSpan The <em>OpenTracing</em> span used to use for tracking the sending of the message.
 *             The span will <em>not</em> be finished by this method.
 * @return A future indicating the outcome of the operation.
 *         <p>
 *         The future will be succeeded if the message has been sent.
 *         <p>
 *         The future will be failed with a {@link org.eclipse.hono.client.ServerErrorException} if the data could
 *         not be sent. The error code contained in the exception indicates the cause of the failure.
 * @throws NullPointerException if topic, tenantId, deviceId, headers or span are {@code null}.
 */
protected final Future<Void> sendAndWaitForOutcome(final String topic, final String tenantId, final String deviceId, final Buffer payload, final List<KafkaHeader> headers, final Span currentSpan) {
    Objects.requireNonNull(topic);
    Objects.requireNonNull(tenantId);
    Objects.requireNonNull(deviceId);
    Objects.requireNonNull(headers);
    Objects.requireNonNull(currentSpan);
    if (stopped) {
        return Future.failedFuture(new ServerErrorException(HttpURLConnection.HTTP_UNAVAILABLE, "sender already stopped"));
    }
    final KafkaProducerRecord<String, Buffer> record = KafkaProducerRecord.create(topic, deviceId, payload);
    log.trace("sending message to Kafka [topic: {}, tenantId: {}, deviceId: {}]", topic, tenantId, deviceId);
    record.addHeaders(headers);
    KafkaTracingHelper.injectSpanContext(tracer, record, currentSpan.context());
    logProducerRecord(currentSpan, record);
    return getOrCreateProducer().send(record).onSuccess(recordMetadata -> logRecordMetadata(currentSpan, deviceId, recordMetadata)).otherwise(t -> {
        logError(currentSpan, topic, tenantId, deviceId, t);
        throw new ServerErrorException(tenantId, getErrorCode(t), t);
    }).mapEmpty();
}
Also used : Buffer(io.vertx.core.buffer.Buffer) HttpURLConnection(java.net.HttpURLConnection) Json(io.vertx.core.json.Json) RecordMetadata(io.vertx.kafka.client.producer.RecordMetadata) Lifecycle(org.eclipse.hono.util.Lifecycle) LoggerFactory(org.slf4j.LoggerFactory) KafkaClientFactory(org.eclipse.hono.client.kafka.KafkaClientFactory) Tags(io.opentracing.tag.Tags) KafkaProducer(io.vertx.kafka.client.producer.KafkaProducer) ArrayList(java.util.ArrayList) Status(io.vertx.ext.healthchecks.Status) MessagingType(org.eclipse.hono.util.MessagingType) HealthCheckHandler(io.vertx.ext.healthchecks.HealthCheckHandler) References(io.opentracing.References) Map(java.util.Map) TracingHelper(org.eclipse.hono.tracing.TracingHelper) MessagingClient(org.eclipse.hono.util.MessagingClient) Strings(org.eclipse.hono.util.Strings) KafkaTracingHelper(org.eclipse.hono.client.kafka.tracing.KafkaTracingHelper) Logger(org.slf4j.Logger) Tracer(io.opentracing.Tracer) ServerErrorException(org.eclipse.hono.client.ServerErrorException) UUID(java.util.UUID) KafkaRecordHelper(org.eclipse.hono.client.kafka.KafkaRecordHelper) Instant(java.time.Instant) MessageHelper(org.eclipse.hono.util.MessageHelper) Collectors(java.util.stream.Collectors) Future(io.vertx.core.Future) SpanContext(io.opentracing.SpanContext) Objects(java.util.Objects) List(java.util.List) ServiceClient(org.eclipse.hono.client.util.ServiceClient) Buffer(io.vertx.core.buffer.Buffer) EncodeException(io.vertx.core.json.EncodeException) Span(io.opentracing.Span) KafkaHeader(io.vertx.kafka.client.producer.KafkaHeader) KafkaProducerRecord(io.vertx.kafka.client.producer.KafkaProducerRecord) ServerErrorException(org.eclipse.hono.client.ServerErrorException)

Example 2 with RecordMetadata

use of io.vertx.kafka.client.producer.RecordMetadata in project hono by eclipse.

the class KafkaClientUnitTestHelper method newKafkaProducer.

/**
 * Returns a new {@link KafkaProducer}.
 *
 * @param producer The mock producer to wrap.
 * @param <K> The type of the key.
 * @param <V> The type of the value.
 * @return The new Kafka producer.
 */
public static <K, V> KafkaProducer<K, V> newKafkaProducer(final MockProducer<K, V> producer) {
    final VertxInternal vertxMock = mock(VertxInternal.class);
    final ContextInternal context = VertxMockSupport.mockContextInternal(vertxMock);
    doAnswer(invocation -> Promise.promise()).when(context).promise();
    doAnswer(invocation -> {
        final Promise<RecordMetadata> result = Promise.promise();
        final Handler<Promise<RecordMetadata>> handler = invocation.getArgument(0);
        handler.handle(result);
        return result.future();
    }).when(context).executeBlocking(VertxMockSupport.anyHandler());
    VertxMockSupport.executeBlockingCodeImmediately(vertxMock, context);
    return KafkaProducer.create(vertxMock, producer);
}
Also used : RecordMetadata(io.vertx.kafka.client.producer.RecordMetadata) Promise(io.vertx.core.Promise) VertxInternal(io.vertx.core.impl.VertxInternal) ContextInternal(io.vertx.core.impl.ContextInternal)

Aggregations

RecordMetadata (io.vertx.kafka.client.producer.RecordMetadata)2 References (io.opentracing.References)1 Span (io.opentracing.Span)1 SpanContext (io.opentracing.SpanContext)1 Tracer (io.opentracing.Tracer)1 Tags (io.opentracing.tag.Tags)1 Future (io.vertx.core.Future)1 Promise (io.vertx.core.Promise)1 Buffer (io.vertx.core.buffer.Buffer)1 ContextInternal (io.vertx.core.impl.ContextInternal)1 VertxInternal (io.vertx.core.impl.VertxInternal)1 EncodeException (io.vertx.core.json.EncodeException)1 Json (io.vertx.core.json.Json)1 HealthCheckHandler (io.vertx.ext.healthchecks.HealthCheckHandler)1 Status (io.vertx.ext.healthchecks.Status)1 KafkaHeader (io.vertx.kafka.client.producer.KafkaHeader)1 KafkaProducer (io.vertx.kafka.client.producer.KafkaProducer)1 KafkaProducerRecord (io.vertx.kafka.client.producer.KafkaProducerRecord)1 HttpURLConnection (java.net.HttpURLConnection)1 Instant (java.time.Instant)1