/// <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); }
/// <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); }
/// <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); }