public async Task <IAnonymousProducer> CreateAnonymousProducerAsync(AnonymousProducerConfiguration configuration, CancellationToken cancellationToken = default)
        {
            var autoRecoveringAnonymousProducer = new AutoRecoveringAnonymousProducer(_loggerFactory, configuration);

            await PrepareRecoverable(autoRecoveringAnonymousProducer, cancellationToken);

            return(autoRecoveringAnonymousProducer);
        }
        /// <summary>
        /// Adds the <see cref="IAnonymousProducer"/> and configures a binding between the <typeparam name="TProducer" /> and named <see cref="IProducer"/> instance.
        /// </summary>
        /// <param name="builder">The <see cref="IActiveMqBuilder"/>.</param>
        /// <param name="producerOptions">The <see cref="IAnonymousProducer"/> configuration.</param>
        /// <param name="producerLifetime">The lifetime with which to register the <typeparam name="TProducer" /> in the container.</param>
        /// <typeparam name="TProducer">The type of the typed producer. The type specified will be registered in the service collection as
        /// a transient service by default.</typeparam>
        /// <returns>The <see cref="IActiveMqBuilder"/> that can be used to configure ActiveMQ Artemis Client.</returns>
        public static IActiveMqBuilder AddAnonymousProducer <TProducer>(this IActiveMqBuilder builder, ProducerOptions producerOptions, ServiceLifetime producerLifetime = ServiceLifetime.Transient) where TProducer : class
        {
            var anonymousProducerConfiguration = new AnonymousProducerConfiguration
            {
                MessagePriority        = producerOptions.MessagePriority,
                MessageDurabilityMode  = producerOptions.MessageDurabilityMode,
                MessageIdPolicy        = producerOptions.MessageIdPolicy,
                SetMessageCreationTime = producerOptions.SetMessageCreationTime
            };

            return(builder.AddAnonymousProducer <TProducer>(anonymousProducerConfiguration, producerLifetime));
        }
        public async Task <IAnonymousProducer> CreateAsync(AnonymousProducerConfiguration configuration, CancellationToken cancellationToken)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            cancellationToken.ThrowIfCancellationRequested();
            cancellationToken.Register(() => _tcs.TrySetCanceled());

            var target = new Target
            {
                Address = null,
            };
            var senderLink = new SenderLink(_session, Guid.NewGuid().ToString(), target, OnAttached);

            senderLink.AddClosedCallback(OnClosed);
            await _tcs.Task.ConfigureAwait(false);

            var producer = new AnonymousProducer(_loggerFactory, senderLink, _transactionsManager, configuration);

            senderLink.Closed -= OnClosed;
            return(producer);
        }
 public AutoRecoveringAnonymousProducer(ILoggerFactory loggerFactory, AnonymousProducerConfiguration configuration) : base(loggerFactory)
 {
     _configuration = configuration;
 }
        private static IActiveMqBuilder AddAnonymousProducer <TProducer>(this IActiveMqBuilder builder, AnonymousProducerConfiguration producerConfiguration, ServiceLifetime producerLifetime) where TProducer : class
        {
            if (builder.Services.Any(x => x.ServiceType == typeof(TProducer)))
            {
                var message =
                    $"There has already been registered Anonymous Producer with the type '{typeof(TProducer).FullName}'. " +
                    "Typed Anonymous Producer must be unique. " +
                    "Consider using inheritance to create multiple unique types with the same API surface.";
                throw new InvalidOperationException(message);
            }

            builder.Services.AddSingleton(provider =>
            {
                var sendObservable = provider.GetServices <SendObservable>().Single(x => x.Name == builder.Name);
                var logger         = provider.GetService <ILogger <TypedActiveMqAnonymousProducer <TProducer> > >();
                return(new TypedActiveMqAnonymousProducer <TProducer>(logger, async token =>
                {
                    var connection = await provider.GetConnection(builder.Name, token).ConfigureAwait(false);
                    return await connection.CreateAnonymousProducerAsync(producerConfiguration, token).ConfigureAwait(false);
                }, sendObservable));
            });
            builder.Services.AddSingleton <IActiveMqProducer>(provider => provider.GetRequiredService <TypedActiveMqAnonymousProducer <TProducer> >());
            builder.Services.Add(ServiceDescriptor.Describe(typeof(TProducer),
                                                            provider => ActivatorUtilities.CreateInstance <TProducer>(provider, provider.GetRequiredService <TypedActiveMqAnonymousProducer <TProducer> >()),
                                                            producerLifetime));
            return(builder);
        }
        /// <summary>
        /// Adds the <see cref="IAnonymousProducer"/> and configures a binding between the <typeparam name="TProducer" /> and named <see cref="IProducer"/> instance.
        /// </summary>
        /// <param name="builder">The <see cref="IActiveMqBuilder"/>.</param>
        /// <param name="producerLifetime">The lifetime with which to register the <typeparam name="TProducer" /> in the container.</param>
        /// <typeparam name="TProducer">The type of the typed producer. The type specified will be registered in the service collection as
        /// a transient service by default.</typeparam>
        /// <returns>The <see cref="IActiveMqBuilder"/> that can be used to configure ActiveMQ Artemis Client.</returns>
        public static IActiveMqBuilder AddAnonymousProducer <TProducer>(this IActiveMqBuilder builder, ServiceLifetime producerLifetime = ServiceLifetime.Transient) where TProducer : class
        {
            var anonymousProducerConfiguration = new AnonymousProducerConfiguration();

            return(builder.AddAnonymousProducer <TProducer>(anonymousProducerConfiguration, producerLifetime));
        }