Esempio n. 1
0
        /// <summary>
        /// Create a reader.
        /// </summary>
        public IReader <TMessage> CreateReader <TMessage>(ReaderOptions <TMessage> options)
        {
            ThrowIfDisposed();

            var correlationId = Guid.NewGuid();
            var subscription  = $"Reader-{correlationId:N}";
            var subscribe     = new CommandSubscribe
            {
                ConsumerName   = options.ReaderName ?? subscription,
                Durable        = false,
                ReadCompacted  = options.ReadCompacted,
                StartMessageId = options.StartMessageId.ToMessageIdData(),
                Subscription   = subscription,
                Topic          = options.Topic
            };
            var messagePrefetchCount  = options.MessagePrefetchCount;
            var messageFactory        = new MessageFactory <TMessage>(options.Schema);
            var batchHandler          = new BatchHandler <TMessage>(false, messageFactory);
            var decompressorFactories = CompressionFactories.DecompressorFactories();
            var factory        = new ConsumerChannelFactory <TMessage>(correlationId, _processManager, _connectionPool, subscribe, messagePrefetchCount, batchHandler, messageFactory, decompressorFactories);
            var stateManager   = new StateManager <ReaderState>(ReaderState.Disconnected, ReaderState.Closed, ReaderState.ReachedEndOfTopic, ReaderState.Faulted);
            var initialChannel = new NotReadyChannel <TMessage>();
            var executor       = new Executor(correlationId, _processManager, _exceptionHandler);
            var reader         = new Reader <TMessage>(correlationId, ServiceUrl, options.Topic, _processManager, initialChannel, executor, stateManager, factory);

            if (options.StateChangedHandler is not null)
            {
                _ = StateMonitor.MonitorReader(reader, options.StateChangedHandler);
            }
            var process = new ReaderProcess(correlationId, stateManager, reader);

            _processManager.Add(process);
            process.Start();
            return(reader);
        }
Esempio n. 2
0
        /// <summary>
        /// Create a consumer.
        /// </summary>
        public IConsumer <TMessage> CreateConsumer <TMessage>(ConsumerOptions <TMessage> options)
        {
            ThrowIfDisposed();

            var correlationId = Guid.NewGuid();
            var executor      = new Executor(correlationId, _processManager, _exceptionHandler);
            var subscribe     = new CommandSubscribe
            {
                ConsumerName    = options.ConsumerName,
                InitialPosition = (CommandSubscribe.InitialPositionType)options.InitialPosition,
                PriorityLevel   = options.PriorityLevel,
                ReadCompacted   = options.ReadCompacted,
                Subscription    = options.SubscriptionName,
                Topic           = options.Topic,
                Type            = (CommandSubscribe.SubType)options.SubscriptionType
            };
            var messagePrefetchCount  = options.MessagePrefetchCount;
            var messageFactory        = new MessageFactory <TMessage>(options.Schema);
            var batchHandler          = new BatchHandler <TMessage>(true, messageFactory);
            var decompressorFactories = CompressionFactories.DecompressorFactories();
            var factory        = new ConsumerChannelFactory <TMessage>(correlationId, _processManager, _connectionPool, subscribe, messagePrefetchCount, batchHandler, messageFactory, decompressorFactories);
            var stateManager   = new StateManager <ConsumerState>(ConsumerState.Disconnected, ConsumerState.Closed, ConsumerState.ReachedEndOfTopic, ConsumerState.Faulted);
            var initialChannel = new NotReadyChannel <TMessage>();
            var consumer       = new Consumer <TMessage>(correlationId, ServiceUrl, options.SubscriptionName, options.Topic, _processManager, initialChannel, executor, stateManager, factory);

            if (options.StateChangedHandler is not null)
            {
                _ = StateMonitor.MonitorConsumer(consumer, options.StateChangedHandler);
            }
            var process = new ConsumerProcess(correlationId, stateManager, consumer, options.SubscriptionType == SubscriptionType.Failover);

            _processManager.Add(process);
            process.Start();
            return(consumer);
        }
Esempio n. 3
0
        /// <summary>
        /// Create a producer.
        /// </summary>
        public IProducer <TMessage> CreateProducer <TMessage>(ProducerOptions <TMessage> options)
        {
            ThrowIfDisposed();

            ICompressorFactory?compressorFactory = null;

            if (options.CompressionType != CompressionType.None)
            {
                var compressionType = (Internal.PulsarApi.CompressionType)options.CompressionType;
                compressorFactory = CompressionFactories.CompressorFactories().SingleOrDefault(f => f.CompressionType == compressionType);
                if (compressorFactory is null)
                {
                    throw new CompressionException($"Support for {compressionType} compression was not found");
                }
            }

            var correlationId     = Guid.NewGuid();
            var executor          = new Executor(correlationId, _processManager, _exceptionHandler);
            var topic             = options.Topic;
            var producerName      = options.ProducerName;
            var schema            = options.Schema;
            var initialSequenceId = options.InitialSequenceId;

            var factory        = new ProducerChannelFactory(correlationId, _processManager, _connectionPool, topic, producerName, schema.SchemaInfo, compressorFactory);
            var stateManager   = new StateManager <ProducerState>(ProducerState.Disconnected, ProducerState.Closed, ProducerState.Faulted);
            var initialChannel = new NotReadyChannel <TMessage>();
            var producer       = new Producer <TMessage>(correlationId, ServiceUrl, topic, initialSequenceId, _processManager, initialChannel, executor, stateManager, factory, schema);

            if (options.StateChangedHandler is not null)
            {
                _ = StateMonitor.MonitorProducer(producer, options.StateChangedHandler);
            }
            var process = new ProducerProcess(correlationId, stateManager, producer);

            _processManager.Add(process);
            process.Start();
            return(producer);
        }