From 1c867769b1a1c8b5900c857b2b4dacc0771a4dd7 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 28 Apr 2021 16:10:06 +0800 Subject: [PATCH 01/34] [BUG] Track 2 SB API (Batch Send Messages) doesn't seem to work. Messages are being sent at a slow pace. #16127 202104281534 --- .../servicebus/ServiceBusMessageBatch.java | 16 +- .../ServiceBusSenderAsyncClient.java | 218 +++++++----------- 2 files changed, 95 insertions(+), 139 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index a3ddce1cb739..c7b057983cb5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -15,6 +15,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; +import java.util.concurrent.atomic.AtomicInteger; import static com.azure.messaging.servicebus.implementation.MessageUtils.traceMessageSpan; @@ -30,7 +31,7 @@ public final class ServiceBusMessageBatch { private final MessageSerializer serializer; private final List serviceBusMessageList; private final byte[] eventBytes; - private int sizeInBytes; + private AtomicInteger sizeInBytes; private final TracerProvider tracerProvider; private final String entityPath; private final String hostname; @@ -41,7 +42,7 @@ public final class ServiceBusMessageBatch { this.contextProvider = contextProvider; this.serializer = serializer; this.serviceBusMessageList = new LinkedList<>(); - this.sizeInBytes = (maxMessageSize / 65536) * 1024; // reserve 1KB for every 64KB + this.sizeInBytes = new AtomicInteger((maxMessageSize / 65536) * 1024); // reserve 1KB for every 64KB this.eventBytes = new byte[maxMessageSize]; this.tracerProvider = tracerProvider; this.entityPath = entityPath; @@ -72,7 +73,7 @@ public int getMaxSizeInBytes() { * @return The size of the {@link ServiceBusMessageBatch batch} in bytes. */ public int getSizeInBytes() { - return this.sizeInBytes; + return this.sizeInBytes.get(); } /** @@ -109,12 +110,9 @@ public boolean tryAddMessage(final ServiceBusMessage serviceBusMessage) { throw logger.logExceptionAsWarning(ex); } - synchronized (lock) { - if (this.sizeInBytes + size > this.maxMessageSize) { - return false; - } - - this.sizeInBytes += size; + if (this.sizeInBytes.addAndGet(size) > this.maxMessageSize) { + this.sizeInBytes.addAndGet(-1 * size); + return false; } this.serviceBusMessageList.add(serviceBusMessageUpdated); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index fd058abf6ba3..70c900fc0f65 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -27,14 +27,7 @@ import reactor.core.publisher.Mono; import java.time.OffsetDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; @@ -42,15 +35,13 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; +import java.util.stream.StreamSupport; import static com.azure.core.amqp.implementation.RetryUtil.getRetryPolicy; import static com.azure.core.amqp.implementation.RetryUtil.withRetry; import static com.azure.core.util.FluxUtil.fluxError; import static com.azure.core.util.FluxUtil.monoError; -import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; -import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY; -import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; -import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; +import static com.azure.core.util.tracing.Tracer.*; import static com.azure.messaging.servicebus.implementation.Messages.INVALID_OPERATION_DISPOSED_SENDER; import static com.azure.messaging.servicebus.implementation.ServiceBusConstants.AZ_TRACING_SERVICE_NAME; @@ -68,7 +59,6 @@ * *

Send messages using a size-limited {@link ServiceBusMessageBatch} to a Service Bus resource

* {@codesnippet com.azure.messaging.servicebus.servicebusasyncsenderclient.createMessageBatch#CreateMessageBatchOptionsLimitedSize} - * */ @ServiceClient(builder = ServiceBusClientBuilder.class, isAsync = true) public final class ServiceBusSenderAsyncClient implements AutoCloseable { @@ -81,7 +71,7 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { // for more information on Azure resource provider namespaces. private static final String AZ_TRACING_NAMESPACE_VALUE = "Microsoft.ServiceBus"; - private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); + private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); private static final String SERVICE_BASE_NAME = "ServiceBus."; private final ClientLogger logger = new ClientLogger(ServiceBusSenderAsyncClient.class); @@ -101,8 +91,8 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { * Creates a new instance of this {@link ServiceBusSenderAsyncClient} that sends messages to a Service Bus entity. */ ServiceBusSenderAsyncClient(String entityName, MessagingEntityType entityType, - ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { + ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, + MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { // Caching the created link so we don't invoke another link creation. this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); @@ -139,13 +129,11 @@ public String getEntityPath() { * Sends a message to a Service Bus queue or topic. * * @param message Message to be sent to Service Bus queue or topic. - * * @return The {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code message} is {@code null}. + * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { if (Objects.isNull(message)) { @@ -157,16 +145,14 @@ public Mono sendMessage(ServiceBusMessage message) { /** * Sends a message to a Service Bus queue or topic. * - * @param message Message to be sent to Service Bus queue or topic. + * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return The {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code message}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * @throws NullPointerException if {@code message}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { @@ -184,19 +170,17 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * exceed the maximum size of a single batch, an exception will be triggered and the send will fail. * By default, the message size is the max amount allowed on the link. * - * @param messages Messages to be sent to Service Bus queue or topic. + * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessages(Iterable messages, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -213,12 +197,10 @@ public Mono sendMessages(Iterable messages, * message size is the max amount allowed on the link. * * @param messages Messages to be sent to Service Bus queue or topic. - * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * - * @throws NullPointerException if {@code messages} is {@code null}. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws NullPointerException if {@code messages} is {@code null}. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(Iterable messages) { @@ -229,11 +211,9 @@ public Mono sendMessages(Iterable messages) { * Sends a message batch to the Azure Service Bus entity this sender is connected to. * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. - * * @return A {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code batch} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws NullPointerException if {@code batch} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch) { @@ -243,14 +223,12 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return A {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -268,7 +246,7 @@ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransacti * Creates a {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. * * @return A {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. - * @throws ServiceBusException if the message batch could not be created. + * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. */ public Mono createMessageBatch() { @@ -279,13 +257,12 @@ public Mono createMessageBatch() { * Creates an {@link ServiceBusMessageBatch} configured with the options specified. * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. - * * @return A new {@link ServiceBusMessageBatch} configured with the given options. - * @throws NullPointerException if {@code options} is null. - * @throws ServiceBusException if the message batch could not be created. - * @throws IllegalStateException if sender is already disposed. + * @throws NullPointerException if {@code options} is null. + * @throws ServiceBusException if the message batch could not be created. + * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than - * maximum allowed size. + * maximum allowed size. */ public Mono createMessageBatch(CreateMessageBatchOptions options) { if (isDisposed.get()) { @@ -323,19 +300,17 @@ public Mono createMessageBatch(CreateMessageBatchOptions * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * @param transactionContext to be set on message before sending to Service Bus. - * + * @param transactionContext to be set on message before sending to Service Bus. * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * - * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionID} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionID} is {@code null}. + * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -350,13 +325,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws ServiceBusException If the message could not be scheduled. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime) { return scheduleMessageInternal(message, scheduledEnqueueTime, null); @@ -366,13 +339,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a batch of scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled * message is enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus queue or topic. + * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * - * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime) { @@ -383,19 +354,17 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Sends a scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus Queue. + * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. - * @param transactionContext Transaction to associate with the operation. - * + * @param transactionContext Transaction to associate with the operation. * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * - * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return fluxError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessages"))); @@ -433,12 +402,10 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Cancels the enqueuing of a scheduled message, if it was not already enqueued. * * @param sequenceNumber of the scheduled message to cancel. - * * @return The {@link Mono} that finishes this operation on service bus resource. - * * @throws IllegalArgumentException if {@code sequenceNumber} is negative. - * @throws ServiceBusException If the messages could not be cancelled. - * @throws IllegalStateException if sender is already disposed. + * @throws ServiceBusException If the messages could not be cancelled. + * @throws IllegalStateException if sender is already disposed. */ public Mono cancelScheduledMessage(long sequenceNumber) { if (isDisposed.get()) { @@ -459,12 +426,10 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * Cancels the enqueuing of an already scheduled message, if it was not already enqueued. * * @param sequenceNumbers of the scheduled messages to cancel. - * * @return The {@link Mono} that finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code sequenceNumbers} is null. + * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if the scheduled messages cannot cancelled. + * @throws ServiceBusException if the scheduled messages cannot cancelled. */ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { @@ -487,10 +452,8 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * {@link ServiceBusReceivedMessage} all operations that needs to be in this transaction. * * @return A new {@link ServiceBusTransactionContext}. - * * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if a transaction cannot be created. - * + * @throws ServiceBusException if a transaction cannot be created. * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -509,13 +472,10 @@ public Mono createTransaction() { * Commits the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext to be committed. - * * @return The {@link Mono} that finishes this operation on Service Bus resource. - * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be committed. - * + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be committed. * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -534,13 +494,10 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * Rollbacks the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext Transaction to rollback. - * * @return The {@link Mono} that finishes this operation on the Service Bus resource. - * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be rolled back. - * + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be rolled back. * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -574,13 +531,17 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - messages.forEach(message -> messageBatch.tryAddMessage(message)); + StreamSupport.stream(messages.spliterator(), true) + .flatMap(message -> { + messageBatch.tryAddMessage(message); + return null; + }); return sendInternal(messageBatch, transaction); }); } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return monoError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessage"))); @@ -595,7 +556,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate return getSendLink() .flatMap(link -> link.getLinkSize().flatMap(size -> { - int maxSize = size > 0 + int maxSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES; @@ -603,15 +564,15 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate .flatMap(connection -> connection.getManagementNode(entityName, entityType)) .flatMap(managementNode -> managementNode.schedule(Arrays.asList(message), scheduledEnqueueTime, maxSize, link.getLinkName(), transactionContext) - .next()); + .next()); })); } /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. - * @param transactionContext to be set on batch message before sending to Service Bus. * + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param transactionContext to be set on batch message before sending to Service Bus. * @return A {@link Mono} the finishes this operation on service bus resource. */ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -635,35 +596,32 @@ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransact logger.info("Sending batch with size[{}].", batch.getCount()); - Context sharedContext = null; - final List messages = new ArrayList<>(); - - for (int i = 0; i < batch.getMessages().size(); i++) { - final ServiceBusMessage event = batch.getMessages().get(i); + AtomicReference sharedContext = new AtomicReference<>(Context.NONE); + final List messages = Collections.synchronizedList(new ArrayList<>()); + batch.getMessages().parallelStream().forEach(serviceBusMessage -> { if (isTracingEnabled) { - parentContext.set(event.getContext()); - if (i == 0) { - sharedContext = tracerProvider.getSharedSpanBuilder(SERVICE_BASE_NAME, parentContext.get()); + parentContext.set(serviceBusMessage.getContext()); + if (sharedContext.get().equals(Context.NONE)) { + sharedContext.set(tracerProvider.getSharedSpanBuilder(SERVICE_BASE_NAME, parentContext.get())); } - tracerProvider.addSpanLinks(sharedContext.addData(SPAN_CONTEXT_KEY, event.getContext())); + tracerProvider.addSpanLinks(sharedContext.get().addData(SPAN_CONTEXT_KEY, serviceBusMessage.getContext())); } - final org.apache.qpid.proton.message.Message message = messageSerializer.serialize(event); - + final org.apache.qpid.proton.message.Message message = messageSerializer.serialize(serviceBusMessage); final MessageAnnotations messageAnnotations = message.getMessageAnnotations() == null ? new MessageAnnotations(new HashMap<>()) : message.getMessageAnnotations(); message.setMessageAnnotations(messageAnnotations); messages.add(message); - } + }); if (isTracingEnabled) { - final Context finalSharedContext = sharedContext == null + final Context finalSharedContext = sharedContext.get().equals(Context.NONE) ? Context.NONE - : sharedContext - .addData(ENTITY_PATH_KEY, entityName) - .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); + : sharedContext.get() + .addData(ENTITY_PATH_KEY, entityName) + .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) + .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); // Start send span and store updated context parentContext.set(tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, finalSharedContext, ProcessKind.SEND)); } @@ -708,11 +666,11 @@ private Mono sendInternal(Flux messages, ServiceBusTran link.getHostname())); }) .flatMap(list -> sendInternalBatch(Flux.fromIterable(list), transactionContext))) - .onErrorMap(this::mapError); + .onErrorMap(this::mapError); } private Mono sendInternalBatch(Flux eventBatches, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { return eventBatches .flatMap(messageBatch -> sendInternal(messageBatch, transactionContext)) .then() @@ -752,8 +710,8 @@ private static class AmqpMessageCollector implements Collector 0 ? options.getMaximumSizeInBytes() From 65e503215ee7cbc8882be5035be8bef90dcb60b8 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 28 Apr 2021 16:13:08 +0800 Subject: [PATCH 02/34] [BUG] Track 2 SB API (Batch Send Messages) doesn't seem to work. Messages are being sent at a slow pace. #16127 202104281613 --- .../ServiceBusSenderAsyncClient.java | 195 +++++++++++------- 1 file changed, 119 insertions(+), 76 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 70c900fc0f65..2aad7489d44e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -27,7 +27,14 @@ import reactor.core.publisher.Mono; import java.time.OffsetDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; @@ -41,7 +48,10 @@ import static com.azure.core.amqp.implementation.RetryUtil.withRetry; import static com.azure.core.util.FluxUtil.fluxError; import static com.azure.core.util.FluxUtil.monoError; -import static com.azure.core.util.tracing.Tracer.*; +import static com.azure.core.util.tracing.Tracer.AZ_TRACING_NAMESPACE_KEY; +import static com.azure.core.util.tracing.Tracer.ENTITY_PATH_KEY; +import static com.azure.core.util.tracing.Tracer.HOST_NAME_KEY; +import static com.azure.core.util.tracing.Tracer.SPAN_CONTEXT_KEY; import static com.azure.messaging.servicebus.implementation.Messages.INVALID_OPERATION_DISPOSED_SENDER; import static com.azure.messaging.servicebus.implementation.ServiceBusConstants.AZ_TRACING_SERVICE_NAME; @@ -59,6 +69,7 @@ * *

Send messages using a size-limited {@link ServiceBusMessageBatch} to a Service Bus resource

* {@codesnippet com.azure.messaging.servicebus.servicebusasyncsenderclient.createMessageBatch#CreateMessageBatchOptionsLimitedSize} + * */ @ServiceClient(builder = ServiceBusClientBuilder.class, isAsync = true) public final class ServiceBusSenderAsyncClient implements AutoCloseable { @@ -71,7 +82,7 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { // for more information on Azure resource provider namespaces. private static final String AZ_TRACING_NAMESPACE_VALUE = "Microsoft.ServiceBus"; - private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); + private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); private static final String SERVICE_BASE_NAME = "ServiceBus."; private final ClientLogger logger = new ClientLogger(ServiceBusSenderAsyncClient.class); @@ -91,8 +102,8 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { * Creates a new instance of this {@link ServiceBusSenderAsyncClient} that sends messages to a Service Bus entity. */ ServiceBusSenderAsyncClient(String entityName, MessagingEntityType entityType, - ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { + ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, + MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { // Caching the created link so we don't invoke another link creation. this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); @@ -129,11 +140,13 @@ public String getEntityPath() { * Sends a message to a Service Bus queue or topic. * * @param message Message to be sent to Service Bus queue or topic. + * * @return The {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code message} is {@code null}. + * + * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { if (Objects.isNull(message)) { @@ -145,14 +158,16 @@ public Mono sendMessage(ServiceBusMessage message) { /** * Sends a message to a Service Bus queue or topic. * - * @param message Message to be sent to Service Bus queue or topic. + * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return The {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code message}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * + * @throws NullPointerException if {@code message}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { @@ -170,17 +185,19 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * exceed the maximum size of a single batch, an exception will be triggered and the send will fail. * By default, the message size is the max amount allowed on the link. * - * @param messages Messages to be sent to Service Bus queue or topic. + * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessages(Iterable messages, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -197,10 +214,12 @@ public Mono sendMessages(Iterable messages, * message size is the max amount allowed on the link. * * @param messages Messages to be sent to Service Bus queue or topic. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * @throws NullPointerException if {@code messages} is {@code null}. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * + * @throws NullPointerException if {@code messages} is {@code null}. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(Iterable messages) { @@ -211,9 +230,11 @@ public Mono sendMessages(Iterable messages) { * Sends a message batch to the Azure Service Bus entity this sender is connected to. * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * * @return A {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code batch} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * + * @throws NullPointerException if {@code batch} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch) { @@ -223,12 +244,14 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -246,7 +269,7 @@ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransacti * Creates a {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. * * @return A {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. - * @throws ServiceBusException if the message batch could not be created. + * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. */ public Mono createMessageBatch() { @@ -257,12 +280,13 @@ public Mono createMessageBatch() { * Creates an {@link ServiceBusMessageBatch} configured with the options specified. * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. + * * @return A new {@link ServiceBusMessageBatch} configured with the given options. - * @throws NullPointerException if {@code options} is null. - * @throws ServiceBusException if the message batch could not be created. - * @throws IllegalStateException if sender is already disposed. + * @throws NullPointerException if {@code options} is null. + * @throws ServiceBusException if the message batch could not be created. + * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than - * maximum allowed size. + * maximum allowed size. */ public Mono createMessageBatch(CreateMessageBatchOptions options) { if (isDisposed.get()) { @@ -300,17 +324,19 @@ public Mono createMessageBatch(CreateMessageBatchOptions * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * @param transactionContext to be set on message before sending to Service Bus. + * @param transactionContext to be set on message before sending to Service Bus. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionID} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * + * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionID} is {@code null}. + * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -325,11 +351,13 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. + * * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws ServiceBusException If the message could not be scheduled. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime) { return scheduleMessageInternal(message, scheduledEnqueueTime, null); @@ -339,11 +367,13 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a batch of scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled * message is enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus queue or topic. + * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * + * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime) { @@ -354,17 +384,19 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Sends a scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus Queue. + * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. - * @param transactionContext Transaction to associate with the operation. + * @param transactionContext Transaction to associate with the operation. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * + * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return fluxError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessages"))); @@ -402,10 +434,12 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Cancels the enqueuing of a scheduled message, if it was not already enqueued. * * @param sequenceNumber of the scheduled message to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. + * * @throws IllegalArgumentException if {@code sequenceNumber} is negative. - * @throws ServiceBusException If the messages could not be cancelled. - * @throws IllegalStateException if sender is already disposed. + * @throws ServiceBusException If the messages could not be cancelled. + * @throws IllegalStateException if sender is already disposed. */ public Mono cancelScheduledMessage(long sequenceNumber) { if (isDisposed.get()) { @@ -426,10 +460,12 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * Cancels the enqueuing of an already scheduled message, if it was not already enqueued. * * @param sequenceNumbers of the scheduled messages to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. - * @throws NullPointerException if {@code sequenceNumbers} is null. + * + * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if the scheduled messages cannot cancelled. + * @throws ServiceBusException if the scheduled messages cannot cancelled. */ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { @@ -452,8 +488,10 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * {@link ServiceBusReceivedMessage} all operations that needs to be in this transaction. * * @return A new {@link ServiceBusTransactionContext}. + * * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if a transaction cannot be created. + * @throws ServiceBusException if a transaction cannot be created. + * * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -472,10 +510,13 @@ public Mono createTransaction() { * Commits the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext to be committed. + * * @return The {@link Mono} that finishes this operation on Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be committed. + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be committed. + * * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -494,10 +535,13 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * Rollbacks the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext Transaction to rollback. + * * @return The {@link Mono} that finishes this operation on the Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be rolled back. + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be rolled back. + * * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -531,17 +575,16 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - StreamSupport.stream(messages.spliterator(), true) - .flatMap(message -> { - messageBatch.tryAddMessage(message); - return null; - }); + StreamSupport.stream(messages.spliterator(), true).flatMap(message -> { + messageBatch.tryAddMessage(message); + return null; + }); return sendInternal(messageBatch, transaction); }); } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return monoError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessage"))); @@ -556,7 +599,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate return getSendLink() .flatMap(link -> link.getLinkSize().flatMap(size -> { - int maxSize = size > 0 + int maxSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES; @@ -564,15 +607,15 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate .flatMap(connection -> connection.getManagementNode(entityName, entityType)) .flatMap(managementNode -> managementNode.schedule(Arrays.asList(message), scheduledEnqueueTime, maxSize, link.getLinkName(), transactionContext) - .next()); + .next()); })); } /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. - * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. */ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -619,9 +662,9 @@ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransact final Context finalSharedContext = sharedContext.get().equals(Context.NONE) ? Context.NONE : sharedContext.get() - .addData(ENTITY_PATH_KEY, entityName) - .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); + .addData(ENTITY_PATH_KEY, entityName) + .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) + .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); // Start send span and store updated context parentContext.set(tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, finalSharedContext, ProcessKind.SEND)); } @@ -666,11 +709,11 @@ private Mono sendInternal(Flux messages, ServiceBusTran link.getHostname())); }) .flatMap(list -> sendInternalBatch(Flux.fromIterable(list), transactionContext))) - .onErrorMap(this::mapError); + .onErrorMap(this::mapError); } private Mono sendInternalBatch(Flux eventBatches, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { return eventBatches .flatMap(messageBatch -> sendInternal(messageBatch, transactionContext)) .then() @@ -710,8 +753,8 @@ private static class AmqpMessageCollector implements Collector 0 ? options.getMaximumSizeInBytes() From 381357d0568a0421a3909aa7c472555565991f49 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 28 Apr 2021 17:31:06 +0800 Subject: [PATCH 03/34] [BUG] Track 2 SB API (Batch Send Messages) doesn't seem to work. Messages are being sent at a slow pace. #16127 202104281731 --- .../com/azure/messaging/servicebus/ServiceBusMessageBatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index c7b057983cb5..8b87dfcaebbe 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -31,7 +31,7 @@ public final class ServiceBusMessageBatch { private final MessageSerializer serializer; private final List serviceBusMessageList; private final byte[] eventBytes; - private AtomicInteger sizeInBytes; + private final AtomicInteger sizeInBytes; private final TracerProvider tracerProvider; private final String entityPath; private final String hostname; From 0c4190e9bb071c612725250f13c3f62a0e47eb55 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 29 Apr 2021 14:44:19 +0800 Subject: [PATCH 04/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104291444 --- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 2aad7489d44e..a7fb2611fd15 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -42,7 +42,6 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; -import java.util.stream.StreamSupport; import static com.azure.core.amqp.implementation.RetryUtil.getRetryPolicy; import static com.azure.core.amqp.implementation.RetryUtil.withRetry; @@ -575,9 +574,8 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - StreamSupport.stream(messages.spliterator(), true).flatMap(message -> { + messages.forEach(message -> { messageBatch.tryAddMessage(message); - return null; }); return sendInternal(messageBatch, transaction); }); From 2d21d73cbb26bca07de45668fcfa54aa1cf88fc4 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 29 Apr 2021 15:54:49 +0800 Subject: [PATCH 05/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104291554 --- .../azure/messaging/servicebus/ServiceBusMessageBatch.java | 7 ++----- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 6 +++--- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index 8b87dfcaebbe..3f7cd24d3bed 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -11,10 +11,7 @@ import com.azure.core.util.logging.ClientLogger; import java.nio.BufferOverflowException; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Objects; +import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import static com.azure.messaging.servicebus.implementation.MessageUtils.traceMessageSpan; @@ -41,7 +38,7 @@ public final class ServiceBusMessageBatch { this.maxMessageSize = maxMessageSize; this.contextProvider = contextProvider; this.serializer = serializer; - this.serviceBusMessageList = new LinkedList<>(); + this.serviceBusMessageList = Collections.synchronizedList(new LinkedList<>()); this.sizeInBytes = new AtomicInteger((maxMessageSize / 65536) * 1024); // reserve 1KB for every 64KB this.eventBytes = new byte[maxMessageSize]; this.tracerProvider = tracerProvider; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index a7fb2611fd15..47742794eab4 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -42,6 +42,7 @@ import java.util.function.Function; import java.util.function.Supplier; import java.util.stream.Collector; +import java.util.stream.StreamSupport; import static com.azure.core.amqp.implementation.RetryUtil.getRetryPolicy; import static com.azure.core.amqp.implementation.RetryUtil.withRetry; @@ -574,9 +575,8 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - messages.forEach(message -> { - messageBatch.tryAddMessage(message); - }); + StreamSupport.stream(messages.spliterator(),true) + .forEach(message -> messageBatch.tryAddMessage(message)); return sendInternal(messageBatch, transaction); }); } From 12fabc7c53af67a1ddc541b7523b47a7b0979797 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 29 Apr 2021 16:29:45 +0800 Subject: [PATCH 06/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104291630 --- .../servicebus/ServiceBusMessageBatch.java | 6 +- .../ServiceBusSenderAsyncClient.java | 174 +++++++----------- 2 files changed, 75 insertions(+), 105 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index 3f7cd24d3bed..f95769d60105 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -11,7 +11,11 @@ import com.azure.core.util.logging.ClientLogger; import java.nio.BufferOverflowException; -import java.util.*; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Objects; import java.util.concurrent.atomic.AtomicInteger; import static com.azure.messaging.servicebus.implementation.MessageUtils.traceMessageSpan; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 47742794eab4..49898b6480de 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -69,7 +69,6 @@ * *

Send messages using a size-limited {@link ServiceBusMessageBatch} to a Service Bus resource

* {@codesnippet com.azure.messaging.servicebus.servicebusasyncsenderclient.createMessageBatch#CreateMessageBatchOptionsLimitedSize} - * */ @ServiceClient(builder = ServiceBusClientBuilder.class, isAsync = true) public final class ServiceBusSenderAsyncClient implements AutoCloseable { @@ -82,7 +81,7 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { // for more information on Azure resource provider namespaces. private static final String AZ_TRACING_NAMESPACE_VALUE = "Microsoft.ServiceBus"; - private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); + private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); private static final String SERVICE_BASE_NAME = "ServiceBus."; private final ClientLogger logger = new ClientLogger(ServiceBusSenderAsyncClient.class); @@ -102,8 +101,8 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { * Creates a new instance of this {@link ServiceBusSenderAsyncClient} that sends messages to a Service Bus entity. */ ServiceBusSenderAsyncClient(String entityName, MessagingEntityType entityType, - ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { + ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, + MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { // Caching the created link so we don't invoke another link creation. this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); @@ -140,13 +139,11 @@ public String getEntityPath() { * Sends a message to a Service Bus queue or topic. * * @param message Message to be sent to Service Bus queue or topic. - * * @return The {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code message} is {@code null}. + * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { if (Objects.isNull(message)) { @@ -158,16 +155,14 @@ public Mono sendMessage(ServiceBusMessage message) { /** * Sends a message to a Service Bus queue or topic. * - * @param message Message to be sent to Service Bus queue or topic. + * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return The {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code message}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * @throws NullPointerException if {@code message}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { @@ -185,19 +180,17 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * exceed the maximum size of a single batch, an exception will be triggered and the send will fail. * By default, the message size is the max amount allowed on the link. * - * @param messages Messages to be sent to Service Bus queue or topic. + * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. */ public Mono sendMessages(Iterable messages, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -214,12 +207,10 @@ public Mono sendMessages(Iterable messages, * message size is the max amount allowed on the link. * * @param messages Messages to be sent to Service Bus queue or topic. - * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * - * @throws NullPointerException if {@code messages} is {@code null}. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * @throws NullPointerException if {@code messages} is {@code null}. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(Iterable messages) { @@ -230,11 +221,9 @@ public Mono sendMessages(Iterable messages) { * Sends a message batch to the Azure Service Bus entity this sender is connected to. * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. - * * @return A {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code batch} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws NullPointerException if {@code batch} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch) { @@ -244,14 +233,12 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. - * * @return A {@link Mono} the finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -269,7 +256,7 @@ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransacti * Creates a {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. * * @return A {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. - * @throws ServiceBusException if the message batch could not be created. + * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. */ public Mono createMessageBatch() { @@ -280,13 +267,12 @@ public Mono createMessageBatch() { * Creates an {@link ServiceBusMessageBatch} configured with the options specified. * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. - * * @return A new {@link ServiceBusMessageBatch} configured with the given options. - * @throws NullPointerException if {@code options} is null. - * @throws ServiceBusException if the message batch could not be created. - * @throws IllegalStateException if sender is already disposed. + * @throws NullPointerException if {@code options} is null. + * @throws ServiceBusException if the message batch could not be created. + * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than - * maximum allowed size. + * maximum allowed size. */ public Mono createMessageBatch(CreateMessageBatchOptions options) { if (isDisposed.get()) { @@ -324,19 +310,17 @@ public Mono createMessageBatch(CreateMessageBatchOptions * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * @param transactionContext to be set on message before sending to Service Bus. - * + * @param transactionContext to be set on message before sending to Service Bus. * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * - * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionID} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionID} is {@code null}. + * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -351,13 +335,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws ServiceBusException If the message could not be scheduled. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime) { return scheduleMessageInternal(message, scheduledEnqueueTime, null); @@ -367,13 +349,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a batch of scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled * message is enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus queue or topic. + * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * - * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime) { @@ -384,19 +364,17 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Sends a scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus Queue. + * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. - * @param transactionContext Transaction to associate with the operation. - * + * @param transactionContext Transaction to associate with the operation. * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * - * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * {@code transactionContext.transactionId} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return fluxError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessages"))); @@ -434,12 +412,10 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Cancels the enqueuing of a scheduled message, if it was not already enqueued. * * @param sequenceNumber of the scheduled message to cancel. - * * @return The {@link Mono} that finishes this operation on service bus resource. - * * @throws IllegalArgumentException if {@code sequenceNumber} is negative. - * @throws ServiceBusException If the messages could not be cancelled. - * @throws IllegalStateException if sender is already disposed. + * @throws ServiceBusException If the messages could not be cancelled. + * @throws IllegalStateException if sender is already disposed. */ public Mono cancelScheduledMessage(long sequenceNumber) { if (isDisposed.get()) { @@ -460,12 +436,10 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * Cancels the enqueuing of an already scheduled message, if it was not already enqueued. * * @param sequenceNumbers of the scheduled messages to cancel. - * * @return The {@link Mono} that finishes this operation on service bus resource. - * - * @throws NullPointerException if {@code sequenceNumbers} is null. + * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if the scheduled messages cannot cancelled. + * @throws ServiceBusException if the scheduled messages cannot cancelled. */ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { @@ -488,10 +462,8 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * {@link ServiceBusReceivedMessage} all operations that needs to be in this transaction. * * @return A new {@link ServiceBusTransactionContext}. - * * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if a transaction cannot be created. - * + * @throws ServiceBusException if a transaction cannot be created. * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -510,13 +482,10 @@ public Mono createTransaction() { * Commits the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext to be committed. - * * @return The {@link Mono} that finishes this operation on Service Bus resource. - * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be committed. - * + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be committed. * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -535,13 +504,10 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * Rollbacks the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext Transaction to rollback. - * * @return The {@link Mono} that finishes this operation on the Service Bus resource. - * * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be rolled back. - * + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be rolled back. * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -575,14 +541,14 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - StreamSupport.stream(messages.spliterator(),true) + StreamSupport.stream(messages.spliterator(), true) .forEach(message -> messageBatch.tryAddMessage(message)); return sendInternal(messageBatch, transaction); }); } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return monoError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessage"))); @@ -597,7 +563,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate return getSendLink() .flatMap(link -> link.getLinkSize().flatMap(size -> { - int maxSize = size > 0 + int maxSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES; @@ -605,15 +571,15 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate .flatMap(connection -> connection.getManagementNode(entityName, entityType)) .flatMap(managementNode -> managementNode.schedule(Arrays.asList(message), scheduledEnqueueTime, maxSize, link.getLinkName(), transactionContext) - .next()); + .next()); })); } /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. - * @param transactionContext to be set on batch message before sending to Service Bus. * + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param transactionContext to be set on batch message before sending to Service Bus. * @return A {@link Mono} the finishes this operation on service bus resource. */ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -660,9 +626,9 @@ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransact final Context finalSharedContext = sharedContext.get().equals(Context.NONE) ? Context.NONE : sharedContext.get() - .addData(ENTITY_PATH_KEY, entityName) - .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); + .addData(ENTITY_PATH_KEY, entityName) + .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) + .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); // Start send span and store updated context parentContext.set(tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, finalSharedContext, ProcessKind.SEND)); } @@ -707,11 +673,11 @@ private Mono sendInternal(Flux messages, ServiceBusTran link.getHostname())); }) .flatMap(list -> sendInternalBatch(Flux.fromIterable(list), transactionContext))) - .onErrorMap(this::mapError); + .onErrorMap(this::mapError); } private Mono sendInternalBatch(Flux eventBatches, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { return eventBatches .flatMap(messageBatch -> sendInternal(messageBatch, transactionContext)) .then() @@ -751,8 +717,8 @@ private static class AmqpMessageCollector implements Collector 0 ? options.getMaximumSizeInBytes() From af0b688531add3a03c7feb7170949b65bd397ab0 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 29 Apr 2021 16:56:15 +0800 Subject: [PATCH 07/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104291656 --- .../ServiceBusSenderAsyncClient.java | 82 +++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 49898b6480de..d1f17e1e93df 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -140,9 +140,9 @@ public String getEntityPath() { * * @param message Message to be sent to Service Bus queue or topic. * @return The {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code message} is {@code null}. + * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { @@ -155,13 +155,13 @@ public Mono sendMessage(ServiceBusMessage message) { /** * Sends a message to a Service Bus queue or topic. * - * @param message Message to be sent to Service Bus queue or topic. + * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. * @return The {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code message}, {@code transactionContext} or + * @throws NullPointerException if {@code message}, {@code transactionContext} or * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or + * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { @@ -180,13 +180,13 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * exceed the maximum size of a single batch, an exception will be triggered and the send will fail. * By default, the message size is the max amount allowed on the link. * - * @param messages Messages to be sent to Service Bus queue or topic. + * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * @throws NullPointerException if {@code batch}, {@code transactionContext} or * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or * the message could not be sent. */ public Mono sendMessages(Iterable messages, @@ -208,8 +208,8 @@ public Mono sendMessages(Iterable messages, * * @param messages Messages to be sent to Service Bus queue or topic. * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. - * @throws NullPointerException if {@code messages} is {@code null}. - * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or + * @throws NullPointerException if {@code messages} is {@code null}. + * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ @@ -222,8 +222,8 @@ public Mono sendMessages(Iterable messages) { * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @return A {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code batch} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws NullPointerException if {@code batch} is {@code null}. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch) { @@ -233,12 +233,12 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. * @return A {@link Mono} the finishes this operation on service bus resource. - * @throws NullPointerException if {@code batch}, {@code transactionContext} or + * @throws NullPointerException if {@code batch}, {@code transactionContext} or * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException if the message batch could not be sent. + * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -256,7 +256,7 @@ public Mono sendMessages(ServiceBusMessageBatch batch, ServiceBusTransacti * Creates a {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. * * @return A {@link ServiceBusMessageBatch} that can fit as many messages as the transport allows. - * @throws ServiceBusException if the message batch could not be created. + * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. */ public Mono createMessageBatch() { @@ -268,9 +268,9 @@ public Mono createMessageBatch() { * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. * @return A new {@link ServiceBusMessageBatch} configured with the given options. - * @throws NullPointerException if {@code options} is null. - * @throws ServiceBusException if the message batch could not be created. - * @throws IllegalStateException if sender is already disposed. + * @throws NullPointerException if {@code options} is null. + * @throws ServiceBusException if the message batch could not be created. + * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than * maximum allowed size. */ @@ -310,13 +310,13 @@ public Mono createMessageBatch(CreateMessageBatchOptions * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. - * @param transactionContext to be set on message before sending to Service Bus. + * @param transactionContext to be set on message before sending to Service Bus. * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. - * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or * {@code transactionContext.transactionID} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, @@ -335,11 +335,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a scheduled message to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param message Message to be sent to the Service Bus Queue. + * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the message could not be scheduled. + * @throws ServiceBusException If the message could not be scheduled. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime) { return scheduleMessageInternal(message, scheduledEnqueueTime, null); @@ -349,11 +349,11 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * Sends a batch of scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled * message is enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus queue or topic. + * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime) { @@ -364,13 +364,13 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Sends a scheduled messages to the Azure Service Bus entity this sender is connected to. A scheduled message is * enqueued and made available to receivers only at the scheduled enqueue time. * - * @param messages Messages to be sent to the Service Bus Queue. + * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. * @param transactionContext Transaction to associate with the operation. * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. - * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or + * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or * {@code transactionContext.transactionId} is {@code null}. - * @throws ServiceBusException If the messages could not be scheduled. + * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, @@ -414,8 +414,8 @@ public Flux scheduleMessages(Iterable messages, OffsetD * @param sequenceNumber of the scheduled message to cancel. * @return The {@link Mono} that finishes this operation on service bus resource. * @throws IllegalArgumentException if {@code sequenceNumber} is negative. - * @throws ServiceBusException If the messages could not be cancelled. - * @throws IllegalStateException if sender is already disposed. + * @throws ServiceBusException If the messages could not be cancelled. + * @throws IllegalStateException if sender is already disposed. */ public Mono cancelScheduledMessage(long sequenceNumber) { if (isDisposed.get()) { @@ -437,9 +437,9 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * * @param sequenceNumbers of the scheduled messages to cancel. * @return The {@link Mono} that finishes this operation on service bus resource. - * @throws NullPointerException if {@code sequenceNumbers} is null. + * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if the scheduled messages cannot cancelled. + * @throws ServiceBusException if the scheduled messages cannot cancelled. */ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { @@ -463,7 +463,7 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * * @return A new {@link ServiceBusTransactionContext}. * @throws IllegalStateException if sender is already disposed. - * @throws ServiceBusException if a transaction cannot be created. + * @throws ServiceBusException if a transaction cannot be created. * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -484,8 +484,8 @@ public Mono createTransaction() { * @param transactionContext to be committed. * @return The {@link Mono} that finishes this operation on Service Bus resource. * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be committed. + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be committed. * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -506,8 +506,8 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * @param transactionContext Transaction to rollback. * @return The {@link Mono} that finishes this operation on the Service Bus resource. * @throws IllegalStateException if sender is already disposed. - * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. - * @throws ServiceBusException if the transaction could not be rolled back. + * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. + * @throws ServiceBusException if the transaction could not be rolled back. * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -578,7 +578,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. * - * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. * @return A {@link Mono} the finishes this operation on service bus resource. */ From f67e6c1b7bae6108589ca7697ac3e9882425b9d3 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 30 Apr 2021 09:40:22 +0800 Subject: [PATCH 08/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104300940 --- .../azure/messaging/servicebus/ServiceBusSenderAsyncClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index d1f17e1e93df..1e9c6f60f7f5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -366,7 +366,7 @@ public Flux scheduleMessages(Iterable messages, OffsetD * * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. - * @param transactionContext Transaction to associate with the operation. + * @param transactionContext Transaction to associate with the operation. * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or * {@code transactionContext.transactionId} is {@code null}. From f718be4c1a9cd84f339390b5e526268022918728 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 30 Apr 2021 10:26:28 +0800 Subject: [PATCH 09/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104301026 --- .../com/azure/messaging/servicebus/ServiceBusMessageBatch.java | 2 +- .../azure/messaging/servicebus/ServiceBusSenderAsyncClient.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index f95769d60105..8c0a9b5cdc66 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -112,7 +112,7 @@ public boolean tryAddMessage(final ServiceBusMessage serviceBusMessage) { } if (this.sizeInBytes.addAndGet(size) > this.maxMessageSize) { - this.sizeInBytes.addAndGet(-1 * size); + this.sizeInBytes.addAndGet( -1 * size ); return false; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 1e9c6f60f7f5..7c4de24843f6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -539,7 +539,6 @@ private Mono sendIterable(Iterable messages, ServiceBus if (Objects.isNull(messages)) { return monoError(logger, new NullPointerException("'messages' cannot be null.")); } - return createMessageBatch().flatMap(messageBatch -> { StreamSupport.stream(messages.spliterator(), true) .forEach(message -> messageBatch.tryAddMessage(message)); From 3bf18e5103d749f15ddb940fe3ff0d11bb807de6 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 30 Apr 2021 10:52:24 +0800 Subject: [PATCH 10/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104301052 --- .../com/azure/messaging/servicebus/ServiceBusMessageBatch.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index 8c0a9b5cdc66..f95769d60105 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -112,7 +112,7 @@ public boolean tryAddMessage(final ServiceBusMessage serviceBusMessage) { } if (this.sizeInBytes.addAndGet(size) > this.maxMessageSize) { - this.sizeInBytes.addAndGet( -1 * size ); + this.sizeInBytes.addAndGet(-1 * size); return false; } From 7dc3f5a99eaec16aed6d7c6cc3d93a3b2f20ef8a Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 30 Apr 2021 11:38:12 +0800 Subject: [PATCH 11/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202104301138 --- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index a667c493ceac..7997093a492e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -371,7 +371,8 @@ void nonRetryableError() { * Verifies that when there are no subscribers, one request is fetched up stream. */ @Test - void noSubscribers() { + void noSubscribers() throws InterruptedException { + Thread.sleep(1000); // Arrange final Subscription subscription = mock(Subscription.class); From a601d4ec407a5ec0faffbb4925ea4494a3c14437 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 6 May 2021 11:34:41 +0800 Subject: [PATCH 12/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202105061134 --- .../ServiceBusSenderAsyncClient.java | 83 +++++++++++++------ 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 7c4de24843f6..3c60178b858a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -69,6 +69,7 @@ * *

Send messages using a size-limited {@link ServiceBusMessageBatch} to a Service Bus resource

* {@codesnippet com.azure.messaging.servicebus.servicebusasyncsenderclient.createMessageBatch#CreateMessageBatchOptionsLimitedSize} + * */ @ServiceClient(builder = ServiceBusClientBuilder.class, isAsync = true) public final class ServiceBusSenderAsyncClient implements AutoCloseable { @@ -81,7 +82,7 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { // for more information on Azure resource provider namespaces. private static final String AZ_TRACING_NAMESPACE_VALUE = "Microsoft.ServiceBus"; - private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); + private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); private static final String SERVICE_BASE_NAME = "ServiceBus."; private final ClientLogger logger = new ClientLogger(ServiceBusSenderAsyncClient.class); @@ -101,8 +102,8 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { * Creates a new instance of this {@link ServiceBusSenderAsyncClient} that sends messages to a Service Bus entity. */ ServiceBusSenderAsyncClient(String entityName, MessagingEntityType entityType, - ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { + ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, + MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { // Caching the created link so we don't invoke another link creation. this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); @@ -139,11 +140,13 @@ public String getEntityPath() { * Sends a message to a Service Bus queue or topic. * * @param message Message to be sent to Service Bus queue or topic. + * * @return The {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { if (Objects.isNull(message)) { @@ -157,12 +160,14 @@ public Mono sendMessage(ServiceBusMessage message) { * * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return The {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code message}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { @@ -182,15 +187,17 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. + * * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessages(Iterable messages, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -207,10 +214,12 @@ public Mono sendMessages(Iterable messages, * message size is the max amount allowed on the link. * * @param messages Messages to be sent to Service Bus queue or topic. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. + * * @throws NullPointerException if {@code messages} is {@code null}. * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(Iterable messages) { @@ -221,7 +230,9 @@ public Mono sendMessages(Iterable messages) { * Sends a message batch to the Azure Service Bus entity this sender is connected to. * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * * @return A {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code batch} is {@code null}. * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. @@ -235,9 +246,11 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ @@ -267,12 +280,13 @@ public Mono createMessageBatch() { * Creates an {@link ServiceBusMessageBatch} configured with the options specified. * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. + * * @return A new {@link ServiceBusMessageBatch} configured with the given options. * @throws NullPointerException if {@code options} is null. * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than - * maximum allowed size. + * maximum allowed size. */ public Mono createMessageBatch(CreateMessageBatchOptions options) { if (isDisposed.get()) { @@ -313,14 +327,16 @@ public Mono createMessageBatch(CreateMessageBatchOptions * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. * @param transactionContext to be set on message before sending to Service Bus. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. + * * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionID} is {@code null}. + * {@code transactionContext.transactionID} is {@code null}. * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -337,7 +353,9 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. + * * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. * @throws ServiceBusException If the message could not be scheduled. */ @@ -351,7 +369,9 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. + * * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. @@ -367,14 +387,16 @@ public Flux scheduleMessages(Iterable messages, OffsetD * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. * @param transactionContext Transaction to associate with the operation. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. + * * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return fluxError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessages"))); @@ -412,7 +434,9 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Cancels the enqueuing of a scheduled message, if it was not already enqueued. * * @param sequenceNumber of the scheduled message to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. + * * @throws IllegalArgumentException if {@code sequenceNumber} is negative. * @throws ServiceBusException If the messages could not be cancelled. * @throws IllegalStateException if sender is already disposed. @@ -436,7 +460,9 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * Cancels the enqueuing of an already scheduled message, if it was not already enqueued. * * @param sequenceNumbers of the scheduled messages to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. + * * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if the scheduled messages cannot cancelled. @@ -462,8 +488,10 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * {@link ServiceBusReceivedMessage} all operations that needs to be in this transaction. * * @return A new {@link ServiceBusTransactionContext}. + * * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if a transaction cannot be created. + * * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -482,10 +510,13 @@ public Mono createTransaction() { * Commits the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext to be committed. + * * @return The {@link Mono} that finishes this operation on Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. * @throws ServiceBusException if the transaction could not be committed. + * * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -504,10 +535,13 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * Rollbacks the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext Transaction to rollback. + * * @return The {@link Mono} that finishes this operation on the Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. * @throws ServiceBusException if the transaction could not be rolled back. + * * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -539,6 +573,7 @@ private Mono sendIterable(Iterable messages, ServiceBus if (Objects.isNull(messages)) { return monoError(logger, new NullPointerException("'messages' cannot be null.")); } + return createMessageBatch().flatMap(messageBatch -> { StreamSupport.stream(messages.spliterator(), true) .forEach(message -> messageBatch.tryAddMessage(message)); @@ -547,7 +582,7 @@ private Mono sendIterable(Iterable messages, ServiceBus } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return monoError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessage"))); @@ -562,7 +597,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate return getSendLink() .flatMap(link -> link.getLinkSize().flatMap(size -> { - int maxSize = size > 0 + int maxSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES; @@ -570,15 +605,15 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate .flatMap(connection -> connection.getManagementNode(entityName, entityType)) .flatMap(managementNode -> managementNode.schedule(Arrays.asList(message), scheduledEnqueueTime, maxSize, link.getLinkName(), transactionContext) - .next()); + .next()); })); } /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. - * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. */ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -672,11 +707,11 @@ private Mono sendInternal(Flux messages, ServiceBusTran link.getHostname())); }) .flatMap(list -> sendInternalBatch(Flux.fromIterable(list), transactionContext))) - .onErrorMap(this::mapError); + .onErrorMap(this::mapError); } private Mono sendInternalBatch(Flux eventBatches, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { return eventBatches .flatMap(messageBatch -> sendInternal(messageBatch, transactionContext)) .then() @@ -716,8 +751,8 @@ private static class AmqpMessageCollector implements Collector 0 ? options.getMaximumSizeInBytes() From 097dfbf093db12822db90f4b00e57581657f46b4 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 6 May 2021 13:57:10 +0800 Subject: [PATCH 13/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202105061356 --- .../ServiceBusSenderAsyncClient.java | 83 +++++++++++++------ 1 file changed, 59 insertions(+), 24 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 7c4de24843f6..3c60178b858a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -69,6 +69,7 @@ * *

Send messages using a size-limited {@link ServiceBusMessageBatch} to a Service Bus resource

* {@codesnippet com.azure.messaging.servicebus.servicebusasyncsenderclient.createMessageBatch#CreateMessageBatchOptionsLimitedSize} + * */ @ServiceClient(builder = ServiceBusClientBuilder.class, isAsync = true) public final class ServiceBusSenderAsyncClient implements AutoCloseable { @@ -81,7 +82,7 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { // for more information on Azure resource provider namespaces. private static final String AZ_TRACING_NAMESPACE_VALUE = "Microsoft.ServiceBus"; - private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); + private static final CreateMessageBatchOptions DEFAULT_BATCH_OPTIONS = new CreateMessageBatchOptions(); private static final String SERVICE_BASE_NAME = "ServiceBus."; private final ClientLogger logger = new ClientLogger(ServiceBusSenderAsyncClient.class); @@ -101,8 +102,8 @@ public final class ServiceBusSenderAsyncClient implements AutoCloseable { * Creates a new instance of this {@link ServiceBusSenderAsyncClient} that sends messages to a Service Bus entity. */ ServiceBusSenderAsyncClient(String entityName, MessagingEntityType entityType, - ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, - MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { + ServiceBusConnectionProcessor connectionProcessor, AmqpRetryOptions retryOptions, TracerProvider tracerProvider, + MessageSerializer messageSerializer, Runnable onClientClose, String viaEntityName) { // Caching the created link so we don't invoke another link creation. this.messageSerializer = Objects.requireNonNull(messageSerializer, "'messageSerializer' cannot be null."); @@ -139,11 +140,13 @@ public String getEntityPath() { * Sends a message to a Service Bus queue or topic. * * @param message Message to be sent to Service Bus queue or topic. + * * @return The {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code message} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message) { if (Objects.isNull(message)) { @@ -157,12 +160,14 @@ public Mono sendMessage(ServiceBusMessage message) { * * @param message Message to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return The {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code message}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code message} is larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { @@ -182,15 +187,17 @@ public Mono sendMessage(ServiceBusMessage message, ServiceBusTransactionCo * * @param messages Messages to be sent to Service Bus queue or topic. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. + * * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. */ public Mono sendMessages(Iterable messages, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -207,10 +214,12 @@ public Mono sendMessages(Iterable messages, * message size is the max amount allowed on the link. * * @param messages Messages to be sent to Service Bus queue or topic. + * * @return A {@link Mono} that completes when all messages have been sent to the Service Bus resource. + * * @throws NullPointerException if {@code messages} is {@code null}. * @throws ServiceBusException if {@code messages} are larger than the maximum allowed size of a single message or - * the message could not be sent. + * the message could not be sent. * @throws IllegalStateException if sender is already disposed. */ public Mono sendMessages(Iterable messages) { @@ -221,7 +230,9 @@ public Mono sendMessages(Iterable messages) { * Sends a message batch to the Azure Service Bus entity this sender is connected to. * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. + * * @return A {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code batch} is {@code null}. * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. @@ -235,9 +246,11 @@ public Mono sendMessages(ServiceBusMessageBatch batch) { * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. + * * @throws NullPointerException if {@code batch}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws ServiceBusException if the message batch could not be sent. * @throws IllegalStateException if sender is already disposed. */ @@ -267,12 +280,13 @@ public Mono createMessageBatch() { * Creates an {@link ServiceBusMessageBatch} configured with the options specified. * * @param options A set of options used to configure the {@link ServiceBusMessageBatch}. + * * @return A new {@link ServiceBusMessageBatch} configured with the given options. * @throws NullPointerException if {@code options} is null. * @throws ServiceBusException if the message batch could not be created. * @throws IllegalStateException if sender is already disposed. * @throws IllegalArgumentException if {@link CreateMessageBatchOptions#getMaximumSizeInBytes()} is larger than - * maximum allowed size. + * maximum allowed size. */ public Mono createMessageBatch(CreateMessageBatchOptions options) { if (isDisposed.get()) { @@ -313,14 +327,16 @@ public Mono createMessageBatch(CreateMessageBatchOptions * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. * @param transactionContext to be set on message before sending to Service Bus. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. + * * @throws NullPointerException if {@code message}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionID} is {@code null}. + * {@code transactionContext.transactionID} is {@code null}. * @throws ServiceBusException If the message could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(transactionContext)) { return monoError(logger, new NullPointerException("'transactionContext' cannot be null.")); } @@ -337,7 +353,9 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * * @param message Message to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return The sequence number of the scheduled message which can be used to cancel the scheduling of the message. + * * @throws NullPointerException if {@code message} or {@code scheduledEnqueueTime} is {@code null}. * @throws ServiceBusException If the message could not be scheduled. */ @@ -351,7 +369,9 @@ public Mono scheduleMessage(ServiceBusMessage message, OffsetDateTime sche * * @param messages Messages to be sent to the Service Bus queue or topic. * @param scheduledEnqueueTime OffsetDateTime at which the message should appear in the Service Bus queue or topic. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. + * * @throws NullPointerException If {@code messages} or {@code scheduledEnqueueTime} is {@code null}. * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. @@ -367,14 +387,16 @@ public Flux scheduleMessages(Iterable messages, OffsetD * @param messages Messages to be sent to the Service Bus Queue. * @param scheduledEnqueueTime OffsetDateTime at which the messages should appear in the Service Bus queue or topic. * @param transactionContext Transaction to associate with the operation. + * * @return Sequence numbers of the scheduled messages which can be used to cancel the messages. + * * @throws NullPointerException If {@code messages}, {@code scheduledEnqueueTime}, {@code transactionContext} or - * {@code transactionContext.transactionId} is {@code null}. + * {@code transactionContext.transactionId} is {@code null}. * @throws ServiceBusException If the messages could not be scheduled. * @throws IllegalStateException if sender is already disposed. */ public Flux scheduleMessages(Iterable messages, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return fluxError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessages"))); @@ -412,7 +434,9 @@ public Flux scheduleMessages(Iterable messages, OffsetD * Cancels the enqueuing of a scheduled message, if it was not already enqueued. * * @param sequenceNumber of the scheduled message to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. + * * @throws IllegalArgumentException if {@code sequenceNumber} is negative. * @throws ServiceBusException If the messages could not be cancelled. * @throws IllegalStateException if sender is already disposed. @@ -436,7 +460,9 @@ public Mono cancelScheduledMessage(long sequenceNumber) { * Cancels the enqueuing of an already scheduled message, if it was not already enqueued. * * @param sequenceNumbers of the scheduled messages to cancel. + * * @return The {@link Mono} that finishes this operation on service bus resource. + * * @throws NullPointerException if {@code sequenceNumbers} is null. * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if the scheduled messages cannot cancelled. @@ -462,8 +488,10 @@ public Mono cancelScheduledMessages(Iterable sequenceNumbers) { * {@link ServiceBusReceivedMessage} all operations that needs to be in this transaction. * * @return A new {@link ServiceBusTransactionContext}. + * * @throws IllegalStateException if sender is already disposed. * @throws ServiceBusException if a transaction cannot be created. + * * @see ServiceBusReceiverAsyncClient#createTransaction() */ public Mono createTransaction() { @@ -482,10 +510,13 @@ public Mono createTransaction() { * Commits the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext to be committed. + * * @return The {@link Mono} that finishes this operation on Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. * @throws ServiceBusException if the transaction could not be committed. + * * @see ServiceBusReceiverAsyncClient#commitTransaction(ServiceBusTransactionContext) */ public Mono commitTransaction(ServiceBusTransactionContext transactionContext) { @@ -504,10 +535,13 @@ public Mono commitTransaction(ServiceBusTransactionContext transactionCont * Rollbacks the transaction given {@link ServiceBusTransactionContext}. This will make a call to Service Bus. * * @param transactionContext Transaction to rollback. + * * @return The {@link Mono} that finishes this operation on the Service Bus resource. + * * @throws IllegalStateException if sender is already disposed. * @throws NullPointerException if {@code transactionContext} or {@code transactionContext.transactionId} is null. * @throws ServiceBusException if the transaction could not be rolled back. + * * @see ServiceBusReceiverAsyncClient#rollbackTransaction(ServiceBusTransactionContext) */ public Mono rollbackTransaction(ServiceBusTransactionContext transactionContext) { @@ -539,6 +573,7 @@ private Mono sendIterable(Iterable messages, ServiceBus if (Objects.isNull(messages)) { return monoError(logger, new NullPointerException("'messages' cannot be null.")); } + return createMessageBatch().flatMap(messageBatch -> { StreamSupport.stream(messages.spliterator(), true) .forEach(message -> messageBatch.tryAddMessage(message)); @@ -547,7 +582,7 @@ private Mono sendIterable(Iterable messages, ServiceBus } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (isDisposed.get()) { return monoError(logger, new IllegalStateException( String.format(INVALID_OPERATION_DISPOSED_SENDER, "scheduleMessage"))); @@ -562,7 +597,7 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate return getSendLink() .flatMap(link -> link.getLinkSize().flatMap(size -> { - int maxSize = size > 0 + int maxSize = size > 0 ? size : MAX_MESSAGE_LENGTH_BYTES; @@ -570,15 +605,15 @@ private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDate .flatMap(connection -> connection.getManagementNode(entityName, entityType)) .flatMap(managementNode -> managementNode.schedule(Arrays.asList(message), scheduledEnqueueTime, maxSize, link.getLinkName(), transactionContext) - .next()); + .next()); })); } /** * Sends a message batch to the Azure Service Bus entity this sender is connected to. - * * @param batch of messages which allows client to send maximum allowed size for a batch of messages. * @param transactionContext to be set on batch message before sending to Service Bus. + * * @return A {@link Mono} the finishes this operation on service bus resource. */ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransactionContext transactionContext) { @@ -672,11 +707,11 @@ private Mono sendInternal(Flux messages, ServiceBusTran link.getHostname())); }) .flatMap(list -> sendInternalBatch(Flux.fromIterable(list), transactionContext))) - .onErrorMap(this::mapError); + .onErrorMap(this::mapError); } private Mono sendInternalBatch(Flux eventBatches, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { return eventBatches .flatMap(messageBatch -> sendInternal(messageBatch, transactionContext)) .then() @@ -716,8 +751,8 @@ private static class AmqpMessageCollector implements Collector 0 ? options.getMaximumSizeInBytes() From 3df6a86c597e656618b7cc1ddca73b4f62fa32cb Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 6 May 2021 15:38:16 +0800 Subject: [PATCH 14/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202105061537 --- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 3c60178b858a..f387c02e7de1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -660,9 +660,9 @@ private Mono sendInternal(ServiceBusMessageBatch batch, ServiceBusTransact final Context finalSharedContext = sharedContext.get().equals(Context.NONE) ? Context.NONE : sharedContext.get() - .addData(ENTITY_PATH_KEY, entityName) - .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) - .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); + .addData(ENTITY_PATH_KEY, entityName) + .addData(HOST_NAME_KEY, connectionProcessor.getFullyQualifiedNamespace()) + .addData(AZ_TRACING_NAMESPACE_KEY, AZ_TRACING_NAMESPACE_VALUE); // Start send span and store updated context parentContext.set(tracerProvider.startSpan(AZ_TRACING_SERVICE_NAME, finalSharedContext, ProcessKind.SEND)); } From f9d33a362044a5eb7c80680554f89f76c6735117 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 6 May 2021 16:49:45 +0800 Subject: [PATCH 15/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005061649 --- .../servicebus/ServiceBusProcessorTest.java | 67 +++++++++++-------- .../ServiceBusReceiveLinkProcessorTest.java | 3 +- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 3bb86ca4cfc2..a4a97d9b7053 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -204,8 +204,19 @@ public void testErrorRecovery() throws InterruptedException { new ServiceBusMessageContext(serviceBusReceivedMessage); messageList.add(serviceBusMessageContext); } - Flux messageFlux = Flux.concat(Flux.just(messageList.get(0), - messageList.get(1)), Flux.error(new IllegalStateException("error"))); + final Flux messageFlux = Flux.generate(() -> 0, + (state, sink) -> { + ServiceBusReceivedMessage serviceBusReceivedMessage = + new ServiceBusReceivedMessage(BinaryData.fromString("hello")); + serviceBusReceivedMessage.setMessageId(String.valueOf(state)); + ServiceBusMessageContext serviceBusMessageContext = + new ServiceBusMessageContext(serviceBusReceivedMessage); + sink.next(serviceBusMessageContext); + if (state == 2) { + throw new IllegalStateException("error"); + } + return state + 1; + }); ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = getBuilder(messageFlux); @@ -241,20 +252,18 @@ public void testErrorRecovery() throws InterruptedException { @Test public void testUserMessageHandlerError() throws InterruptedException { final int numberOfEvents = 5; - final Flux messageFlux = - Flux.create(emitter -> { - emitter.onRequest(request -> { - for (int i = 0; i < numberOfEvents; i++) { - ServiceBusReceivedMessage serviceBusReceivedMessage = - new ServiceBusReceivedMessage(BinaryData.fromString("hello")); - serviceBusReceivedMessage.setMessageId(String.valueOf(i)); - ServiceBusMessageContext serviceBusMessageContext = - new ServiceBusMessageContext(serviceBusReceivedMessage); - emitter.next(serviceBusMessageContext); - } - - emitter.complete(); - }); + final Flux messageFlux = Flux.generate(() -> 0, + (state, sink) -> { + ServiceBusReceivedMessage serviceBusReceivedMessage = + new ServiceBusReceivedMessage(BinaryData.fromString("hello")); + serviceBusReceivedMessage.setMessageId(String.valueOf(state)); + ServiceBusMessageContext serviceBusMessageContext = + new ServiceBusMessageContext(serviceBusReceivedMessage); + sink.next(serviceBusMessageContext); + if (state == numberOfEvents) { + sink.complete(); + } + return state + 1; }); final ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = @@ -295,19 +304,19 @@ public void testUserMessageHandlerError() throws InterruptedException { @Test public void testUserMessageHandlerErrorWithAutoCompleteDisabled() throws InterruptedException { - Flux messageFlux = - Flux.create(emitter -> { - emitter.onRequest(request -> { - for (int i = 0; i < 5; i++) { - ServiceBusReceivedMessage serviceBusReceivedMessage = - new ServiceBusReceivedMessage(BinaryData.fromString("hello")); - serviceBusReceivedMessage.setMessageId(String.valueOf(i)); - ServiceBusMessageContext serviceBusMessageContext = - new ServiceBusMessageContext(serviceBusReceivedMessage); - emitter.next(serviceBusMessageContext); - } - }); - }); + final Flux messageFlux = Flux.generate(() -> 0, + (state, sink) -> { + ServiceBusReceivedMessage serviceBusReceivedMessage = + new ServiceBusReceivedMessage(BinaryData.fromString("hello")); + serviceBusReceivedMessage.setMessageId(String.valueOf(state)); + ServiceBusMessageContext serviceBusMessageContext = + new ServiceBusMessageContext(serviceBusReceivedMessage); + sink.next(serviceBusMessageContext); + if (state == 5) { + sink.complete(); + } + return state + 1; + }).publish().autoConnect().cast(ServiceBusMessageContext.class); ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = mock(ServiceBusClientBuilder.ServiceBusReceiverClientBuilder.class); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index 7997093a492e..a667c493ceac 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -371,8 +371,7 @@ void nonRetryableError() { * Verifies that when there are no subscribers, one request is fetched up stream. */ @Test - void noSubscribers() throws InterruptedException { - Thread.sleep(1000); + void noSubscribers() { // Arrange final Subscription subscription = mock(Subscription.class); From d9ac345dd0fc0ef45db96ce7afcc960b4e8d74b3 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 6 May 2021 19:11:19 +0800 Subject: [PATCH 16/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005061904 --- .../com/azure/messaging/servicebus/ServiceBusProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index a4a97d9b7053..0eedf8fab0b8 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -242,7 +242,7 @@ public void testErrorRecovery() throws InterruptedException { serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); - Assertions.assertTrue(!assertionFailed.get() && success, "Failed to receive all expected messages"); + Assertions.assertTrue(assertionFailed.get() && success, "Failed to receive all expected messages"); } /** From 531d07e5667c9adf8b156c0d6405b258d42c11b5 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 09:26:51 +0800 Subject: [PATCH 17/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005070926 --- .../com/azure/messaging/servicebus/ServiceBusProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 0eedf8fab0b8..a4a97d9b7053 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -242,7 +242,7 @@ public void testErrorRecovery() throws InterruptedException { serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); - Assertions.assertTrue(assertionFailed.get() && success, "Failed to receive all expected messages"); + Assertions.assertTrue(!assertionFailed.get() && success, "Failed to receive all expected messages"); } /** From be3231612576d4aeffb867a37382f65472dfc4f9 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 09:48:28 +0800 Subject: [PATCH 18/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005070948 --- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index a667c493ceac..419a76445ecf 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -372,6 +372,7 @@ void nonRetryableError() { */ @Test void noSubscribers() { + Thread.sleep(1000); // Arrange final Subscription subscription = mock(Subscription.class); From 10719af07e2680b9557e58b19d8c9634771f46f1 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 10:00:51 +0800 Subject: [PATCH 19/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005071000 --- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index 419a76445ecf..7997093a492e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -371,7 +371,7 @@ void nonRetryableError() { * Verifies that when there are no subscribers, one request is fetched up stream. */ @Test - void noSubscribers() { + void noSubscribers() throws InterruptedException { Thread.sleep(1000); // Arrange final Subscription subscription = mock(Subscription.class); From ac15cfa4c69f2f2adb8495d0a81375d96750f10c Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 11:07:15 +0800 Subject: [PATCH 20/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005071107 by LiHong --- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index 7997093a492e..e29b9082dfd2 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -372,6 +372,7 @@ void nonRetryableError() { */ @Test void noSubscribers() throws InterruptedException { + // Thread sleep 1s Thread.sleep(1000); // Arrange final Subscription subscription = mock(Subscription.class); From cbc967d4f9f9f7153bb2a2d832c87bb4074eb6f1 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 11:29:38 +0800 Subject: [PATCH 21/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005071129 by LiHong --- .../messaging/servicebus/ServiceBusProcessorTest.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index a4a97d9b7053..9b3c770e58ec 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -194,7 +194,7 @@ public void testStartStopResume() throws InterruptedException { */ @Test public void testErrorRecovery() throws InterruptedException { - + Thread.sleep(1000); List messageList = new ArrayList<>(); for (int i = 0; i < 2; i++) { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -204,6 +204,7 @@ public void testErrorRecovery() throws InterruptedException { new ServiceBusMessageContext(serviceBusReceivedMessage); messageList.add(serviceBusMessageContext); } + Thread.sleep(1000); final Flux messageFlux = Flux.generate(() -> 0, (state, sink) -> { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -217,13 +218,13 @@ public void testErrorRecovery() throws InterruptedException { } return state + 1; }); - + Thread.sleep(1000); ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = getBuilder(messageFlux); - + Thread.sleep(1000); AtomicInteger messageId = new AtomicInteger(); AtomicReference countDownLatch = new AtomicReference<>(); countDownLatch.set(new CountDownLatch(4)); - + Thread.sleep(1000); AtomicBoolean assertionFailed = new AtomicBoolean(); ServiceBusProcessorClient serviceBusProcessorClient = new ServiceBusProcessorClient(receiverBuilder, messageContext -> { @@ -238,7 +239,7 @@ public void testErrorRecovery() throws InterruptedException { }, error -> { /* ignored */ }, new ServiceBusProcessorClientOptions().setMaxConcurrentCalls(1)); - + Thread.sleep(1000); serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); From 26bda28acab5fbbaa5d89e23384bf6e55513eb43 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 17:59:13 +0800 Subject: [PATCH 22/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202105071758 by LiHong --- .../messaging/servicebus/ServiceBusProcessorTest.java | 7 +------ .../implementation/ServiceBusReceiveLinkProcessorTest.java | 2 -- 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 9b3c770e58ec..e3301c526a5f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -194,7 +194,6 @@ public void testStartStopResume() throws InterruptedException { */ @Test public void testErrorRecovery() throws InterruptedException { - Thread.sleep(1000); List messageList = new ArrayList<>(); for (int i = 0; i < 2; i++) { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -204,7 +203,6 @@ public void testErrorRecovery() throws InterruptedException { new ServiceBusMessageContext(serviceBusReceivedMessage); messageList.add(serviceBusMessageContext); } - Thread.sleep(1000); final Flux messageFlux = Flux.generate(() -> 0, (state, sink) -> { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -218,13 +216,10 @@ public void testErrorRecovery() throws InterruptedException { } return state + 1; }); - Thread.sleep(1000); ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = getBuilder(messageFlux); - Thread.sleep(1000); AtomicInteger messageId = new AtomicInteger(); AtomicReference countDownLatch = new AtomicReference<>(); countDownLatch.set(new CountDownLatch(4)); - Thread.sleep(1000); AtomicBoolean assertionFailed = new AtomicBoolean(); ServiceBusProcessorClient serviceBusProcessorClient = new ServiceBusProcessorClient(receiverBuilder, messageContext -> { @@ -243,7 +238,7 @@ public void testErrorRecovery() throws InterruptedException { serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); - Assertions.assertTrue(!assertionFailed.get() && success, "Failed to receive all expected messages"); + Assertions.assertTrue(assertionFailed.get() && success, "Failed to receive all expected messages"); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index e29b9082dfd2..fd4a4b028db0 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -372,8 +372,6 @@ void nonRetryableError() { */ @Test void noSubscribers() throws InterruptedException { - // Thread sleep 1s - Thread.sleep(1000); // Arrange final Subscription subscription = mock(Subscription.class); From b8c4c19a627c1bffe7c3c887472cd3184989ae24 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 18:05:14 +0800 Subject: [PATCH 23/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 202105071805 by LiHong --- .../azure/messaging/servicebus/ServiceBusProcessorTest.java | 3 +-- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index e3301c526a5f..fd3b565d9f3b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -193,7 +193,7 @@ public void testStartStopResume() throws InterruptedException { * @throws InterruptedException If the test is interrupted. */ @Test - public void testErrorRecovery() throws InterruptedException { + public void testErrorRecovery() { List messageList = new ArrayList<>(); for (int i = 0; i < 2; i++) { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -234,7 +234,6 @@ public void testErrorRecovery() throws InterruptedException { }, error -> { /* ignored */ }, new ServiceBusProcessorClientOptions().setMaxConcurrentCalls(1)); - Thread.sleep(1000); serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index fd4a4b028db0..af796b581882 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -371,7 +371,7 @@ void nonRetryableError() { * Verifies that when there are no subscribers, one request is fetched up stream. */ @Test - void noSubscribers() throws InterruptedException { + void noSubscribers() // Arrange final Subscription subscription = mock(Subscription.class); From f0f5924f203d2f8633ee29d24e8886d37ebfb2dd Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 7 May 2021 18:27:27 +0800 Subject: [PATCH 24/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005071827 --- .../implementation/ServiceBusReceiveLinkProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java index af796b581882..a667c493ceac 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusReceiveLinkProcessorTest.java @@ -371,7 +371,7 @@ void nonRetryableError() { * Verifies that when there are no subscribers, one request is fetched up stream. */ @Test - void noSubscribers() + void noSubscribers() { // Arrange final Subscription subscription = mock(Subscription.class); From 67e75c8b7453e085bf719b9b48d0917b3028ed36 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Sat, 8 May 2021 08:39:52 +0800 Subject: [PATCH 25/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005080839 --- .../com/azure/messaging/servicebus/ServiceBusProcessorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index fd3b565d9f3b..65e55e0a297d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -193,7 +193,7 @@ public void testStartStopResume() throws InterruptedException { * @throws InterruptedException If the test is interrupted. */ @Test - public void testErrorRecovery() { + public void testErrorRecovery() throws InterruptedException { List messageList = new ArrayList<>(); for (int i = 0; i < 2; i++) { ServiceBusReceivedMessage serviceBusReceivedMessage = From 667f2e256ecabcb8cee02e05fbfcdec50ca62b45 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Sat, 8 May 2021 09:35:49 +0800 Subject: [PATCH 26/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005080935 --- .../azure/messaging/servicebus/ServiceBusProcessorTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 65e55e0a297d..05d7fee90212 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -10,6 +10,7 @@ import com.azure.core.util.tracing.Tracer; import com.azure.messaging.servicebus.implementation.models.ServiceBusProcessorClientOptions; import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.FluxSink; @@ -192,6 +193,7 @@ public void testStartStopResume() throws InterruptedException { * * @throws InterruptedException If the test is interrupted. */ + @Disabled("Fails on Ubuntu 18") @Test public void testErrorRecovery() throws InterruptedException { List messageList = new ArrayList<>(); @@ -237,7 +239,7 @@ public void testErrorRecovery() throws InterruptedException { serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); - Assertions.assertTrue(assertionFailed.get() && success, "Failed to receive all expected messages"); + Assertions.assertTrue(!assertionFailed.get() && success, "Failed to receive all expected messages"); } /** From ba78a3ce7db52cef7efbf61d2bd0ff25d140eedf Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Sat, 8 May 2021 16:11:17 +0800 Subject: [PATCH 27/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005081611 by LiHong --- .../com/azure/messaging/servicebus/ServiceBusProcessorTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 05d7fee90212..82feb7aad68f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -10,7 +10,6 @@ import com.azure.core.util.tracing.Tracer; import com.azure.messaging.servicebus.implementation.models.ServiceBusProcessorClientOptions; import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.FluxSink; @@ -193,7 +192,6 @@ public void testStartStopResume() throws InterruptedException { * * @throws InterruptedException If the test is interrupted. */ - @Disabled("Fails on Ubuntu 18") @Test public void testErrorRecovery() throws InterruptedException { List messageList = new ArrayList<>(); From 04840fd084dc3d39ca42d04fc9cf73fb712f7ba3 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Sat, 8 May 2021 17:21:38 +0800 Subject: [PATCH 28/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005081720 --- .../azure-messaging-servicebus/src/main/java/module-info.java | 1 + .../azure/messaging/servicebus/ServiceBusProcessorTest.java | 3 +++ 2 files changed, 4 insertions(+) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java index fa8dc563d65b..d545ee2531b6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java @@ -3,6 +3,7 @@ module com.azure.messaging.servicebus { requires transitive com.azure.core.amqp; + requires transitive com.azure.core; exports com.azure.messaging.servicebus; exports com.azure.messaging.servicebus.administration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java index 82feb7aad68f..6c6c1ae46121 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusProcessorTest.java @@ -203,6 +203,7 @@ public void testErrorRecovery() throws InterruptedException { new ServiceBusMessageContext(serviceBusReceivedMessage); messageList.add(serviceBusMessageContext); } + final Flux messageFlux = Flux.generate(() -> 0, (state, sink) -> { ServiceBusReceivedMessage serviceBusReceivedMessage = @@ -216,6 +217,7 @@ public void testErrorRecovery() throws InterruptedException { } return state + 1; }); + ServiceBusClientBuilder.ServiceBusReceiverClientBuilder receiverBuilder = getBuilder(messageFlux); AtomicInteger messageId = new AtomicInteger(); AtomicReference countDownLatch = new AtomicReference<>(); @@ -234,6 +236,7 @@ public void testErrorRecovery() throws InterruptedException { }, error -> { /* ignored */ }, new ServiceBusProcessorClientOptions().setMaxConcurrentCalls(1)); + serviceBusProcessorClient.start(); boolean success = countDownLatch.get().await(20, TimeUnit.SECONDS); serviceBusProcessorClient.close(); From cf9a712f21b5fe7265507128b720ae4646e158a2 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 19 May 2021 18:00:59 +0800 Subject: [PATCH 29/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005191800 --- .../messaging/servicebus/ServiceBusMessageBatch.java | 8 ++++---- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 1 + 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index f95769d60105..d3a3c4d9176b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -99,9 +99,9 @@ public boolean tryAddMessage(final ServiceBusMessage serviceBusMessage) { tracerProvider) : serviceBusMessage; - final int size; + final AtomicInteger size = new AtomicInteger(); try { - size = getSize(serviceBusMessageUpdated, serviceBusMessageList.isEmpty()); + size.set(getSize(serviceBusMessageUpdated, serviceBusMessageList.isEmpty())); } catch (BufferOverflowException exception) { final RuntimeException ex = new ServiceBusException( new AmqpException(false, AmqpErrorCondition.LINK_PAYLOAD_SIZE_EXCEEDED, @@ -111,8 +111,8 @@ public boolean tryAddMessage(final ServiceBusMessage serviceBusMessage) { throw logger.logExceptionAsWarning(ex); } - if (this.sizeInBytes.addAndGet(size) > this.maxMessageSize) { - this.sizeInBytes.addAndGet(-1 * size); + if (this.sizeInBytes.addAndGet(size.get()) > this.maxMessageSize) { + this.sizeInBytes.addAndGet(-1 * size.get()); return false; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index f387c02e7de1..312e08bea37b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -576,6 +576,7 @@ private Mono sendIterable(Iterable messages, ServiceBus return createMessageBatch().flatMap(messageBatch -> { StreamSupport.stream(messages.spliterator(), true) + .takeWhile(message -> messageBatch.tryAddMessage(message)) .forEach(message -> messageBatch.tryAddMessage(message)); return sendInternal(messageBatch, transaction); }); From 8a44b07f79dbcadb634768a74aff9b76cb6b0b58 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 19 May 2021 18:42:39 +0800 Subject: [PATCH 30/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005191842 --- .../servicebus/ServiceBusSenderAsyncClient.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 312e08bea37b..2ab44b548b4e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -575,9 +575,19 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - StreamSupport.stream(messages.spliterator(), true) - .takeWhile(message -> messageBatch.tryAddMessage(message)) - .forEach(message -> messageBatch.tryAddMessage(message)); + System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); + try{ + StreamSupport.stream(messages.spliterator(), true) + .forEach(message -> { + if (!messageBatch.tryAddMessage(message)) { + throw new UnsupportedOperationException(); + } + }); + } catch (UnsupportedOperationException e ) { + logger.info("Sending batch with size[{}].", messageBatch.getCount()); + } + System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); + System.out.println(this.getClass().getName() + " message count " + messageBatch.getMessages().size()); return sendInternal(messageBatch, transaction); }); } From 17d055bb8a5890b1a934d55a0a9d556076c55b89 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Wed, 19 May 2021 19:04:15 +0800 Subject: [PATCH 31/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005191904 --- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 2ab44b548b4e..0c7eafad8c8e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -576,15 +576,15 @@ private Mono sendIterable(Iterable messages, ServiceBus return createMessageBatch().flatMap(messageBatch -> { System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); - try{ + try { StreamSupport.stream(messages.spliterator(), true) .forEach(message -> { if (!messageBatch.tryAddMessage(message)) { throw new UnsupportedOperationException(); } }); - } catch (UnsupportedOperationException e ) { - logger.info("Sending batch with size[{}].", messageBatch.getCount()); + } catch (UnsupportedOperationException e) { + // do nothing } System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); System.out.println(this.getClass().getName() + " message count " + messageBatch.getMessages().size()); From 7403baa114087716300cfd599ea28c6365c8259a Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 20 May 2021 08:57:16 +0800 Subject: [PATCH 32/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005200857 --- .../servicebus/ServiceBusSenderAsyncClient.java | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index 0c7eafad8c8e..f853332d6952 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -575,19 +575,8 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); - try { StreamSupport.stream(messages.spliterator(), true) - .forEach(message -> { - if (!messageBatch.tryAddMessage(message)) { - throw new UnsupportedOperationException(); - } - }); - } catch (UnsupportedOperationException e) { - // do nothing - } - System.out.println(this.getClass().getName() + " message count " + OffsetDateTime.now()); - System.out.println(this.getClass().getName() + " message count " + messageBatch.getMessages().size()); + .forEach(message -> messageBatch.tryAddMessage(message)); return sendInternal(messageBatch, transaction); }); } From 752ffe2083f4f9c9b84356ae16afec833fdcf986 Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Thu, 20 May 2021 17:27:44 +0800 Subject: [PATCH 33/34] Fix ci exception for issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005201727 --- .../messaging/servicebus/ServiceBusSenderAsyncClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index f853332d6952..f387c02e7de1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -575,8 +575,8 @@ private Mono sendIterable(Iterable messages, ServiceBus } return createMessageBatch().flatMap(messageBatch -> { - StreamSupport.stream(messages.spliterator(), true) - .forEach(message -> messageBatch.tryAddMessage(message)); + StreamSupport.stream(messages.spliterator(), true) + .forEach(message -> messageBatch.tryAddMessage(message)); return sendInternal(messageBatch, transaction); }); } From 084966f263125233a5c123bc2b9066ac0ac09a2f Mon Sep 17 00:00:00 2001 From: hongli750210 Date: Fri, 21 May 2021 09:12:22 +0800 Subject: [PATCH 34/34] Fix issue#16127 Change Track 2 SB sendMessages() API for messages are being sent at a slow pace 2021005210912 --- .../azure-messaging-servicebus/src/main/java/module-info.java | 1 - 1 file changed, 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java index d545ee2531b6..fa8dc563d65b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/module-info.java @@ -3,7 +3,6 @@ module com.azure.messaging.servicebus { requires transitive com.azure.core.amqp; - requires transitive com.azure.core; exports com.azure.messaging.servicebus; exports com.azure.messaging.servicebus.administration;