/// <summary> /// 监听 /// </summary> /// <param name="subscribers"></param> /// <param name="action"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public void Listen(KafkaSubscriber[] subscribers, Action <RecieveResult> action = null, CancellationToken cancellationToken = default) { ListenResult result = new ListenResult(); cancellationToken.Register(() => { result.Stop(); }); using (var consumer = CreateConsumer(result, subscribers)) { while (!result.Stoped) { InternalListen(consumer, result.Token, action); } } }
/// <summary> /// 异步监听 /// </summary> /// <param name="subscribers"></param> /// <param name="action"></param> /// <returns></returns> public async Task <ListenResult> ListenAsync(KafkaSubscriber[] subscribers, Action <RecieveResult> action = null) { ListenResult result = new ListenResult(); new Task(() => { using (var consumer = CreateConsumer(result, subscribers)) { while (!result.Stoped) { InternalListen(consumer, result.Token, action); } } }).Start(); return(await Task.FromResult(result)); }
/// <summary> /// 创建一个消费者 /// </summary> /// <param name="listenResult"></param> /// <param name="subscribers"></param> /// <returns></returns> private IConsumer <string, object> CreateConsumer(ListenResult listenResult, params KafkaSubscriber[] subscribers) { if (disposed) { throw new ObjectDisposedException(nameof(KafkaConsumer)); } CheckSubscribers(subscribers); CreateConsumerBuilder(); var consumer = builder.Build(); listenResult.Token.Register(() => { consumer.Dispose(); }); SetSubscribers(consumer, subscribers); consumers.Add(consumer); return(consumer); }